Linux下模拟验证NAT功能
NAT(网络地址转换)功能能够方便内网与外网(通常是Internet)连接,既减少了有效IP的使用量又保护了内网主机的信息。
Linux下的NAT功能嵌入在Linux最新一代防火墙Netfilter中,并提供给用户操作接口Iptables,相关知识可以查看网上资料。
最近我通过两台安装了Linux的电脑搭建环境,验证了NAT功能的正确性。(我也是有够无聊的….)
环境搭建
正常的NAT的流程如上图所示,处于内网的主机PC2(10.0.0.2)要给外网的PC1发送数据,传包的时候一开始源地址为(10.0.0.2),经过NAT主机的时候服务器会把源地址改为(172.16.93.129)这样PC1收到数据的时候将按照目的地址为(172.16.93.129)来发送包(目的IP地址为局部内网的包是无法正确传输的)。
我现在稍微修改了上图的结构,变为(文章中IP为虚构):
因此相当于一台电脑里面包含了一个内部网址(相当于内部服务器),现在我需要通过外网主机(166.111.33.21)的访问主机(166.111.33.25)的内网服务器(192.168.10.10),但是对于外网主机A来说只知道B的主机外网IP,想要访问主机B的内网服务的话就是不行的,因此需要NAT的功能来进行地址转换。
添加虚拟网卡
这里顺便提一下Linux中如何添加一块虚拟网卡
首先修改网卡配置文件,Ubuntun下,网卡的配置文件是/etc/network/interfaces
在这个文件中增加如下内容并保存:auto eth1 iface eth1 inet static address 192.168.10.10 netmask 255.255.255.0
重启网卡(重新加载配置文件)才会生效,使用如下命令重启:
sudo /etc/init.d/networking restart
配置NAT
搭建好环境之后需要就开始配置NAT功能,在主机B中需要用iptables来实现NAT。
为了保证发送个主机B(166.111.33.25)的数据包能够转发给内网的服务器(192.168.10.10),我们首先配置如下命令:
DNAT:iptables -t nat -A PREROUTING -p tcp -j DNAT –to-destination 192.168.10.10
上述命令表示在发送到主机B的数据包若是属于tcp连接的进入目的地址转换,目的地址要变成192.168.10.10
同时我们还可以实现SNAT,即服务器发出数据包的时候将源地址变为主机B的166.111.33.25,命令如下:
iptables -t