9.4 iptables防火墙的NAT配置
NAT(Network Address Translation,网络地址转换)是一项非常重要的Internet技术,它可以让内网众多的计算机访问Internet时,共用一个公网地址,从 而解决了Internet地址不足的问题,并对公网隐藏了内网的计算机,提高了安全性能。本章主要介绍利用iptables防火墙实现NAT的方法。
9.4.1 NAT简介
NAT并不是一种网络协议,而是一种过程,它将一组IP地址映射到另一组IP地址,而且对用户来说是透明的。NAT通常用于将内部私有的IP地址翻 译成合法的公网IP地址,从而可以使内网中的计算机共享公网IP,节省了IP地址资源。可以这样说,正是由于NAT技术的出现,才使得IPv4的地址至今 还足够使用。因此,在IPv6广泛使用前,NAT技术仍然还会广泛地应用。
1.NAT的工作原理
NAT的工作原理如图9-10所示。
(点击查看大图)图9-10 NAT服务器工作原理图 |
内网中IP为10.10.1.10的计算机发送的数据包其源IP地址是10.10.1.10,但这个地址是Internet的保留地址,不允许在 Internet上使用,Internet上的路由器是不会转发这样的数据包的。为了使这个数据包能在Internet上传输,需要把源IP地址 10.10.1.10转换成一个能在Internet上使用的合法IP地址,如218.75.26.35,才能顺利地到达目的地。
这种IP地址转换的任务由NAT服务器完成,运行NAT服务的主机一般位于内网的出口处,至少需要有两个网络接口,一个设置为内网IP,一个设置为 外网合法IP。NAT服务器改变出去的数据包的源IP地址后,需要在内部保存的NAT地址映射表中登记相应的条目,以便回复的数据包能返回给正确的内网计 算机。
当然,从Internet回复的数据包也并不是直接发送给内网的,而是发给了NAT服务器中具有合法IP地址的那个网络接口。NAT服务器收到回复 的数据包后,根据内部保存的NAT地址映射表,找到该数据包是属于哪个内网IP的,然后再把数据包的目的IP转换回来,还原成原来的那个内网地址,最后再 通过内网接口路由出去。
以上地址转换过程对用户来说是透明的,计算机10.10.1.10并不知道自己发送出去的数据包在传输过程中被修改过,只是认为自己发送出去的数据 包能得到正确地响应数据包,与正常情况没有什么区别。
通过NAT转换还可以保护内网中的计算机不受到来自Internet的攻击。因为外网的计算机不能直接发送数据包给使用保留地址的内网计算机,只能 发给NAT服务器的外网接口。在内网计算机没有主动与外网计算机联系的情况下,在NAT服务器的NAT地址映射表中是无法找到相应条目的,因此也就无法把 该数据包的目的IP转换成内网IP。
说明:在有些情况下,数据包还可能会经过多次的地址转换。
2.动态NAT
以上介绍的NAT也称为源NAT,即改变数据包的源IP地址,通常也称为静态NAT,它用于内网的计算机共用公网IP上网。还有一种NAT是目的 NAT,改变的是数据包的目的IP地址,通常也称为动态NAT,它用于把某一个公网IP映射为某一内网IP,使两者建立固定的联系。当Internet上 的计算机访问公网IP时,NAT服务器会把这些数据包的目的地址转换为对应的内网IP,再路由给内网计算机。
3.端口NAT
另外还有一种NAT称为端口NAT,它可以使公网IP的某一端口与内网IP的某一端口建立映射关系。当来自Internet的数据包访问的是这个公 网IP的指定端口时,NAT服务器不仅会把数据包的目的公网IP地址转换为对应的内网IP,而且会把数据包的目的端口号也根据映射关系进行转换。
除了存在单独的NAT设备外,NAT功能还通常被集成到路由器、防火墙等设备或软件中。iptables防火墙也集成了NAT功能,可以利用NAT 表中的规则链对数据包的源或目的IP地址进行转换。下面两个小节将分别介绍在iptables防火墙中实现源NAT和目的NAT的方法。
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网络防火墙的规则,同时,路由的配置也是必不可少的。
9.4.3 使用iptables配置目的NAT
目的NAT改变的是数据包的目的IP地址,当来自Internet的数据包访问NAT服务器网络接口的公网IP时,NAT服务器会把这些数据包的目 的地址转换为某一对应的内网IP,再路由给内网计算机。这样,使用内网IP地址的服务器也可以为Internet上的计算机提供网络服务了。
如图9-11所示,位于子网10.10.1.0/24的是普通的客户机,它们使用源NAT访问Internet。而子网10.10.2.0/24是 服务器网段,里面的计算机运行着各种网络服务,它们不仅要为内网提供服务,而且要为Internet上的计算机提供服务。但由于使用的是内网地址,因此需 要在NAT服务器配置目的NAT,才能让来自Internet的数据包能顺利到达服务器网段。
图9-11 用于目的NAT配置的例子网络结构 |
假 设IP为10.10.2.3的计算机需要为Internet提供网络服务,此时,可以规定一个公网IP地址,使其与10.10.2.3建立映射关系。假设 使用的公网IP是218.75.26.34,则配置目的NAT的命令如下:
- # iptables -t nat -A PREROUTING -i eth0 -d
218.75.26.34/32 -j DNAT --to 10.10.2.3
以上命令是在PREROUTING链中添加规则,这条链位于路由模块的前面,因此是在路由前改变了数据包的目的IP,这将对路由的结果造成影响。由 于网络接口eth0与Internet连接,因此,"-i eth0"保证了数据包是来自Internet的数据包。"-d 218.75.26.34/32"表示数据包的目的地是到218.75.26.34主机,而这个IP应该是eth0某个子接口的地址,这样才能由NAT服 务器接收数据包,否则,数据包将会因为无人接收而丢弃。
"-j DNAT"指定了目标动作是DNAT,表示要对数据包的目的IP进行修改,它的子选项"--to 10.10.2.3"表示修改后的IP地址是10.10.2.3。于是,目的IP修改后,接下来将由路由模块把数据包路由给10.10.2.3服务器。
以上是让一个公网IP完全映射到内网的某个IP上,此时同10.10.2.3主机直接位于Internet,并且使用218.75.26.34地址 是没有区别的。因此这种方式虽然达到了地址转换的目的,但实际上并没有带来多大好处,因为使用NAT的主要目的是为了能够共用公网IP地址,以节省日益紧 张的IP地址资源。为了达到共用IP地址的目的,可以使用端口映射。
端口映射是把一个公网IP地址的某一端口映射到内网某一IP地址的某一端口上去。它使用起来非常灵活,两个映射的端口其端口号可以不一样,而且同一 个公网IP的不同端口可以映射到不同的内网IP地址上去。
例如,假设主机10.10.2.3只为外网提供Web服务,因此,只需要开放80端口,而主机10.10.2.9为外网提供了FTP服务,因此需要 开放21号端口。在这种情况下,完全可以把公网IP地址218.75.26.34的80号和21号端口分别映射到10.10.2.3和10.10.2.9 的80号和21号端口,以便两台内网服务器可以共用一个公网IP。具体命令如下所示。
- # iptables -t nat -A PREROUTING -i eth0 -d
218.75.26.34/32 -p tcp --dport 80 -j DNAT --to 10.10.2.3:80- # iptables -t nat -A PREROUTING -i eth0 -d
218.75.26.34/32 -p tcp --dport 21 -j DNAT --to 10.10.2.9:21
以上命令中,目的地址是218.75.26.34的TCP数据包。当目的端口是80时,将转发给10.10.2.3主机的80端口;当目的端口是 21时,将转发给10.10.2.9主机的21号端口。当然,两个映射的端口完全可以不一样。例如,如果还有一台主机10.10.2.8也通过80端口提 供Web服务,并且映射的IP地址也是218.75.26.34,此时需要把218.75.26.34的另一个端口,如8080,映射到 10.10.2.8的80端口,命令如下:
- # iptables -t nat -A PREROUTING -i eth0 -d
218.75.26.34/32 -p tcp --dport 8080 -j DNAT --to 10.10.2.8:80
注意:上面介绍的只是有关iptables中的DNAT配置,在实际应用中,还需要其他一些配置的配合才能真正成功。例如,filter表的3个链 应该允许相应的数据包通过,应该为每一个外网IP创建eth0接口的子接口等。
此外,对于FTP服务来说,由于21号端口只是建立控制连接时用到的端口,真正传输数据时要使用其他端口。而且在被动方式下,客户端向FTP服务器 发起连接的端口号是随机的,因此,无法通过开放固定的端口来满足要求。为了解决这个问题,可以在Linux系统中载入以下两个模块。
- modprobe ip_conntrack_ftp
- modprobe ip_nat_ftp
这两个模块可以监控FTP控制流,以便能事先知道将要建立的FTP数据连接所使用的端口,从而可以允许相应的数据包通过,即使防火墙没有开放这个端 口。
【责任编辑:云霞 TEL:(010)68476606】