求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
企业开源域名服务安全防护策略及实战
 
火龙果软件    发布于 2013-8-22,作者 李 洋
 

简介: 在现代企业中,DNS(域名服务系统)是一个非常关键的互联网基础设施,高效、安全地管理及使用 DNS 服务器是系统和网络管理员的一个非常重要的任务。本文将详细介绍企业如何保证开源域名服务的安全防护策略和实战,为实际工作提供全面和系统的参考。

企业开源 DNS 服务应用概述

在 Internet 上域名与 IP 地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识 IP 地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS 就是进行域名解析的服务器。DNS 是域名系统 Domain Name System 的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务。DNS 命名用于 Internet 等 TCP/IP 网络中,通过用户友好的名称查找计算机和服务。当用户在应用程序中输入 DNS 名称时,DNS 服务可以将此名称解析为与之相关的其他信息,如 IP 地址。因为,用户在上网时输入的网址,是通过域名解析系解析找到相对应的 IP 地址,这样才能上网。其实,域名的最终指向是 IP。

DNS 是一个分层级的分散式名称对应系统,看起来有点像电脑的目录树结构。在最顶端的是一个“.”(root),然后其下分为好几个基本类别名称,如 com、org、edu 等。再下面是组织名称,如 sun、yale 等。继而是主机名称,如 eng、cs、ntu 等。如图 1 所示的 DNS 域名空间的分层结构:

图 1.DNS 域名空间的分层结构

值得一提的是,因为当初 Internet 是从美国发起的,所以当时并没有国域名称。但随着后来 Internet 的蓬勃发展,DNS 也加进了诸如 cn、jp、au 等国域名称。所以一个完整的 DNS 名称就好像是这样的 www.xyz.com.cn 而整个名称对应的就是一个 IP 地址了。在开始的时候 root 下面只有六个组织类别:

1.edu:教育学术单位

2.org:组织机构

3.net:网路通讯单位

4.com:公司企业

5.gov:政府机关

6.mil:军事单位

不过自从组织类别名称开放以後各种各样五花八门的名称也相继出现,但无论如何取名的规则最好量适合网站性质。除了原来的类别资料由美国的 NIC(Network Information Center)管理之外,其它在国域以下的类别分别由该国的 NIC 管理。

DNS 系统的组成

DNS 系统基于客户机 / 服务器模式,从概念上说它主要由三个部分组成:

(1)域名空间:域名空间中的记录标识一组主机并提供它们的有关信息。域中的每一个节点都有它的有关信息的数据库。查询命令试图从这个数据库中提取适当的信息。简单地说,域名空间是所有不同类型信息的列表,这些信息是域名、IP 地址、邮件别名和那些在 DNS 系统中能查到的内容。

(2)域名服务器:保持并维护域名空间中的数据的程序。每个域名服务器含有一个域名空间子集的完整信息,并保存其它有关部分的信息。一个域名服务器拥有它控制范围的完整信息。控制的信息按区进行划分,区可以分布在不同的域名服务器上,以便为每个区提供服务。每个域名服务器都知道所有负责其他区的域名服务器。如果来了一个请求,它请求给定域名服务器负责的那个区的信息,那么这个域名服务器只是简单地返回信息。但是,如果请求是不同区的信息,那么这个域名服务器就要与控制该区的相应服务器联系。

(3)解析器:解析器是简单的程序或子程序库,它从服务器中提取信息以响应对域名空间内主机的查询。

DNS 是一个很复杂的概念,下表列出了常用的 DNS 术语:

1.域:代表网络一部分的逻辑实体或组织。

2.域名:主机名的一部分,它代表包含这个主机的域。它可以和域交换使用。

3.主机:网络上的一台计算机。

4.节点:网络上的一台计算机。

5.域名服务器:提供 DNS 服务的计算机,它将 DNS 名字转化为 IP 地址。

6.解析:把一个域名转化为与其相应的 IP 地址的过程。

7.解析器:从域名服务器中提取 DNS 信息的程序或库子程序。

8.反向解析:将给出的 IP 地址转化为其相应的 DNS 名字。

9.欺骗:使网络看上去好象具有不同的 IP 地址或域名的行为。

DNS 服务器的类型

DNS 域名服务器是用来存储主机 - 域名映射信息的,这些服务器具体又可以分为 3 类:

(1)主 DNS 服务器(primary name server):它是特定域所有信息的权威性信息源。它从域管理员构造的本地磁盘文件中加载域信息,该文件(区文件)包含着该服务器具有管理权的一部分域结构的最精确信息。主服务器是一种权威性服务器,因为它以绝对的权威去回答对其管辖域的任何查询。

(2)辅助 DNS 服务器(secondary name server):它可从主服务器中复制一整套域信息。区文件是从主服务器中复制出来的,并作为本地磁盘文件存储在辅助服务器中。这种复制称为“区文件复制”。在辅助域名服务器中有一个所有域信息的完整拷贝,可以有权威地回答对该域的查询。因此,辅助域名服务器也称作权威性服务器。配置辅助域名服务器不需要生成本地区文件,因为可以从主服务器中下载该区文件。

(3)高速缓存服务器(caching-only server):可运行域名服务器软件,但是没有域名数据库软件。它从某个远程服务器取得每次域名服务器查询的结果,一旦取得一个,就将它放在高速缓存中,以后查询相同的信息时就用它予以回答。高速缓存服务器不是权威性服务器,因为它提供的所有信息都是间接信息。对于高速缓存服务器只需要配置一个高速缓存文件,但最常见的配置还包括一个回送文件,这或许是最常见的域名服务器配置。

DNS 的工作原理

DNS 基于 C/S(Client/Server,客户机 / 服务器)模式,因而分为 Client 和 Server 两种角色。Client 扮演询问的角色,也就是向 Server 询问一个 Domain Name,而 Server 必须要回答此 Domain Name 所对应的真正 IP 地址。而当地的 DNS 先会查自己的资料库。如果自己的资料库没有,则会往该 DNS 上所设的其他 DNS 进行求助询问,依此得到答案之后,将收到的答案存起来,并回答客户。

DNS 服务器会根据不同的授权区(Zone),记录所属该网域下的各名称资料,这个资料包括网域下的次网域名称及主机名称。在每一个名称服务器中都有一个高速缓存区(Cache),这个 高速缓存区的主要目的是将该名称服务器所查询出来的名称及相对的 IP 地址记录在高速缓存区中,这样当下一次还有另外一个客户端到次服务器上去查询相同的名称时,服务器就不用在到别台主机上去寻找,而直接可以从缓存区中找到该名称记录资料,传回给客户端,以加速客户端对名称查询的速度。

举个例子,当 DNS 客户端向指定的 DNS 服务器查询网 Internet 上的某一台主机名称时,DNS 服务器会先在自己的高速缓存区中查询有无该条纪录,如果找到该条名称记录后,会从 DNS 服务器直接将所对应到的 IP 地址传回给客户端;如果查不到,则再次在本地资料库中找寻用户所指定的名称;如果 DNS 服务器在高速缓存区中和本地资料记录都查不到时,服务器才会向别的 DNS 服务器查询所要的名称。例如,本地的 DNS 服务器会向最接近(比如属于同一个 IP 地址段或者同一个 ISP)的 DNS 服务器去要求帮忙找寻该名称的 IP 地址。在另一台服务器上也有相同的动作的查询,当查询到后会回复原本要求查询的服务器,该 DNS 服务器在接收到另一台 DNS 服务器查询的结果后,先将所查询到的主机名称及对应 IP 地址记录到高速缓存区中,最后在将所查询到的结果回复给客户端。这样就成功地完成了一次标准的 DNS 查询 - 应答过程。

开源 DNS 服务构建面临的主要安全威胁分析

DNS 由于受当时条件限制,其系统设计存在很多缺陷:

1.单点故障:DNS 采用层次化的树形结构,由树叶走向树根就可以形成—个全域名(Fully Qualified Domain Name,FQDN),DNS 服务器作为该 FQDN 唯一对外的域名数据库和对内部提供递归域名查询的系统,因而其安全和稳定就存在单点故障风险。

2.无认证机制:DNS 没有提供认证机制,查询者在收到应答时无法确认应答信息的真假,就容易导致 DNS 欺骗。比如,提交给某个域名服务器的域名解析请求数据包被黑客截获,黑客可以将一个虚假的 IP 地址作为应答信息返回给请求者,那么原始请求者就误以为这是正确的 IP 地址而访问它,从而这样就导致了 DNS 欺骗。

3.访问量和维护量巨大以及远距离集中式数据库:如果部署中采用单个或者少数个名字服务器,则这些服务器不得不处理所有 DNS 查询消息,并保存所有因特网主机的记录,数据库会相当巨大,需要为每台新增的主机频繁更新,而且单台或者少数台名字服务器主机不可能在所有请求查询的客户主机附近,就可能导致相当大的延迟。

4.DNS(Berkeley Internet Name Domain)的漏洞:DNS 是域名软件,它在提供高效服务的同时也存在许多的安全性漏洞。现已证明在 DNS 版本 4 和 8 上存在缺陷,攻击者利用这些缺陷能成功地进行 DNS 欺骗攻击。构成严重威胁的漏洞主要有两种:一种是缓冲区溢出漏洞,严重的可以使攻击者在 DNS 服务器上执行任意指令。另一种是 DoS 漏洞,受攻击后 DNS 服务器不能提供正常服务,而且其所辖的子网无法正常工作。

DNS 面临的网络威胁是指 DNS 在实际的应用和部署中,不法用户或者黑客利用 DNS 协议或者软件设计的漏洞,可以通过网络向 DNS 发起的攻击,主要包括如下几种:

1.内部攻击:攻击者在非法或合法地控制一台 DNS 服务器后,可以直接操作域名数据库,修改指定域名所对应的 IP 为自己所控制的主机 IP,当客户发出对指定域名的查询请求后,将得到伪造的 IP 地址。

2.序列号攻击:DNS 协议格式中定义了用来匹配请求数据包和响应数据报序列 ID,欺骗者利用序列号伪装成 DNS 服务器向客户端发送 DNS 响应数据包,在 DNS 服务器发送的真实 DNS 响应数据报之前到达客户端,从而将客户端带到攻击者所希望的网站,进行 DNS 欺骗。

3.信息插入攻击:攻击者可以在 DNS 应答报文中随意添加某些信息,指示权威域名服务器的域名及 IP,那么在被影响的域名服务器上查询该域的请求都会被转向攻击者所指定的域名服务器上去,从而威胁到网络数据的完整性。

4.缓存中毒:DNS 使用超高速缓存,即当一个名字服务器收到有关域名和 IP 的映射信息时,它会将该信息存放在高速缓存中。当再次遇到相同的映射请求,能直接使用缓存中的结果,这种映射表是动态更新的,刷新也是有时限的,这样假冒者如果在下次更新之前成功地修改了 DNS 服务器上的映射缓存,就可以进行 DNS 欺骗或者 DDoS 攻击了。

5.信息泄漏:DNS 的缺省设置允许任何人进行区传送(区传送一般用于主服务器和辅服务器之间的数据同步,辅服务器可以从主服务器获取最新区数据文件的副本,也就可以获得整个授权区域内的所有主机信息 ),区传送可能会造成信息泄漏。一旦这些信息泄漏,攻击者就可以根据它轻松地推测主服务器的网络结构,并从这些信息中判断其功能或发现那些防范措施较弱的机器。

6.不安全的动态更新:随着动态主机配置协议(DHCP)的出现,客户计算机由 DHCP 服务器动态分配 IP 地址,使原来手工更新其 A(Address)记录和 PTR(反向解析)记录变得很难管理。因此在 RFC2136 标准草案中提出了 DNS 动态更新,使得 DNS 客户端在 IP 地址或名称出现更改的任何时候都可利用 DNS 服务器来注册和动态更新其资源记录。尽管 DNS 动态更新协议规定只有经过授权的主机才能动态更新服务器的 zone file,但是攻击者还是可以利用 IP 欺骗伪装成 DNS 服务器信任的主机对区数据进行添加、删除和替换。

实战一:DNS 服务安全配置

在使用 DNS 服务器之前,需要对与之相关的配置文件进行配置,因而首先需要了解这些基本文件,下面列表给出了几种主要的与 DNS 有关的文件:

1./etc/name.conf 文件:它是 DNS 服务器的主文件,通过它可以设置一般的 name 参数,指向该服务器使用的域数据库的信息源。

2./var/named/named.ca 文件:它是根域名配置服务器指向文件,通过它来指向根域名服务器,用于高速缓存服务器初始化。

3./var/named/localhost.zone 文件:localhost 区文件,用于将名字 localhost 转换为本地回送 IP 地址(127.0.0.1)。

4./var/named/localhost.zone 文件:localhost 区反向域名解析文件,用于将本地 IP 地址(127.0.0.1)转化为会送方 localhost 名字。

5./var/named/name2ip.conf 文件:用户配置的正向解析文件,将主机名映射为 IP 地址。

6./var/named/ip2name.conf 文件:用户配置的反向解析文件,将 ip 地址映射为主机名。

named.conf 主配置文件

在使用 named.conf 进行配置时,需要了解如下常用的配置语句,如表 1 所示。

表 1.named.conf 主配文件配置语句说明

根据在实际应用中的广泛程度和重要性,下面我们着重对 option 语句和 zone 声明的使用进行介绍。

使用 option 语句

option 语句的使用语法为:

option { 
配置子句 1;
配置子句 2;
};

在上述语法中,其配置子句常用的主要有如下两类:

directory:该子句后接目录路径,主要用于定义服务器区配置文件的工作目录,如 /home 等,在 Red Hat Enterprise Linux 5 系统中的默认路径为 /var/named;

forwarders:该子句后接 IP 地址,定义转发器;

使用 zone 声明

区声明是主配置文件中非常常用而且是最重要的部分,它一般要说明域名、服务器类型以及域信息源三个重要部分。它的语法为:

zone “zone_name” IN { 
type 子句;
file 子句;
其他子句;
};

那么,围绕上述三个重要部分,区声明语句有如下两类子句:

type:其主要有如下三种,master(说明一个区为主域名服务器)、slave(说明一个区为辅助域名服务器)和 hint(说明一个区为启动时初始化高速缓存的域名服务器)。

file:后接文件路径,主要说明一个区的域信息源的路径。

DNS 服务器配置实例

为了方便读者对 DNS 服务器配置文件的使用有个详细的了解,本节将针对一个实际的配置文件例子来进行讲解。该配置文件如下所示。我们虚构了一个域 feixiang.com 来举例说明主服务器的配置,下面是定义 feixiang.com 域的主服务器的 named.conf 文件:

// generated by named-bootconf.pl 

options {
directory "/var/named";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};


// a caching only nameserver config
//
zone "." {
type hint;
file "named.ca";
};
zone "feixiang.com"{
type master;
file "feixiang.com";
};

zone "0.0.127.in-addr.arpa" {
type master;
file "named.local";
};

zone "198.25.in-addr.arpa"{
type master;
file "named.rev";
};

上例中第一个 master 告诉我们这是 feixiang.com 域的主服务器。该域的数据是从 named.hosts 文件中加载的。在我们这个例子中,我们将文件名 named.hosts 作为区文件名。第三个 master 语句指向能将 IP 地址 198.25.0.0 映射为主机名的文件。它假定本地服务器是反向域 198.25.in-addr.arpa 的主服务器,该域的数据从文件 named.rev 中加载。
除了定义上述的主文件外,还需要定义如下的区文件(/var/named/feixiang.com):

$TTL86400 
$ORIGIN feixiang.com.
@1D IN SOA@ root (
42; serial (d. adams)
3H; refresh
15M; retry
1W; expiry
1D ); minimum

@ IN NS@
@ IN A127.0.0.1
www IN A198.25.25.80
ftp IN A198.25.25.68
web IN CNAMEwww

实战二:安全使用 DNS 服务器的高级技巧

配置辅助域名服务器做到冗余备份

辅助服务器可从主服务器中复制一整套域信息。区文件是从主服务器中复制出来的,并作为本地磁盘文件存储在辅助服务器中。这种复制称为“区文件复制”。在辅助域名服务器中有一个所有域信息的完整拷贝,可以有权威地回答对该域的查询。因此,辅助域名服务器也称作权威性服务器。配置辅助域名服务器不需要生成本地区文件,因为可以从主服务器中下载该区文件。

辅助服务器的配置与主服务器的配置不同,它使用 slave 语句代替 master 语句。slave 语句指向用作域信息源的远程服务器,以替代本地磁盘文件。下面的 named.conf 文件可以配置 feixiang.com 域的辅助服务器:

// generated by named-bootconf.pl 

options {
directory "/var/named";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};

//
// a caching only nameserver config
//
zone "." {
type hint;
file "named.ca";
};

zone "0.0.127.in-addr.arpa" {
type master;
file "named.local";
};
zone "feixiang.com"{
type slave;
file "named.hosts";
masters {25.198.10.3;};
};
zone "198.25.in-addr.arpa"{
type slave;
file "named.rev";
masters {25.198.10.3;};
};
cache . named.ca
secondary vbrew.com 25.198.10.3 named.hosts
secondary 198.25.in-addr.arpa 25.198.10.3 named.rev
primary 0.0.127.in-addr.arpa named.local

第一个 slave 语句是使这个服务器成为 vbrew.com 的辅助服务器。它告诉 named 从 IP 地址为 25.198.10.3 的服务器中下载 feixiang.com 的信息,并将其数据保存在 /var/named/named.hosts 文件中。如果该文件不存在,named 就创造一个,并从远程服务器中取得区数据,然后将这些数据写入新创建的文件中。如果存在该文件,named 就要检查远程服务器,以了解该远程服务器的数据是否不同于该文件中的数据,如果数据有变化,它就下载更新后的数据,用新数据覆盖该文件的内容;如果数据没有变化,named 就加载磁盘文件的内容,不必做麻烦的区转移工作。将一个数据库拷贝到本地磁盘文件中,就不必每次引导主机时都要转移区文件;只有当数据修改时,才进行这种区文件的转移工作。该配置文件中的下一行表示该本地服务器也是反向域 198.25.in-addr.arpa 的一个辅助服务器,而且该域的数据也从 25.198.10.3 中下载。该反向域的数据存储在 named.rev 中。

配置高速缓存服务器提高 DNS 服务器性能

高速缓存服务器可运行域名服务器软件,但是没有域名数据库软件。它从某个远程服务器取得每次域名服务器查询的结果,一旦取得一个,就将它放在高速缓存中,以后查询相同的信息时就用它予以回答。高速缓存服务器不是权威性服务器,因为它提供的所有信息都是间接信息。对于高速缓存服务器只需要配置一个高速缓存文件,但最常见的配置还包括一个回送文件,这或许是最常见的域名服务器配置。

配置高速缓存域名服务器是很简单的。必须有 named.conf 和 named.ca 文件,通常也要用到 named.local 文件。下面是用于高速缓存服务器的 named.conf 文件的例子:

// generated by named-bootconf.pl 
options {
directory "/var/named";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};

//
// a caching only nameserver config
//

//
// a caching only nameserver config
//
zone "." {
type hint;
file "named.ca";
};

zone "0.0.127.in-addr.arpa" {
type master;
file "named.local";

directory 这一行告诉 named 到哪里去找寻文件。所有其后命名的文件都将是相对于此目录的。该文件告诉 named 去维持一个域名服务器响应的高速缓存,并利用 named.ca 文件的内容去初始化该高速缓存。该高速缓存初始化文件的名字可以是任何名字,但一般使用 /var/named/named.ca。并不是在该文件中使用一个 hint 语句就能使它成为高速缓存配置,几乎每一种服务器的配置都要用到 cache 语句,而是因为没有 master 和 slave 语句才使它成为一个高速缓存配置。
但是,在我们这个例子中却有一个 master 语句。事实上,几乎在每一个高速缓存的配置文件中都有这一个语句,它将本地服务器定义为它自己的回送域的主服务器,并假定该域的信息存储在 named.local 文件中。这个回送域是一个 in-addr.arpa 域(in-addr.arpa 域用于指定逆向解析,或 IP 地址到 DNS 名字解析),它将地址 127.0.0.1 映射为名字 localhost。转换自己的回送地址对于大多数人都是有意义的,因为大多数的 named.conf 文件都包含这一项。

在大多数高速缓存服务器的配置文件中,这种 directory、master 和 hint 语句是唯一使用的语句,但也可以增加其他的语句,forwarders 和 slave 等语句都可以使用。

配置 DNS 负载均衡防止服务器宕机

DNS 负载均衡技术是在 DNS 服务器中为同一个主机名配置多个 IP 地址,在应答 DNS 查询时,DNS 服务器对每个查询将以 DNS 文件中主机记录的 IP 地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的。

现假设有三台服务器来应对 www.feixiang.com 的请求。在采用 Linux 系统上实现起来比较简单,只需在该域区文件的数据记录中添加类似下面的资源记录即可:

web_server1INA210.113.1.1 
web_server2INA210.113.1.2
web_server3INA210.113.1.3
wwwINCNAMEweb_server1
wwwINCNAMEweb_server2
wwwINCNAMEweb_server3

上述六条资源记录的具体含义为:在 DNS 服务器中为 www.feixiang.com 设定了三台服务器响应客户的访问请求。这三台服务器分别为 web_server1、web_server2 和 web_server3,而他们均为 www 服务器的别名。因此,在访问 www 服务器时,DNS 服务器将依次循环地将访问请求均衡到三台服务器中去,以达到负载均衡的目的。

配置智能 DNS 高速解析

随着原中国的互联网骨干网被一分为二了,北有联通、南有电信。从此,细心的网民可以发现,有些经常访问的网站速度一下子慢了下来,有时候还有访问不到的情况出现。例如北方地区的网络用户访问中国联通的服务器会非常快,而访问中国电信的服务器时,感觉非常慢。这种现象不仅影响了网站的访问量,更严重的是它直接影响了一些经营性网站的经济效益。据分析,产生这个问题的根本原因是中国电信分家之后,电信与联通之间的互连存在问题。虽然信息产业部已经在规划南北互通计划,但在今后相当长的一段时期内,南北方网互连的问题还会长期存在。

智能 DNS 策略解析很好的解决了上面所述的问题。DNS 策略解析最基本的功能是可以智能的判断访问网站的用户,然后根据不同的访问者把网站的域名分别解析成不同的 IP 地址。如访问者是联通用户,DNS 策略解析服务器会把网站域名对应的联通 IP 地址解析给这个访问者。如果用户是电信用户,DNS 策略解析服务器会把网站域名对应的电信 IP 地址解析给这个访问者。

除此之外,智能 DNS 策略解析还可以实现就近访问机制。有些用户在国外和国内都放置了服务器,使用 DNS 策略解析服务可以让国外的网络用户访问国外的服务器,国内的用户访问国内的服务器,从而使国内外的用户都能迅速的访问到网站的服务器。另外,智能 DNS 策略解析还可以给网站的多个主机实现负载均衡,这时来自各地的访问流量会比较平均的分布到服务器的每一个主机上。

下面以一个简单的例子来说明如何实现智能 DNS 的配置。在配置之前,我们需要使用前面小节介绍的有关知识生成针对电信网(telecom_feixiang.com)和联通网(cnc_feixiang.com)的区文件:

// 在 named.conf 文件的
options {
directory "/var/bind";

};

// 后添加如下控制网段:
acl "CNC" {
58.16.0.0/16;
58.17.0.0/17;
58.17.128.0/17;
58.18.0.0/16;
58.19.0.0/16;
58.20.0.0/16;
58.21.0.0/16;
58.22.0.0/15;
58.240.0.0/15;
221.13.128.0/17;
221.14.0.0/15;
221.192.0.0/15;
221.194.0.0/16;
221.195.0.0/16;
221.196.0.0/15;
221.198.0.0/16;
221.207.0.0/18;
};

// 修改原来的 dns 配置,让电信和联通访问不同的配置文件
view "view_cnc" {

match-clients { CNC;};

zone "." {

type hint;

file "named.ca";

};

zone "localhost" {

type master;

file "db.local";

};

zone "0.0.127.in-addr.arpa" {

type master;

file "127.0.0.zone";

};

zone "feixiang.com" {

type master;

file "cnc_feixiang.com";

};

zone "10.42.59.in-addr.arpa" {

type master;

file "59.42.10.zone";

};

zone "110.21.210.in-addr.arpa" {

type master;

file "210.21.110.zone";

};
};

view "view_any" {

match-clients { any; };

zone "." {

type hint;

file "named.ca";

};

zone "localhost" {

type master;

file "db.local";

};

zone "0.0.127.in-addr.arpa" {

type master;

file "127.0.0.zone";

};

zone "feixiang.com" {

type master;

file "telecom_feixiang.com";

};

zone "10.42.59.in-addr.arpa" {

type master;

file "59.42.10.zone";

};

zone "110.21.210.in-addr.arpa" {

type master;

file "210.21.110.zone";

};

};

合理配置 DNS 的查询方式提高效率

DNS 的查询方式有两种,递归查询和迭代查询。合理配置这两种查询方式,能够在实践中取得较好的效果。
其中,递归查询是最常见的查询方式,工作方式是:域名服务器将代替提出请求的客户机(下级 DNS 服务器)进行域名查询,若域名服务器不能直接回答,则域名服务器会在域各树中的各分支的上下进行递归查询,最终将返回查询结果给客户机,在域名服务器查询期间,客户机将完全处于等待状态。具体流程示意请见图 2:

图 2.DNS 递归查询流程示意

迭代查询又称重指引查询。其工作方式为:当服务器使用迭代查询时能够使其他服务器返回一个最佳的查询点提示或主机地址,若此最佳的查询点中包含需要查询的主机地址,则返回主机地址信息,若此时服务器不能够直接查询到主机地址,则是按照提示的指引依次查询,直到服务器给出的提示中包含所需要查询的主机地址为止,一般的,每次指引都会更靠近根服务器(向上),查寻到根域名服务器后,则会再次根据提示向下查找。具体流程示意如图 3 所示:

图 3.DNS 迭代查询流程示意

综合上面两点,我们可以看出来,递归查询就是客户机会等待最后结果的查询,而迭代查询是客户机等到的不一定是最终的结果,而可能是一个查询提示。因而存在如下两个问题:

1.二级 DNS 向一级 DNS 发起递归查询,会对一级 DNS 造成性能压力,所有跨域查询都要经过一级 DNS 响应给对应二级 DNS;

2.二级 DNS 向一级 DNS 发起递归查询,再由一级向归属 DNS 发起递归的模式查询响应会有一定延时;

因此,有很多流量很大的 DNS 服务器是禁止客户机使用递归查询,用这种方式来减轻服务器的流量。

使用 dnstop 监控 DNS 流量

在维护 DNS 服务器时,用户往往希望知道到底是哪些用户在使用 DNS 服务器,同时也希望能对 DNS 状态查询做一个统计,以及时地知道 DNS 的工作情况和状态。在传统的方式下,用户通常使用的是 tcpdump 等开源工具来进行抓包并通过查看 53 端口的流量来查看 DNS 数据包。由于 tcpdump 并没有针对 DNS 流量进行特殊定制,因此使用起来可能不是非常方便。因此,用户可以使用专用于 DNS 的 dnstop 工具查询 DNS 服务器状态。

dnstop 是一种非常优秀的开源软件,用户可以到网站 http://dns.measurement-factory.com/tools/dnstop/src/ 上进行下载使用,目前该软件的最新版本为:dnstop-20090128.tar.gz。

由于该软件依赖 tcpdump 和 pcap 抓包库(libpcap)对网络上传输的数据包进行截获和过滤,所以用户需要确保系统安装相应软件后才能正常安装和使用 dnstop。通常情况下,这两种必须的库都已经在系统中预装好了,使用下面的命令安装 dnstop 即可:

(1)解压缩源代码安装包

#tar vxfz ddnstop-20090128.tar.gz

(2)切换到解压目录,并使用 configure 命令生成 Makefile 文件

#cd dnstop-20090128
#./configure

(3)使用 make 命令进行安装

#make 

在运行 dnstop 的过程中,可以键入 <S>、<D>、<T>、<1>、<2>、<Ctr+R>、<Ctr+X> 等方式以交互方式来显示不同的信息:

S:记录发送 DNS 查询的客户端 IP 地址列表

D:记录 DNS 查询的目的服务器的 IP 地址表

T:记录查询详细类型

1:记录查询的顶级域名

2:记录查询的二级域名

Ctr+R:重新纪录

Ctr+X:退出

更详细信息可以使用 dnstop –help 命令进行查看。

使用 DNSSEC 技术保护 DNS 安全

DNSSEC 主要依靠公钥技术对于包含在 DNS 中的信息创建密码签名。密码签名通过计算出一个密码 hash 数来提供 DNS 中数据的完整性,并将该 hash 数封装进行保护。私/公钥对中的私钥用来封装 hash 数,然后可以用公钥把 hash 数译出来。如果这个译出的 hash 值匹配接收者刚刚计算出来的 hash 树,那么表明数据是完整的。不管译出来的 hash 数和计算出来的 hash 数是否匹配,对于密码签名这种认证方式都是绝对正确的,因为公钥仅仅用于解密合法的 hash 数,所以只有拥有私钥的拥有者可以加密这些信息。

DNSSEC 的功能主要有三个方面:

1.为 DNS 数据提供来源验证,即保证数据来自正确的名称服务器。

2.为数据提供完整性验证,即保证数据在传输的过程中没有任何的更改。

3.否定存在验证,即对否定应答报文提供验证信息,确认授权名称服务器上不存在所查询的资源记录。DNSSEC 为了实现签名和签名的验证功能,引入了四个新的资源记录类型:

1)DNSKEY:用于存储验证 DNS 数据的公钥;

2)RRSIG:用于存储 DNS 资源记录的签名信息;

3)NSEC:存储和对应的所有者相邻的下一个资源记录,主要用于否定存在验证;

4)DS(Delegation Signer,授权签名者):用于 DNSKEY 验证过程,存储密钥标签,加密算法和对应的 DNSKEY 的摘要信息。

DNSSEC 的工作机制主要体现在 DNS 工作过程中的以下 2 个方面:

(1)DNS 查询 / 应答:这一步因为使用了未加密和未验证的 UDP 数据包,存在严重的安全漏洞。DNSSEC 在这一步中加入了对数据源的验证和对数据完整性的校验。DNSSEC 要对某个域的数据进行验证,客户端就必须信任这个域的公钥。由于 DNS 中没有第三方的公钥验证体系,要建立对公钥的信任,就必须从一个已经被信任的名称服务器(如根服务器)开始,由此服务器验证其子域的公钥。然后再由这个子域的公钥验证其子域的公钥,一直到所请求的域的公钥得到验证,这个过程称为建立信任链。起始受信任的名称服务器的公钥就被称为信任锚点。验证数据源以后,下一步验证应答信息本身,它要求应答不仅包括请求的资源记录,还包括验证这些资源记录的所需的信息,即一个资源记录集的数字签名,它包含 RRSIG 中。使用信任锚点的 DNS 客户端就可以通过验证此数字签名来检查应答报文是否真实。为了保证和查询相应的资源记录的确不存在,而不是在传输过程中被删除,DNSSEC 生成一个特殊的资源类型记录(NSEC)来检测域名是否存在。

(2)DNS 域区传输:一个域区中一般有主域名服务器和备份域名服务器,域区传输就是域区文件从主域名服务器 copy 到备份域名服务器上的过程。在这个过程中面临着数据包拦截和更改的危险。DNSSEC 用 TSIG(Transaction Signature,事务签名)来验证请求方的真实身份和保证传输内容在传输过程中被篡改。

因此,DNSSEC 的部署主要有三个步骤:

1.生成公 / 私密钥对

2.公钥的发布及私钥的存储

3.域区的签署

DNSSEC 也是一种非常优秀的开源工具,用户可以到 http://sourceforge.net/projects/dnssec-tools/files/dnssec-tools/1.5/dnssec-tools-1.5.tar.gz/download 网站上进行下载和安装,目前其最新版本为 dnssec-tools-1.5.tar.gz。安装的具体步骤如下所示:

(1)解压缩源代码安装包

#tar vxfz dnssec-tools-1.5.tar.gz 

(2)切换到解压目录,并使用 configure 命令生成 Makefile 文件

#cd dnssec-tools-1.5 
#./configure

(3)使用 make 命令进行安装

#make 

下面我们通过一个实际的例子来说明如何为名称是 feixiang.com 的域建立 DNSSEC 配置。使用 DNSSEC 保护 DNS 的步骤如下所示:

(1)为 feixiang.com 域建立一对密钥。在 /var/named 目录下,使用如下命令:

#/usr/sbin/dnssec-keygen -a DSA -b 768 -n ZONE feixiang.com

这个命令产生一对长度 768 位 DSA 算法的私有密钥和公共密钥。

(2)使用如下命令

#/usr/sbin/dnssec-makekeyset -t 1800 -e now+21 Kfeixiang.com.+003+29462

建立一个密钥集合。该命令以 1800 秒的生存时间(time-to-live)建立密钥集合,有效期限 21 天,并且创建一个文件:feixiang.com.keyset。

(3)使用命令

#/usr/sbin/dnssec-signkey feixiang.com.keyset Kfeixiang.com.+003+29462 

为密钥集合签名。然后建立一个签名文件:feixiang.com.signedkey。

(4)使用命令

#/usr/sbin/dnssec-signzone -o feixiang.com feixiang.com.signed 

为区带文件签名。然后建立一个签名文件:feixiang.com.signed。

(5)替换配置文件 /etc/named.conf 中 feixiang.com 的区文件部分。如下所示:

zone “feixiang.com” IN { 
type master;
file “feixiang.com.signed”;
allow-update { none; }; };

总结

本文详细介绍了企业如何保证开源域名服务的安全防护策略和实战,包括开源 DNS 面临的主要安全威胁、DNS 服务安全配置、使用 DNS 服务器的高级安全技巧,希望能为开源系统爱好者和系统工程师在实际工作中提供参考。

二、NAT、DMZ 构建及安全部署建议

防火墙一直是信息安全领域的标志性产品,它可以在网络层甚至是目前的应用层来对恶意流量进行封堵,从而保证企业网及其服务的安全。在开源系统领域,Netfiler/IPTables 防火墙框架比较成熟,越来越多的企业采用该框架来进行企业防护。当然,防火墙的部署和使用具有一定的技巧,比如 DMZ 的部署、IPTables 封堵规则的设定等,都需要审慎的对待,才能发挥其最大功效。作为本系列的第二篇文章,本文对 Netfilter/IPTables 防火墙框架进行 NAT、DMZ 应用进行介绍,并给出防火墙的实际安全部署建议。

实战应用 IPTables 完成 NAT 功能

NAT 简介

在传统的标准的 TCP/IP 通信过程中,所有的路由器仅仅是充当一个中间人的角色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改,更为确切的说,除了将源 MAC 地址换成自己的 MAC 地址以外,路由器不会对转发的数据包做任何修改。NAT(Network Address Translation)恰恰是出于某种特殊需要而对数据包的源 IP 地址、目的 IP 地址、源端口、目的端口进行改写的操作。

一般说来,有如下几种情况下需要做 NAT:

1.为用户群提供 Internet 接入服务:为了方便管理,ISP 分配给用户的 IP 地址都是伪 IP,但是部分用户要求建立自己的 WWW 服务器对外发布信息,这时候我们就可以通过 NAT 来提供这种服务了。我们可以在防火墙的外部网卡上绑定多个合法 IP 地址,然后通过 NAT 技术使发给其中某一个 IP 地址的包转发至内部某一用户的 WWW 服务器上,然后再将该内部 WWW 服务器响应包伪装成该合法 IP 发出的包。

2.使用拨号上网的网吧:因为只有一个合法的 IP 地址,必须采用某种手段让其他机器也可以上网,通常是采用代理服务器的方式,但是代理服务器,尤其是应用层代理服务器,只能支持有限的协议,如果过了一段时间后又有新的服务出来,则只能等待代理服务器支持该新应用的升级版本。如果采用 NAT 来解决这个问题,因为是在应用层以下进行处理,NAT 不但可以获得很高的访问速度,而且可以无缝的支持任何新的服务或应用。

3.还有一个方面的应用就是重定向,也就是当接收到一个包后,不是转发这个包,而是将其重定向到系统上的某一个应用程序。最常见的应用就是和 squid 配合使用成为透明代理,在对 HTTP 流量进行缓存的同时,可以提供对 Internet 的无缝访问。

NAT 的原理

Linux 将 NAT 分成了两种类型,即源 NAT(SNAT) 和目的 NAT(DNAT),顾名思义,所谓 SNAT 就是改变转发数据包的源地址,所谓 DNAT 就是改变转发数据包的目的地址。前面提到过,Netfilter 是 Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains) 组成,而每条链中可以有一条或数条规则 (rule) 组成。并且系统缺省的表是"filter"。但是在使用 NAT 的时候,我们所使用的表不再是"filter",而是"nat"表,所以我们必须使用"-t nat"选项来显式地指明这一点。因为系统缺省的表是"filter",所以在使用 filter 功能时,我们没有必要显式的指明"-t filter"。同 filter 表一样,nat 表也有三条缺省的"链"(chains),这三条链也是规则的容器,它们分别是:

1.PREROUTING:可在这里定义进行目的 NAT 的规则,因为路由器进行路由时只检查数据包的目的 IP 地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的 NAT;

2.POSTROUTING:可以在这里定义进行源 NAT 的规则,系统在决定了数据包的路由以后再执行该链中的规则;

3.OUTPUT: 定义对本地产生的数据包的目的 NAT 规则。

如前所述,在使用 iptables 的 NAT 功能时,我们必须在每一条规则中使用"-t nat"显示的指明使用 nat 表。然后使用以下的选项:

(1)对规则的操作

1)加入 (append) 一个新规则到一个链 (-A) 的最后。

2)在链内某个位置插入 (insert) 一个新规则 (-I),通常是插在最前面。

3)在链内某个位置替换 (replace) 一条规则 (-R)。

4)在链内某个位置删除 (delete) 一条规则 (-D)。

5)删除 (delete) 链内第一条规则 (-D)。

(2)指定源地址和目的地址

通过 --source/--src/-s 来指定源地址 ( 这里的 / 表示或者的意思,下同 ),通过 --destination/--dst/-s 来指定目的地址。可以使用以下四中方法来指定 IP 地址:

1)使用完整的域名,如“www.tsinghua.edu”;

2)使用 IP 地址,如“172.168.92.10”;

3)用 IP 地址 / 子网掩码指定一个网络地址,如“192.168.1.0/255.255.255.0”;

5)用 IP 地址 / 子网掩码的位数指定一个网络地址,如“192.168.1.0/24”这里的 24 表明了子网掩码的有效位数,这是 Linux 环境中通常使用的表示方法。缺省的子网掩码数是 32,也就是说指定 172.168.92.10 等效于 172.168.92.10/32。

(3)指定网络接口

可以使用 --in-interface/-i 或 --out-interface/-o 来指定网络接口。从 NAT 的原理可以看出,对于 PREROUTING 链,我们只能用 -i 指定进来的网络接口 ; 而对于 POSTROUTING 和 OUTPUT 我们只能用 -o 指定出去的网络接口。

(4)指定协议及端口

可以通过 --protocol/-p 选项来指定协议,如果是 udp 和 tcp 协议,还可使用 --source-port/--sport 和 --destination-port/--dport 来指明端口。

NAT 具体使用

源地址 NAT

(1)标准的 SNAT

SNAT 的目的是进行源地址转换,应用于 POSTROUTING 规则链。在路由决定之后应用 SNAT 与出站接口相关 , 而不是入站接口。语法如下:

#iptables -t nat -A POSTROUTING -o <outgoing interface> -j SNAT \
--to-source <address>[-<address>][:port-port]

(2)MASQUERADE 源 NAT

MASQUERADE 没有选项来指定在 NAT 设备上使用的特定源地址,使用的源地址就是出站好接口的地址。

#iptables -t nat -A POSTROUTING -o <outgoing interface> -j MASQUERADE \
[--to-ports <port>[-port]]

举一个简单的例子:更改所有来自 192.168.1.0/24 的数据包的源 IP 地址为 1.2.3.4:

#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4

这里需要注意的是,系统在路由及过虑等处理直到数据包要被送出时才进行 SNAT。

另外,有一种 SNAT 的特殊情况是 IP 欺骗,也就是所谓的 Masquerading,通常建议在使用拨号上网的时候使用,或者说在合法 IP 地址不固定的情况下使用。比如:

 # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 

可以看出,这时候我们没有必要显式的指定源 IP 地址等信息。

目的地址 NAT

目的地址 NAT 有两种形式:DNAT 和 REDIRECT。REDIRECT 是目的地址转换的特殊形式,将数据包重定向到 NAT 设备的输入或回环接口。目的地址 NAT 应用于 nat 表的 PREROUTING 和 OUTPUT 规则链,在做出路由决定前对目的地址进行修改。在 PREROUTING 中,DNAT 和 REDIRECT 规则与用来接受通过本地路由转发或送到主机的入站接口的数据包的入站接口有关。在 OUTPUT 中,DNAT 和 REDIRECT 规则用来处理来自 NAT 主机本身生成的出站数据包。

(1)标准目的地址 NAT(DNAT)

#iptables -t nat -A PREROUTING -i <incoming interface> -j DNAT \
--to-destination <address>[-<address>][:port-port]
#iptables -t nat -A OUTPUT -o <outgoing interface> -j DNAT \
--to-destination <address>[-<address>][:port-port]

目的地址用来替换数据包中的原始目的地址和多位本地服务器地址。

(2)REDIRECT

#iptables -t nat -A PREROUTING -i <incoming interface> \
-j REDIRECT [--to-ports <port>[-port]]
#iptables -t nat -A OUTPUT -o <outgoing interface> \
-j REDIRECT [--to-ports <port>[-port]]

REDIRECT 重定向数据包到执行 REDIRECT 操作的那台主机。

举个简单的例子:更改所有来自 192.168.1.0/24 的数据包的目的 IP 地址为 1.2.3.4:

#iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3.4

这里需要注意的是,系统是先进行 DNAT,然后才进行路由及过虑等操作。有一种 DNAT 的特殊情况是重定向,也就是所谓的 Redirection,这时候就相当于将符合条件的数据包的目的 IP 地址改为数据包进入系统时的网络接口的 IP 地址。通常是在与 Squid( 一种开源代理服务器 ) 配置形成透明代理时使用,假设 Squid 的监听端口是 3128,我们可以通过以下语句来将来自 192.168.1.0/24,目的端口为 80 的数据包重定向到 Squid 监听端口:

#iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 /
-j REDIRECT --to-port 3128

一个具体的应用实例

为了更加系统和全面地介绍 NAT 的使用,下面举一个实际的例子来进行说明。假设有一家 ISP 提供园区 Internet 接入服务,为了方便管理,该 ISP 分配给园区用户的 IP 地址都是私网 IP,通过该私网 IP 用户无法向外发布信息。但是,部分用户要求建立自己的 WWW 服务器对外发布信息。我们可以再防火墙的外部网卡上绑定多个合法 IP 地址,然后通过 IP 映射使发给其中某一个 IP 地址的包转发至内部某一用户的 WWW 服务器上,然后再将该内部 WWW 服务器响应包伪装成该合法 IP 发出的包。

具体的 IP 分配如下:

(1)该 ISP 分配给 A 单位 www 服务器的 IP 为:

私网 IP:172.168.92.100

公网 IP:210.95.33.100

(2)该 ISP 分配给 B 单位 www 服务器的 IP 为:

私网 IP:172.168.92.200

公网 IP:210.95.33.200

(3)Linux 防火墙的 IP 地址分别为:

内网接口 eth1:172.168.92.10

外网接口 eth0:210.95.33.1

然后,我们需要进行如下步骤地操作:

(1)将分配给 A、B 单位的真实 IP 绑定到防火墙的外网接口,以 root 权限执行以下命令:

#ifconfig eth0 add 210.95.33.100 netmask 255.255.255.0 
#ifconfig eth0 add 210.95.33.200 netmask 255.255.255.0

(2)成功升级内核后安装 IPTables,然后执行以下脚本载入相关模块:

modprobe ip_tables 
modprobe ip_nat_ftp

(3)对防火墙接收到的目的 IP 地址为 210.95.33.100 和 210.95.33.200 的所有数据包进行 DNAT:

#iptables -A PREROUTING -i eth0 -d 210.95.33.100 -j DNAT --to 172.168.92.100 
#iptables -A PREROUTING -i eth0 -d 210.95.33.200 -j DNAT --to 172.168.92.200

(4)对防火墙接收到的源 IP 地址为 172.168.92.100 和 172.168.92.200 的数据包进行 SNAT:

#iptables -A POSTROUTING -o eth0 -s 172.168.92.100 -j SNAT --to 210.95.33.100 
#iptables -A POSTROUTING -o eth0 -s 172.168.92.200 -j SNAT --to 210.95.33.200

这样,所有目的 IP 为 210.95.33.100 和 210.95.33.200 的数据包都将分别被转发给 172.168.92.100 和 172.168.92.200; 而所有来自 172.168.92.100 和 172.168.92.200 的数据包都将分别被伪装成由 210.95.33.100 和 210.95.33.200,从而也就实现了 IP 映射。

实战应用 DMZ

DMZ 原理

DMZ 是英文“DeMilitarized Zone”的缩写,中文名称为“隔离区”,也称“非军事化区”。它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区,这个缓冲区位于企业内部网络和外部网络之间的小网络区域内,在这个小网络区域内可以放置一些必须公开的服务器设施,如企业 Web 服务器、FTP 服务器和论坛等。另一方面,通过这样一个 DMZ 区域,更加有效地保护了内部网络,因为这种网络部署,比起一般的防火墙方案,对攻击者来说又多了一道关卡。网络结构如图 1 所示。网络设备开发商利用这一技术,开发出了相应的防火墙解决方案。DMZ 通常是一个过滤的子网,DMZ 在内部网络和外部网络之间构造了一个安全地带。

图 1.DMZ 示意图

DMZ 防火墙方案为要保护的内部网络增加了一道安全防线,通常认为是非常安全的。同时它提供了一个区域放置公共服务器,从而又能有效地避免一些互联应用需要公开,而与内部安全策略相矛盾的情况发生。在 DMZ 区域中通常包括堡垒主机、Modem 池,以及所有的公共服务器,但要注意的是电子商务服务器只能用作用户连接,真正的电子商务后台数据需要放在内部网络中。在这个防火墙方案中,包括两个防火墙,外部防火墙抵挡外部网络的攻击,并管理所有内部网络对 DMZ 的访问。内部防火墙管理 DMZ 对于内部网络的访问。内部防火墙是内部网络的第三道安全防线 ( 前面有了外部防火墙和堡垒主机 ),当外部防火墙失效的时候,它还可以起到保护内部网络的功能。而局域网内部,对于 Internet 的访问由内部防火墙和位于 DMZ 的堡垒主机控制。在这样的结构里,一个黑客必须通过三个独立的区域 ( 外部防火墙、内部防火墙和堡垒主机 ) 才能够到达局域网。攻击难度大大加强,相应内部网络的安全性也就大大加强,但投资成本也是最高的。
构建 DMZ

构建原则

Linux 从 2.4 内核开始,正式使用 IPTables 来代替以前的 Ipfwadm 和 Ipchains,实现管理 Linux 的包过滤功能。Linux 的包过滤通过一个叫 Netfilter 的内核部件来实现。Netfilter 内建了三个表,其中默认表 Filter 中又包括 3 个规则链,分别是负责外界流入网络接口的数据过滤的 INPUT 链、负责对网络接口输出的数据进行过滤的 OUTPUT 链,以及负责在网络接口之间转发数据过滤的 FORWARD 链。

要在 Linux 系统中构建一个带 DMZ 的防火墙,需要利用对这些链的设定完成。首先要对从连接外部网络的网卡 (eth0) 上流入的数据进行判断,这是在 INPUT 链上完成。如果数据的目标地址属于 DMZ 网段,就要将数据转发到连接 DMZ 网络的网卡 (eth1) 上 ; 如果是内部网络的地址,就要将数据转发到连接内部网络的网卡 (eth2) 上。表 1 显示了各个网络之间的访问许可关系:

表 1.DMZ 和内外网的访问关系

根据表 1,可以明确以下六条访问控制策略:

内网可以访问外网:内网的用户显然需要自由地访问外网。在这一策略中,防火墙需要进行源地址转换。

内网可以访问 DMZ:此策略是为了方便内网用户使用和管理 DMZ 中的服务器。

外网不能访问内网:内网中存放的是公司内部数据,这些数据不允许外网的用户进行访问。

外网可以访问 DMZ:DMZ 中的服务器本身就是要给外界提供服务的,所以外网必须可以访问 DMZ。同时,外网访问 DMZ 需要由防火墙完成对外地址到服务器实际地址的转换。

DMZ 不能访问内网:很明显,如果违背此策略,则当入侵者攻陷 DMZ 时,就可以进一步进攻到内网的重要数据。

DMZ 不能访问外网:此条策略在有的情况下可能会有例外,比如 DMZ 中放置邮件服务器时,就需要访问外网,否则将不能正常工作。

DMZ 的具体实现

根据以上访问控制策略可以设定 Linux 防火墙的过滤规则。下面将在一个虚构的网络环境中,探讨如何根据以上六条访问控制策略建立相应的防火墙过滤规则。这里的讨论和具体应用会有所区别,不过这种讨论将有助于实际应用。用户在实际应用时可根据具体的情况进行设置。该虚拟环境的网络拓扑如图 2 所示。

图 2.DMZ 网络拓扑图

如图 2 所示,路由器连接 Internet 和防火墙。作为防火墙的 Linux 服务器使用三块网卡:网卡 eth0 与路由器相连,网卡 eth1 与 DMZ 区的 Hub 相连,网卡 eth2 与内网 Hub 相连。作为一个抽象的例子,我们用“[ 内网地址 ]”来代表“192.168.1.0/24”之类的具体数值。同理还有“[ 外网地址 ]”和“[DMZ 地址 ]”。
对于防火墙,原则之一就是默认禁止所有数据通信,然后再打开必要的通信。所以在防火墙脚本的最初,需要清空系统原有的规则,然后将 INPUT、OUTPUT、FORWARD 的默认规则设置为丢弃所有数据包。

(1)防火墙基本设置

对应的防火墙脚本片段如下:

对应的防火墙脚本片段如下:
# Flush out the tables and delete alluser-definedchains
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -t nat -F
/sbin/iptables -t nat – X

# Drop every packet
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP

(2)六种策略的具体实现

1)内网可以访问外网

对应的防火墙脚本片段如下:

/sbin/iptables -t nat -A POSTROUTING -s [ 内网地址 ] -d [ 外网地址 ] /
-oeth0-j SNAT --to [NAT 的真实 IP]

当数据从连接外网的 eth0 流出时,要将来自内网的数据包的源地址改成 Internet 上的真实 IP,这样才能和外网的主机进行通信。“[NAT 的真实 IP]”表示分配给 NAT 用户的真实 IP,有几个就写几个,以空格分开,但至少要写一个。

2)内网可以访问 DMZ

对应的防火墙脚本片段如下:

 /sbin/iptables -A FORWARD -s [ 内网地址 ] -d [DMZ 地址 ] -i eth2-jACCEPT 

以上命令允许所有来自内网、目的地为 DMZ 的数据包通过。

3)外网不能访问内网

对应的防火墙脚本片段如下:

/sbin/iptables -t nat -A PREROUTING -s [ 外网地址 ] -d [ 内网地址 ] -i eth0-jDROP 

以上命令将来自外网、去往内网的数据包全部丢弃。

4)外网可以访问 DMZ

为了保护 DMZ 中的服务器,外网对 DMZ 的访问也要加以限制。通常的思路是,只允许外网访问 DMZ 中服务器所提供的特定服务,比如 HTTP。

对应的防火墙脚本片段如下:

/sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 /
-d[ 分配给 HTTP 服务器的 Internet 上的真实 IP] -s [ 外网地址 ] /
-i eth0 -j DNAT--to[HTTP 服务器的实际 IP]
/sbin/iptables -A FORWARD -p tcp -s [ 外网地址 ]/
-d [HTTP 服务器的实际 IP]-ieth0 --dport 80 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -d [ 外网地址 ] /
-s [HTTP 服务器的实际 IP]-ieth1 --sport 80 ! --syn -j ACCEPT
/sbin/iptables -t nat -A PREROUTING -s [ 外网地址 ] /
-d [DMZ 地址 ] -ieth0-j DROP

该防火墙脚本片段将开放 HTTP 服务,使得只有访问 DMZ 中 HTTP 服务的数据包才能通过防火墙。

5)DMZ 不能访问内网

对应的防火墙脚本片段如下:

/sbin/iptables -A FORWARD -s [DMZ 地址 ] -d [ 内网地址 ] -i eth1 – jDROP 

以上命令将丢弃所有从 DMZ 到内网的数据包。

6)DMZ 不能访问外网

对应的防火墙脚本片段如下:

 /sbin/iptables -t nat -A POSTROUTING -p tcp --dport 25 -d[ 外网地址 ] /
-s [ 邮件服务器的 IP] -o eth0 -j SNAT /
--to[ 分配给 SMTP 服务器的 Internet 上的真实 IP]
/sbin/iptables -A FORWARD -p tcp -s [ 邮件服务器的 IP] -d [ 外网地址 ] /
-ieth1--dport 25 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -d [ 邮件服务器的 IP] -s [ 外网地址 ]/
-ieth0--sport 25 ! --syn -j ACCEPT

以上命令先允许 DMZ 中邮件服务器连接外网的 SMTP 服务端口 (25),然后禁止其它从 DMZ 发往外网的数据包。
针对以上基本策略例举了实现它们的基本规则。在实际应用中,需要根据具体情况进行设置。只要设置得当,Linux 也能成为很好的防火墙。需要补充的是,无论何种防火墙都只能提供有限的保护。设置好防火墙不等于网络就是安全的,关键在于综合运用各种安全手段。

防火墙的实际安全部署建议

防火墙在实际的部署应用过程当中,经常部署在网关的位置,也就是经常部署在网内和网外的一个“中间分隔点”上,而就是在这样一个部署的环境中,也还存在着多种方式,且存在着许多“陷阱”,下面进行详细分析。

方案一:错误的防火墙部署方式

传统的防火墙部署方式可能所有人都认为非常简单,将防火墙部署于外部网络和内部网络之间。这个思路如果在内部网络中存在共享资源(比如说 FTP 服务器和 Web 服务器)的话,那么这将是一个非常危险的部署方式,如图 3 所示。理由其实非常简单,一旦这些共享服务器为黑客攻击和安装木马渗透病毒的话,那么内部网络的客户端及其资源将没有任何安全可言。因为在这种情况下,木马和病毒已经在内网中存在,而客户端和共享资源服务器在同一个网段,这无异于内网的安全隐患,防火墙对此无能为力,从而也失去了部署的意义了。

图 3.错误的防火墙部署方式

方案二:使用 DMZ

目前一个比较流行和正确的做法就是采用如图 4 所示。也就是在防火墙上多加一块网卡,把提供对外服务的服务器和内网的客户端严格地隔离开来,这样,即算有安全风险和漏洞在 DMZ 中出现,由此对内部网络造成的危害也可以得到很好的控制,从而避免了方案一的缺点。

图 4.使用 DMZ 的防火墙部署方式

方案三:使用 DMZ+二路异构防火墙

为了加强方案二中防火墙的安全强度,目前有些企业将图 4 的架构优化成图 5 的架构,也就是使用 DMZ+二路防火墙。另外,在此结构中选用防火墙,应尽量采用两家不同公司的异构产品,这样才有利于发挥这种架构的优势。

图 5.使用 DMZ+二路防火墙的部署方式

方案四:通透式防火墙

在前面的几种方案中,防火墙本身就是一个路由器,在使用的过程中用户必须慎重地考虑到路由的问题。如果网络环境非常复杂或者是需要进行调整,则相应的路由需要进行变更,维护和操作起来有一定的难度和工作量。
通透式防火墙则可以比较好的解决上述问题(如图 6 所示)。该类防火墙是一个桥接设备,并且在桥接设备上赋予了过滤的能力。由于桥接设备工作在 OSI 模型的第二层(也就是数据链路层),所以不会有任何路由的问题。并且,防火墙本身也不需要指定 IP 地址,因此,这种防火墙的部署能力和隐密能力都相当强,从而可以很好地应对黑客对防火墙自身的攻击,因为黑客很难获得可以访问的 IP 地址。

图 6.通透式防火墙部署方式

总结

本系列文章详细介绍了 Netfilter/IPTables 防火墙框架的原理、安装、启动以及简单实战应用,并对实战应用 Netfilter/IPTables 防火墙框架进行 NAT、DMZ 应用进行了介绍,最后给出了防火墙的实际安全部署建议。

 
相关文章

iOS应用安全开发,你不知道的那些事术
Web安全之SQL注入攻击
移动APP安全在渗透测试中的应用
从Google备份互联网看“数据安全”
 
相关文档

web安全设计与防护
互联网海量内容安全处理技术
黑客攻击与防范技术
WEB黑盒安全检测
 
相关课程

WEB网站与应用安全原理与实践
web应用安全架构设计
创建安全的J2EE Web应用代码
信息安全问题与防范
 
分享到
 
 


iOS应用安全开发
Web安全之SQL注入攻击
APP安全在渗透测试中的应用
初探PHP的SQL注入攻击的技术
从Google备份看“数据安全”
更多...   


WEB网站与应用安全原理与实践
web应用安全架构设计
创建安全的J2EE Web应用代码
注册信息安全专业人员(CISP)
信息安全管理
信息安全问题与防范


中国银行 信息安全技术及深度防御
Web应用安全架构、入侵检测与防护
某财税领域知名IT服务商 Web安全测试
普瑞克斯 web安全设计、测试与优化
北京和利时 性能和安全性测试
SUN中国工程研究院 JSF框架、安全
更多...