与主机防火墙不一样,保护网络的防火墙一般有多个网络接口,而且绝大部分的规则应该添加在filter表的FORWARD链中,其配置要比主机防火墙复杂得多。为了使iptables承担网络防火墙的角色,首先要确保Linux能够在各个网络接口之间转发数据包,其方法是输入以下命令,使ip_forward文件的内容为1。
echo "1">/proc/sys/net/ipv4/ip_forward
上述命令的结果在系统重启后会失效。为了使系统在每次开机后能自动激活IP数据包转发功能,需要编辑配置文件/etc/sysctl.conf,它是RHEL 5的内核参数配置文件,其中包含了ip_forward参数的配置。具体方法是确保在/etc/sysctl.conf文件中有以下一行:
net.ipv4.ip_forward = 1
即原来的值如果是0的,现把它改为1。然后执行以下命令使之生效:
# sysctl -p
上述命令的功能是实时修改内核运行时的参数。IP数据包转发功能激活后,就可以设置网络防火墙规则了。下面以图9-8所示的网络结构为例,介绍iptables网络防火墙的配置方法。
在图9-8中,安装了iptables的Linux主机安装了3块网卡。其中,eth0的IP地址是192.168.0.1,它通过一台网关设备与Internet连接;eth1的IP地址是10.10.1.1,它与子网10.10.1.0/24连接;eth2的IP地址是10.10.2.1,它连接的子网是10.10.2.0/24。
图9-8 用于网络防火墙配置的例子网络
现假设10.10.1.0/24子网里运行的是为外界提供网络服务的服务器,而10.10.2.0/24子网里的计算机是用户上网用的客户机。对于服务器来说,它向外提供服务的端口号是固定的,为了保证其安全,应该只开放这些端口,即只允许目的端口是这些端口的数据包进入服务器子网,其余的数据包一律禁止。下面是一些在防火墙上执行的保护服务器子网的iptables命令。
iptables -A FORWARD -p tcp --dport 22 -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -p tcp --dport 25 -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -p tcp --dport 80 -i eth0 -o eth1 -j ACCEPT
假设服务器子网采用默认端口为外界提供了SSH、SMTP、DNS和HTTP服务,以上4条命令在filter表的FORWARD链中加入了4条规则,允许从eth0网进入、到eth1网卡,并且协议和目的端口分别是TCP22、TCP25、UDP53和TCP80的数据包通过,这些协议和端口对应了该子网提供的网络服务。
以上4条命令确定了从eth0到eth1转发数据包的规则。这些数据包是进入服务器子网的数据包,而从服务器子网出去的数据包目前还是畅通无阻的,因为FORWARD链中还没有规则对eth1到eth0的数据包做任何限制。
需要注意的是,前面的规则规定了放行哪些数据包后,最后必须要有一条规则拒绝所有的数据包。否则,即使数据包与前面所有的规则都不匹配,最后也照样能被转发。因此,为了达到保护服务器子网的目的,还需要执行以下命令。
iptables -A FORWARD -i eth0 -o eth1 -j DROP
以上命令把从网卡eth0到eth1的数据包全部丢弃,当然,这些数据包是那些与前面的规则都不匹配的数据包。此外,也可以用以下命令指定FORWARD链的默认目标动作来代替上述命令。
iptables -P FORWARD DROP
上面命令的意思是与所有规则都不匹配的数据包将采用DROP目标动作予以丢弃,对于只保护服务器子网的防火墙来说,可以这样做。
%注意:由于图9-8的网络结构中还要为10.10.2.0/24子网的客户机提供上网服务。如果设定默认目标动作为DROP,需要添加明确的规则放行该子网的数据包。
另外,如果发现某些计算机,如IP为11.22.33.44的计算机对服务器子网有攻击行为,防火墙可以不转发这些数据,把它阻挡在防火墙的外面,命令如下:
iptables -A FORWARD -i eth0 -o eth1 -s 11.22.33.44 -j DROP
或者如果发现服务器子网发往某一台主机,如55.66.77.88的数据流量特别大,出现了异常情况,可以执行以下命令,限制其流量。此时,数据流向应该是从eth1到eth0。
iptables -A FORWARD -i eth1 -o eth0 -d 55.66.77.88 -m limit --limit 60/m --limit-burst 80 -j ACCEPT
网卡eth0收到的是来自Internet的数据包,因此,对它们作了严格的限制。但对于来自10.10.2.0/24子网的数据包来说,其限制应该相对宽松,因为它是内网。下面是几条有关内网到服务器子网的转发规则的设置命令。
iptables -A FORWARD -i eth2 -o eth1 -m multiport --dport 1:1024,2049,32768 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth1 -s 10.10.2.2 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth1 -s 10.10.2.3 -j ACCEPT
上面的第一条命令允许来自eth2网卡的数据包转发到服务器子网eth1网卡,前提是数据包的目的端口号是1至1024、2049或者32768。1至1024包含了大部分网络服务默认使用的端口,2049和32768是NFS服务器工作时需要开放的端口。第二条和第三条命令允许源IP地址是10.10.2.2或10.10.2.3数据包通过,这两台计算机可能是由管理员使用的。
也有一些服务要使用1024号以上的端口,可以采用类似的命令加入规则,以开放这些端口。最后,如果不是采用-P选项指定默认的DROP策略,还需要在FORWARD链中加入以下命令,以拒绝所有不匹配的数据包。
iptables -A FORWARD -i eth2 -o eth1 -j DROP
上面的这条命令也可以和前面的“iptables -A FORWARD -i eth0 -o eth1 -j DROP”命令合并在一起,成为以下命令。
iptables -A FORWARD -o eth1 -j DROP
显然,上面这条命令指定的规则应该放在最后的位置。另外,每一台主机还可以根据自己的特点设置自己的主机防火墙,以提供更多的保护。