概述
有人能够告诉我为什么需要一个商业性的防火墙产品,而不仅仅是使用ipchains 来限制某些数据包和信息资料?那么,在使用时ipchains时我会失去什么呢?是安全性,还是日志登录功能?
现在,请恕我直言,在这个问题上毫无疑问的是ipchains已经相当好了,而且从功能和支持范围(support)上来讲,绝大部分时间里甚至比那些商业性防火墙更好用。而且相对于使用商业解决方案,使用ipchains会让你更加清楚防火墙对网络产生的影响。现在,许多公司会告诉他们的股东,诸如ceo/cto等等,他们有著名的安全软件公司做支持。防火墙实际上什么都不做,只是让网络中所有信息都顺利通过而已。而且如果使用商业性产品,公司将会感到比使用那些稍有不慎就出麻烦的软件更加容易方便。
最后一点,如果网络被攻破,许多公司都想能够恢复到原状,并从防火墙厂商那里获得一定的赔偿,他们也不管是否确实能从厂商那里得到什么。对于开源解决方案(open source solution),他们所做的比较典型的方法就是只是解雇实施这个方案的人。至少对一些基于linux的商业性防火墙是这样的。因此就有这种可能,ipchains对于你是足够安全的,而对那些需要与大量股本和债券打交道的人就不是。(在准备为一个价格昂贵的防火墙花费大笔开销之前,做一个性价比分析,并问一些关心的问题是我们推荐的做法,否则,你可能反而会被一些不如ipchains的产品搞得焦头烂额)。现在,只有很少的nt防火墙性能跟ipchains差不多,而且总的来说,对nt防火墙一致的意见是在系统bug上,而nt的系统bug是“nt远非一个真正安全的系统”。
网络防火墙安全策略
一个组织的全局性安全策略必须根据安全分析和业务需求分析来决定。因为防火墙只与网络安全有关,所以只有在正确定义了全局安全策略的情况下,防火墙才具有一定的价值。网络防火墙安全策略是指要明确定义那些允许使用或禁止使用的网络服务,以及这些服务的使用规定和规定中的一些特殊情况。而且,网络防火墙安全策略中的每一条规定都应该在实际应用时得到实现。总的来说,一个防火墙应该使用以下方法之一。
每一个没有明确允许的都被拒绝
这种方法堵塞了两个网络之间的所有流量,除了那些被明确允许的服务和应用程序(application)。因此,每一个想保留的服务和应用程序都应该挨个实现,而任何一个可能成为防火墙漏洞的服务和应用程序都不能允许使用。刚才所说的是一个最安全的方法,那就是除非是系统管理员明确允许使用的服务和应用程序,否则都必须拒绝。另一方面,从用户的角度来看,这样可能会限制更多,不是非常方便。在本书中,我们在防火墙配置中会使用这种方法。
每一个没有明确拒绝的都允许
这种方法允许两个网络之间所有流量,除非那些被明确禁止的服务和应用程序。因此,每一个不信任或有潜在危害的服务和应用程序都应该逐个拒绝。但是,虽然这对用户是一个灵活和方便的方法,它却可能引起一些严重的安全问题。
包过滤
包过滤是一种内置于linux 核心的防火墙类型。过滤型防火墙工作在网络层。数据只有在防火墙规定允许的情况下才能发出去,而到达的包要则根据它们的类型,源地址,目的地址和每个包中包含的端口信息进行过滤。
在绝大部分时间里,包过滤的工作是由一个能根据过滤规定转发数据包的路由器完成的。当一个数据包到达一个能进行包过滤的路由器时,这个路由器从该数据包的包头中解读某些信息,然后根据过滤规定决定数据包是通过还是被丢弃。
下面是能从包头中解读的信息:
源ip地址
目的ip地址
tcp/udp源端口
tcp/udp目的端口
icmp消息类型
协议信息(tcp,udp,icmp或ip隧道)
因为只需要分析很少的数据,而且登录到防火墙只占用很少cpu时间,网络延迟也非常小,所以如果想使用防火墙保护网络系统,可以通过很多种方法来建设网络。
拓扑结构
在网络中,所有的服务器都至少必须关闭所有没有用的端口,即使它不是一个防火墙服务器。这样做是为了更安全。想象一下,有人获得了对防火墙服务器的访问权,而这只是因为你邻近的服务器没有配置成关闭所有端口,才造成这种情况。对于本地连接,这也是一样的,没有安全认证的员工能从内部的其他服务器获得对另一个服务器的访问权。
在我们下面的配置中,我们将会给出三个例子,它们有助于你根据要保护的服务器类型和它们在网络结构中的地位决定防火墙规定。第一个防火墙规定适用于web服务器,第二个适用于邮件服务器,最后一个适用于作为内部代理服务器使用的网关服务器。详见图。
www.openarch.com
caching only dns
208.164.186.3
deep.openarch.com
master dns server
208.164.186.1
mail.openarch.com
slave dns server
208.164.186.2
1. unlimited traffic on the loopback interface allowed
2. icmp traffic allowed
3. dns caching and client server on port 53 allowed
4. ssh server on port 22 allowed
5. http server on port 80 allowed
6. https server on port 443 allowed
7. smtp client on port 25 allowed
8. ftp server on ports 20, 21 allowed
9. outgoing traceroute request allowed
1. unlimited traffic on the loopback interface allowed
2. icmp traffic allowed
3. dns server and client on port 53 allowed
4. ssh server and client on port 22 allowed
5. http server and client on port 80 allowed
6. https server and client on port 443 allowed
7. www-cache client on port 8080 allowed
8. external pop client on port 110 allowed
9. external nntp news client on port 119 allowed
10. smtp server and client on port 25 allowed
11. imap server on port 143 allowed
12. irc client on port 6667 allowed
13. icq client on port 4000 allowed
14. ftp client on port 20, 21 allowed
15. realaudio / quicktime client allowed
16. outgoing traceroute request allowed
1. unlimited traffic on the loopback interface allowed
2. icmp traffic allowed
3. dns server and client on port 53 allowed
4. ssh server on port 22 allowed
5. smtp server and client on port 25 allowed
6. imap server on port 143 allowed
7. outgoing traceroute request allowed
上表显示了根据防火墙脚本文件在不同服务器上缺省打开的端口。根据服务器必须要对外提供的服务,你必须配置相应的防火墙脚本文件,以允许在指定端口上的通讯。表中,www.openarch.com是我们的web服务器,mail.openarch.com是唯一对外的邮件服务器,deep.openarch.com是网关服务器。它们会用在本章所有的例子中。
编译一个支持ipchains防火墙的内核
首先,必须确信linux内核已经编译成“network firewall support”和“firewalling”(支持网络防火墙—译者注)。记住,所有服务器都至少必须关闭所有不使用的端口,即使它不是防火墙服务器。在内核2.2.14中,必须对下面两个问题回答“y”。
networking 选项:
network firewalls (config_firefall) [n] y
ip: firewalling (config_firewall) [n] y
ip: tcp syncookie support(config_syn_cookies) [n] y
注释:如果你在阅读《linux 内核》一章时就重新编译了内核,那么上面这些选项应该已经设置好了。
只对网关服务器有用的ip masquerading 和 ip icmp masquerading:
ip: masquerading (config_ip_masquerade) [n] y
ip: icmp masquerading (config_ip_masquerade_icmp) [n] y
注释:只有网关服务器才需要支持“ip: masquerading”和“ip: icmp masquerading”内核选项,它需要把内部网对外界伪装起来。
在这里,伪装的意思是,如果在本地网中的一台计算机想要发送一些东西到网络外部,而这个本地网络由一个linux盒 (linux box:可以是任何简易的linux 设备—译者注) 充当网络防火墙,那么这个linux盒就可以伪装成那台要发送内容的计算机。例如,linux盒转发了到网络外部的所有流量,但是对外部来说,这些都象是来自防火墙本身。
它可以通过两种方式工作:如果外部主机应答,linux防火墙就将把这些流量转发到相应的本地计算机,在这种情况下,在本地网络中的计算机对于外部是完全不可见的,即使它们可以访问外界并收到应答。这样,即使本地网络中的计算机没有合法的ip地址也能够访问internet。
ip伪装的代码只能工作在下面这种条件下,即在系统启动并安装(mount)了/proc 文件系统之后,“ip转发”能够通过下面这行代码执行:
echo “1” > /proc/sys/net/ipv4/ip_forward
你可以在“/etc/rc.d/rc.local”文件中加上这一行,这样在下次计算机重新启动时就会自动支持ip转发。
编辑“rc.local”文件 (通过 vi /etc/rc.d/rc.local )并加上下面这行:
echo “1” > /proc/sys/net/ipv4/ip_forward
注释:上面有关ip转发的命令行只有在对内核选项“ip: masquerading (config_ip_masquerde)”回答“y”,并且配置了网关服务器来伪装内部网络的情况下才是必须的。
如果选择了支持ip masquerading,模块ip_masq_ftp.o(用于ftp文件传输),ip_masq_irc.o(用于irc chats),ip_masq_quake.o (用途你可以猜得到),ip_masq_vdolive.o(用于vdolive 的视频连接),ip_masq_cuseeme.o(用于cu-seeme 广播)和ip_masq_raudio.o(用于realaudio 下载)将会自动编译,它们是这些协议工作时所需要的。
同时,你需要在回答“enable loadale module support (config_modules)”时选择“y”以编译一个模块化的内核而不是整体型的内核,这样就可以在网关服务器上使用伪装功能和象ip_masq_ftp.o之类的模块。
上面所讲的对“ip: masquerading”而言的基本伪装代码只能处理tcp或udp包(以及当前连接的icmp错误)。ip: icmp masquerading 增加了对伪装icmp包的附加支持, 比如windows 95 跟踪程序使用的ping 或 probe。
注意:记住,其它类型的服务器象web 服务器和邮件服务器并不需要支持这些选项,因为它们要不是拥有一个真实的ip地址,就是不用担任内部网络的网关。
注意事项
如果你的系统与internet相连,那你确实可以假设你处在潜在的危险中。因为你的网关是对internet的暴露点,所以我们建议以下几点:
网关服务器除非确实有必要,一定不要在上面新增任何应用程序。
网关服务器上应该严格限制能够通过的协议种类和数量(许多协议都是潜在的安全漏洞,比如ftp和telnet )。
任何装有机密和敏感信息的系统都不应该能从internet 上直接访问。
解释一下防火墙脚本文件的一些规则
下面列出了对将用于防火墙例子的一些规则的解释。这些只是一个参考,防火墙脚本文件都有很清晰的注释说明,也非常好修改。
脚本文件中使用的常量
在脚本文件中,常量定义了大部分将会使用的数值。其中最基本的常量是:
external_interface
这是与internet 相连的对外网卡名字。在以后的例子中定义成“eth0”。
local_interface_1
这是与内部局域网相连的对内网卡名字。在以后的例子中定义成“eth1”。
loopback_interface
这是回馈网卡名字。在以后的例子中定义成“lo”。
ipaddr
这是对外网卡的ip地址。这或者是一个与internic(网卡—译者注)绑定的静态地址,或者是由isp动态分配的地址(通常是通过dhcp)。
localnet_1
这是局域网的网络地址。这应该是局域网中所有机器使用的ip地址范围。它应该是静态指定的,可以用一个dhcp服务器来分配。在后面的例子中,ip地址范围是192.168.1.0/24,是c类地址的一部分。
anywhere
这是ipchains 用来匹配所有地址(非广播地址)的地址的一个标志。所有程序都为这个地址提供一个“any/0”的标志,这个地址是0.0.0.0/0。
nameserver_1
这是主dns服务器或isp的ip地址。
nameserver_1
这是第二dns服务器或isp的ip地址。
loopback
回馈地址的范围是127.0.0.0/8。网卡自己的地址是127.0.0.1(在/etc/hosts文件中指定)。
privports
指定优先端口,通常从0到1023。
unprivports
指定非优先端口,通常从1024到65535。它们是动态分配给连接客户端的。
default policy
一个防火墙通常有一个缺省的安全策略,以及一系列对应于特殊消息类型的反应动作。这意味着如果有一个数据包不适用于任何已定义的策略,这个缺省策略就会发挥作用。
注释:一个ip转发性质(ipfw)的防火墙有两个基本策略,一个是缺省拒绝所有信息,只允许明确规定允许的信息;另一个是缺省接受一切信息,只拒绝明确规定不允许的信息。其中,缺省拒绝一切的策略是我们推荐的,因为通过它更容易建立一个安全得多的防火墙。
允许本地流量
因为缺省策略是拒绝一切信息,所以其中一些需要放开。本地网络服务不通过对外的网卡进行,它们只通过一个特殊的、私有的网卡,叫做回馈网卡。只有回馈网卡允许工作了,本地网络才能正常工作。
#unlimited traffic on the loopback interface.
ichains –a input –i $loopback_interface –j accept
ichains –a output –i $loopback_interface –j accept
源地址过滤
在ip数据包头中,在ip协议中唯一有标识含义的是包的源地址。这种情况就为利用源地址进行欺骗开了后门,因为只要把源地址替换成一个不存在的地址,或是另外一个地址就可以了。这就允许有恶意的人侵入你的系统或伪装成你去攻击别人。
# refuse spoofed packets pretending to be from the external address.
ipchains –a input –i $external_interface –s $ipaddr –l –j deny
在任何情况下,起码有7种源地址需要在对外网卡上设置成拒绝。
下面这些地址是从外面进来的数据包所需要的:
自己对外的ip地址
a类私有地址
b类私有地址
c类私有地址
d类多址地址
e类保留地址
回馈(loopback)网卡地址
除了你自己的ip地址以外,应该阻塞所有包含这些源地址的外出数据包,这样才能保护自己避免因为配置上的错误而受到攻击。
其余的规定
在防火墙脚本文件中使用的其它规定是:
从外部访问一个服务(access a service from the outside world)
向外部提供一个服务
伪装内部网络中的计算机