9.4.2  使用iptables配置源NAT

在前面的有关章节中,已经介绍了路由和过滤数据包的方法,它们都不牵涉到对数据包的IP地址进行改变。但源NAT需要对内网出去的数据包的源IP地址进行转换,用公网IP代替内网IP,以便数据包能在Internet上传输。iptables的源NAT的配置应该是在路由和网络防火墙配置的基础上进行的。

iptables防火墙中有3张内置的表,其中的nat表实现了地址转换的功能。nat表包含PREROUTING、OUTPUT和POSTROUTING 3条链,里面包含的规则指出了如何对数据包的地址进行转换。其中,源NAT的规则在POSTROUTING链中定义。这些规则的处理是在路由完成后进行的,可以使用“-j SNAT”目标动作对匹配的数据包进行源地址转换。

在图9-10所示的网络结构中,假设让iptables防火墙承担NAT服务器功能。此时,如果希望内网10.10.1.0/24出去的数据包其源IP地址都转换外网接口eth0的公网IP地址218.75.26.35,则需要执行以下iptables命令。

 

# iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -o eth0 -j SNAT --to-source 218.75.26.35

 

以上命令中,“-t nat”指定使用的是nat表,“-A POSTROUTING”表示在POSTROUTING链中添加规则,“--to-source 218.75.26.35”表示把数据包的源IP地址转换为218.75.26.35,而根据-s选项的内容,匹配的数据包其源IP地址应该是属于10.10.1.0/24子网的。还有,“-o eth0”指定了只有从eth0接口出去的数据包才做源NAT转换,因为从其他接口出去的数据包可能不是到Internet的,不需要进行地址转换。

以上命令中,转换后的公网地址直接是eth0的公网IP地址。也可以使用其他地址,例如,218.75.26.34。此时,需要为eth0创建一个子接口,并把IP地址设置为218.75.26.34,使用的命令如下所示。

 

# ifconfig eth0:1 218.75.26.34 netmask 255.255.255.240

 

以上命令使eth0接口拥有两个公网IP。也可以使用某一IP地址范围作为转换后的公网地址,此时要创建多个子接口,并对应每一个公网地址。而“--to-source”选项后的参数应该以“a.b.c.x-a.b.c.y”的形式出现。

前面介绍的是数据包转换后的公网IP是固定的情况。如果公网IP地址是从ISP服务商那里通过拨号动态获得的,则每一次拨号所得到的地址是不同的,并且网络接口也是在拨号后才产生的。在这种情况下,前面命令中的“--to-source”选项将无法使用。为了解决这个问题,iptables提供了另一种称为IP伪装的源NAT,其实现方法是采用“-j MASQUERADE”目标动作,具体命令如下所示。

 

# iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -o ppp0 -j MASQUERADE

 

以上命令中,ppp0是拨号成功后产生的虚拟接口,其IP地址是从ISP服务商那里获得的公网IP。“-j MASQUERADE”表示把数据包的源IP地址改为ppp0接口的IP地址。

%注意:除了上面的源NAT配置外,在实际应用中,还需要配置其他一些有关iptables网络防火墙的规则,同时,路由的配置也是必不可少的。