10.3 iptables配置实战

本节以一个典型企业应用为例,说明iptables的配置和使用。假如某公司需要Internet接入,由ISP分配IP地址202.112.113.112。采用iptables作为NAT服务器接入网络,内部采用192.168.0.0/24地址,外部采用202.112.113.112地址。为确保安全需要配置防火墙功能,要求内部仅能够访问Web、DNS及Mail3台服务器;内部Web服务器192.168.0.100通过端口映像方式对外提供服务。网络拓扑结构如图10-4所示。

图10-4 网络拓扑结果

用交换机将地址为192.168.0.0/24的内部局域网连接为普通以太网,整个局域网通过Linux接入服务器(作为防火墙及NAT服务器),再接入外网。该服务器的eth0接口连接外网,IP地址为202.112.113.112。eth1接口连局域网,IP地址为192.168.0.1。局域网内部有一台Web服务器,IP地址为192.168.0.100。

10.3.1 初试化配置方案

要使用iptables,还必须使用以下命令载入相关模块:

#modprobe iptable_tables
/sbin/iptables -t filter -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F #清除现有的规则

modprobe命令会自动载入指定模块及其相关模块,iptables_filter模块会在运行时自动载入:

# /sbin/iptables -P FORWARD DROP  #设置默认策略,丢弃所有除允许之外的从内网来的包

10.3.2 设置Web服务器

设置Web服务器如下:

iptables -A FORWARD -i eth0-p tcp --dport 80-j ACCEPT
iptables -A FORWARD -i eth0-p udp --dport 80-j ACCEPT
# 允许从内网来的协议为TCP或UDP,且目的端口为80的包通过,即允许内网的客户端向外网的Web服务器发送请求
iptables -t nat -A POSTROUTING -o eth0-p tcp --dport 80-j SNAT --to-source 202.112.113.112
iptables -t nat -A POSTROUTING -o eth0-p udp --dport 80-j SNAT --to-source 202.112.113.112
#通过NAT将内网IP转换为外网IP,隐藏内部网络

10.3.3 设置DNS服务器

设置DNS服务器如下:

iptables -A FORWARD -i eth0-p tcp --dport 53-j ACCEPT
iptables -A FORWARD -i eth0-p udp --dport 53-j ACCEPT
# #允许从内网来的协议为TCP或UDP,且目的端口为53的包通过,即允许内网用户访问DNS服务

10.3.4 设置邮件服务器Sendmail

设置邮件服务器Sendmail如下:

iptables -A FORWARD -i eth0-p tcp --dport 25-j ACCEPT
iptables -A FORWARD -i eth0-p udp --dport 25-j ACCEPT #SMTP: 允许从内网来的协议为TCP或
UDP,且目的端口为25的包通过,即允许内网用户访问协议为SMTP的邮件服务
iptables -A FORWARD -i eth0-p tcp --dport 110-j ACCEPT
iptables -A FORWARD -i eth0-p udp --dport 110-j ACCEPT #POP3: 允许从内网来的协议为TCP或
UDP,且目的端口为110的包通过,即允许内网用户访问协议为POP3的邮件服务

10.3.5 设置不回应ICMP封包

设置不回应ICMP封包如下:

iptables -t filter -A INPUT -p icmp --icmp-type echo-requested -j DROP
iptables -t filter -A OUTPUT -p icmp --icmp-type echo-reply -j DROP
iptables -t filter -A FORWARD -p icmp --icmp-type echo-requested -j DROP
iptables -t filter -A FORWARD -p icmp --icmp-type echo-reply -j DROP

10.3.6 防止IP Spoofing

IP Spoofing把外来的封包假装为内部网络发出,试图让防火墙误认,而允许其进入内部网络。要防止IP Spoofing,只须过滤那些从Internet进入,而声称来源地址是内部网络的封包便可:

iptables -t filter -A INPUT -i $EXTERNAL_NIC -s $INTERNAL_NET -j DROP
iptables -t filter -A FORWARD -i $EXTERNAL_NIC -s $INTERNAL_NET -j DROP

10.3.7 防止网络扫描

网络扫描是利用一些不正常,而又合法的封包检测服务器所提供的服务和取得一些系统信息。也有入侵者用这些封包企图绕过防火墙入侵内部网络,所以必须过滤:

iptables -t filter -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -t filter -A FORWARD -p tcp --tcp-flags ALL ALL -j DROP
iptables -t filter -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -t filter -A FORWARD -p tcp --tcp-flags ALL NONE -j DROP
iptables -t filter -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -t filter -A FORWARD -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -t filter -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -t filter -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

10.3.8 允许管理员以SSH方式连接到防火墙修改设定

开设一个通道给管理员以SSH联机到防火墙修改设定;否则每当修改设定时,管理员要登入防火墙修改:

iptables -t filter -A INPUT -i $INTERNAL_NIC -s $INTERNAL_NET --dport 22-j ACCEPT

至此,已经完成了需求当中的所有要求。关于iptalbes还有许多功能,具体的使用方法可以参见其使用手册和How-to文档。Linux加上Netfilter的强大功能,为中小企业提供了一个低成本防火墙的解决方案。

10.3.9 快速构架Linux个人防火墙

Firestarter是一个完全的免费软件,它可以在KDE和GNOME环境下提供图形界面快速架构个人防火墙。

Firestarter的作者和开发者是芬兰人Tomas Jounonen和Paul Drain,在http://firestarter.sourceforge.net/可以自由下载其源代码,还可以使用majix@sci.f及pd@cipherfunk.org电子邮件与其联系,最新版本是1.03。这里下载的是其RPM包,下载链接 http://jaist.dl.sourceforge.net/sourceforge/firestarter/firestarter-1.0.3-1.i386.rpm

1.系统检测

由于Tomas Jounonen和Paul Drain使用C语言和GTK +(GIMP Tool Kit,一个用于创造图形用户接口的库)开发该软件,所以安装前应检查系统gtk2+模块的gcc编译器版本:

# rpm -qa | grep gcc
# rpm -qa | grep gtk2+

2.安装软件

以根权限登录Linux打开一个终端:

# rpm -ivh firestarter-1.0.3-3.i386.rpm

3.配置软件

系统会在/usr/bin/firestarter建立主程序,第1次运行Firestarter需要进行简单的配置。

(1)软件配置向导如图10-5所示。首先单击选项子菜单进行一些简单配置,主要包括为软件建立日志文件目录、设置防火墙启动方式及策略,单击“Run firewall wizard”启动防火墙配置向导。

图10-5 软件配置向导

(2)配置网络设备,如图10-6所示。如果使用XDSL等宽带接入的设备,选择网卡的接口即可。如果使用Cable Modem接入网络的话,那么选择“IP地址通过DHCP分配”复选框后单击“前进”按钮。

图10-6 配置网络设备

(3)启动防火墙。

最后系统会提示配置结束,单击“保存”按钮退出向导后启动防火墙,如图10-7所示。

图10-7 启动防火墙

(4)配置ICMP包过滤,如图10-8所示。

图10-8 配置ICMP包过滤

ICMP(Internet Control Message Protocol,Internet控制报文协议)工作在OSI的网络层,向数据通信中的源主机报告错误。ICMP可以实现故障隔离和故障恢复。平时最常用的是Ping的操作。如果选择允许ICMP包过滤,则各选项的作用如表10-6所示。

表10-6 ICMP各选项的作用

除Ping以外,其他类型的ICMP也可以用于扫描网络。ICMP的时间戳(Timestamp,类型13)会产生一个时间戳应答(Timestamp Reply,类型14),但是只有在UNIX系统中才出现这种情况,Microsoft的IP堆栈中没有此项功能。因此根据对时间戳请求的应答,不仅可以知道目的系统的主机是否激活,而且还能知道目的主机是否采用了Microsoft的操作系统。

专家指出,还可以通过使用ICMP请求应答来判断目的主机是否为Microsoft的IP堆栈。一些ICMP类型的报文有子类型,称为“代码”,但它们没有ICMP回波请求或应答。如果发出一些包括特殊代码值的回波请求,则Microsoft堆栈在应答的报文中将清除这些代码,但是UNIX堆栈不会如此处理。在对于如何处理IP报头错误时,这两种操作系统也采取不同的方式。在这个过程中,将产生参数问题(Parameter Problem,类型12)信息,这样可以通过ICMP来区分UNIX堆栈和Microsoft堆栈。

ICMP地址掩码请求(Address Mask Request,类型16)只会被路由器通过地址掩码应答(Address Mask Reply,类型17)来回答。地址掩码请求可以识别各种路由器,并且可以收集子网的信息,它对于了解网络拓扑结构很有用。由于这种类型的ICMP报文只能用于本地主机查找子网掩码,因此显然应该作为受到防火墙屏蔽的首选ICMP类型。路由器厂商应该设计出一种路由软件,使其只对邻近的网络请求产生回应。

重定向报文(Redirect,类型5)用于调整路由表。假设用户的台式机所处的子网中有两台路由器,每一台路由器都连接到不同的网络中,那么用户的系统要将其中的一台路由器设置为默认路由器。这样,当发到另一台路由器的报文到达用户的主机时,首先来到默认路由器。该路由器会发送一个ICMP重定向报文到用户的主机,调整其路由表。根据到达路由器上的不同的信息,主机可能发送的代码有4种,其中包括主机重定向(代码0)或网络重定向(代码1)。

如果黑客可以向用户的主机发送ICMP重定向报文,那么它也可以调整用户的路由表,从而导致DoS攻击。例如,一些路由器产品不会转发从其他网络来的ICMP重定向信息,在远端屏蔽这种攻击。显然,重定向报文是一种必须被防火墙屏蔽的ICMP类型。

源结束报文(Source Quench,类型4)不能用于网络探测,但可以用于DoS攻击,即通知传输发送端降低发往接收端传输包的速率。它可以被发送到公用服务器,但最好不要将这类报文发送到用户的内部网络中。

一些安全意识强的组织往往会在防火墙配置中全面过滤入站的ICMP消息,这种情况下ICMP探测就会失效。然而大多数网络配置都不会对ICMP消息进行全面过滤,这是因为网络管理员经常要使用ICMP消息来解决网络的一些故障。ICMP其实很简单,其初衷是使IP网络平滑地工作。对于那些对安全性要求不高的网络,或者不需要防止端口扫描的网络,可以不考虑有关ICMP的问题;对于安全性至关重要的网络,则只能让尽可能少的ICMP类型通过防火墙。在选择所需ICMP协议的复选框后单击“接受”按钮。图10-9所示为Firestarter防火墙的工作界面。

图10-9 Firestarter防火墙工作界面

(5)定制安全策略。

可以随时根据网络情况定制Firestarter的安全策略,如图10-10所示。

图10-10 定制Firestarter的安全策略

通过定制安全策略可以决定哪些服务可以使用,哪些用户可以使用这些服务。一般来说不要启动Linux中所有服务,应当只启动必需的服务。有些服务,如Finger(查询账号)、Telnet及NFS都是相对不安全的,我们可以用一些安全的程序代替它们。例如,使用SSH代替Telnet。对于一些必须启动的服务应尽量升级到最新版本。

Firestarter防火墙是一款非常优秀的基于GUI图形用户界面且完全免费的自由软件,它为中小型Linux网络的系统管理员提供了良好的安全服务。其使用简单,但功能强大,运行时只占用很少的系统资源,它为Linux平台提供了快捷有效的安全防护功能。并且在系统出现异常情况时能及时地向管理员通知相关信息,以帮助系统管理员及时地对系统做出相应的处理和反应,Firestarter防火墙程序运行后在系统桌面的任务栏菜单处很容易启动和关闭网络中指定的计算机。其安装十分容易。有安装向导引导,即使是Linux软件不熟悉的用户也能通过向导轻松完成安装和设置。另外,Firestarter的README文件中的注释非常清楚,方便了用户的修改和重新定义某些参数。就像Firestarter的开发者Tomas Jounonen所说,它是一个“All-in-one”的Linux防火墙。总的来说,Firestarter防火墙适用于单机工作站及SOHO服务器的系统平台的安全防护,它能胜任在Linux下一般的系统安全任务。