3.1 SNAT 策略及应用
Linux 防火墙在很多时候承担着连接企业内、外网的重任,除了提供数据包过滤功能以
外,还提供一些基本的网关应用。本章将学习 Linux 防火墙的 SNAT 和 DNAT 策略,分别
掌握两个典型的应用:局域网共享一个公网 IP 地址接入 Internet ;向 Internet 发布位于内网
的应用服务器。本章还将学习防火墙脚本的使用。首先介绍的是 SNAT 策略及应用。
SNAT ( Source Network Address Translation ,源地址转换)是 Linux 防火墙的一种地
址转换操作,也是 iptables 命令中的一种数据包控制类型,其作用是根据指定条件修改数据
包的源 IP 地址。
3.1.1 SNAT 策略概述
随着 Internet 网络在全世界范围内的快速发展, IPv4 协议支持的可用 IP 地址资源逐渐
变少,资源匮乏使得许多企业难以申请更多的公网 IP 地址,或者只能承受一个或者少数几
个公网 IP 地址的费用。而与此同时,大部分企业面临着将局域网内的主机接入 Internet 的
需求。
通过在网关中应用 SNAT 策略,可以解决局域网共享上网的问题。下面以一个小型的
企业网络为例。 Linux 网关服务器通过两块网卡 ens33 、 ens37 分别连接 Internet 和局域网,
如图 3.1 所示,分析局域网主机访问 Internet 的情况。
1 .只开启路由转发,未设置地址转换的情况
正常情况下,作为网关的 Linux 服务器必须打开路由转发,才能沟通多个网络。未使用
地址转换策略时,从局域网 PC (如 192.168.1.234 )访问 Internet 的数据包经过网关转发
后其源 IP 地址保持不变,当 Internet 中的主机收到这样的请求数据包后,响应数据包将无
法正确返回(私有地址不能在 Internet 中正常路由),从而导致访问失败
3.1.2 SNAT 策略的应用
从上一小节的介绍中,我们大致可以了解, SNAT 的典型应用是为局域网共享上网提供
接入策略,处理数据包的切入时机是在路由选择之后( POSTROUTING )进行。关键操作
是将局域网外发数据包的源 IP 地址(私有地址)修改为网关服务器的外网接口 IP 地址(公
有地址)。
SNAT 策略只能用在 nat 表的 POSTROUTING 链,使用 iptables 命令编写 SNAT 策略
时,需要结合 “--to-source IP 地址 ” 选项来指定修改后的源 IP 地址(如 -j SNAT --to-source
218.29.30.31 )。下面通过两个实例来说明 SNAT 策略的具体用法。
在测试过程中,若只希望临时开启路由转发,也可以执行以下操作。
或者
( 2 )正确设置 SNAT 策略。
通过分析得知,需要针对局域网 PC 访问 Internet 的数据包采取 SNAT 策略,将源地址
更改为网关的公网 IP 地址,参考以下操作在网关中设置防火墙规则。若要保持 SNAT 策略
长期有效,应将相关命令写入到 rc.local 配置文件,以便开机后自动设置。
2 .共享动态 IP 地址上网
在某些情况下,网关的外网 IP 地址可能并不是固定的,如使用 ADSL 宽带接入时。那
么在这种网络环境下,应该如何设置 SNAT 策略呢?针对这种需求, iptables 命令提供了一
个名为 MASQUERADE (伪装)的数据包控制类型, MASQUERADE 相当于 SNAT 的一个
特例,同样用来修改(伪装)数据包源 IP 地址,只不过它能够自动获取外网接口的 IP 地址,
而无须使用 “--to-source” 指定固定的 IP 地址。
参照上一个 SNAT 案例,若要使用 MASQUERADE 伪装策略,只需去掉 SNAT 策略中 的 “--to-source IP 地址 ” ,然后改用 “-j MASQUERADE” 指定数据包控制类型。对于 ADSL 宽
带连接,连接名称通常为 ppp0 、 ppp1 等。
( 2 )正确设置 DNAT 策略。
通过分析得知,需要针对 Internet 中的任意主机访问网关 80 端口的数据包,将目标地
址修改为位于内网的网站服务器的 IP 地址,网关的防火墙参考规则如下所示。
( 3 )正确设置 DNAT 策略。
通过分析得知,网关本机的 sshd 服务直接面向 Internet ,因此不需要地址转换,但网
站服务器位于内网,必须通过 DNAT 策略进行发布。在网关中设置防火墙规则,修改访问
外网 IP 地址 2346 端口的数据包,将目标地址改为 192.168.1.6 ,将目标端口改为 22 ,以
便转发给网站服务器。
1 . iptables-save 命令
iptables-save 命令用来批量导出 Linux 防火墙规则。直接执行 iptables-save 命令时,
将显示出当前启用的所有规则。
在 iptables-save 命令的输出信息中,以 “#” 号开头的内容表示注释, “* 表名 ” 表示所在的
表, “: 链名 默认策略 ” 表示相应的链及默认策略,具体的规则部分省略了命令名 “iptables” ,
后面的 “COMMIT” 表示提交前面的规则设置。
由于 iptables-save 命令只是把规则内容输出到屏幕上,因此当需要保存为固定的文件
时,还应该结合重定向输出的操作以完成备份。例如,若要将当前已设置的所有防火墙规则
备份为 /opt/iprules_all.txt 文件,可以执行以下操作。
2 . iptables-restore 命令
iptables-retore 命令用来批量导入 Linux 防火墙规则,如果已经使用 iptables-save 命令
导出的备份文件,则恢复规则的过程在一瞬间就能完成。与 iptables-save 命令相对的
iptables-restore 命令应结合重定向输入来指定备份文件的位置。
3.3.2 使用 iptables 服务
通过名为 iptables 的系统服务,可以快速启用、清空防火墙规则。 iptables 服务使用的
规则文件位于 /etc/sysconfig/iptables 文件中,配置格式与 iptables-save 命令输出的一致。
1 .自动启用防火墙规则
在服务器中调试好各种 iptables 规则以后,使用 iptables-save 备份为默认的规则配置
文件 /etc/sysconfig/iptables ,然后就可以通过 iptables 服务来调用。例如,执行以下操作将
保存当前的防火墙规则,并设置在每次开机后根据已保存的规则内容自动进行重建。