NAT(网络地址转换)按照其使用场景分为SNAT,DNAT,主要用于实现LAN内主机与外部主机之间的通信。

NAT的功能主要通过IPtables中的表nat实现,nat表中包含PREROUTING、OUTPUT、POSTROUTIN三条链。
nat表主要用于源与目的IP 或 port 的转换:
    
PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
    POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
    OUTPUT:与发送出去的封包有关

LAN内主机与外部互相通信,封包要经过下面几个步骤:
    1. 先经过nat  table的PREROUTING链,该链用于修改目标IP;
    2. 经由路由判断确定这个封包是要进入本机与否,若不进入本机,则下一步;
    3. 再经过 filter table 的 FORWARD 链;
    4. 通过 nat table 的 POSTROUTING 链,该链用于修改源IP,最后传送出去。

SNAT:来源NAT,nat table的postrouting链修改源IP地址为public ip,LAN内多台主机共享一个公网地址与外部进行通信。
以下面的网络拓扑为例说明封包传送的过程:
    1. LAN PC想向WAN PC发送数据,此时源IP是LAN PC的地址192.168.3.3,目的IP是WAN PC的地址192.168.1.2,首先将这个包发送到网关也就是NAT服务器的私有地址192.168.3.2上,这就经过了nat prerouting链;
    2. NAT服务器分析这个数据包,目的地址不是自己,于是开始经过路由forward,将数据包转到连接网关的公网IP处;
    3. 数据包经过nat postrouting,将源IP更改为NAT服务器的公网地址192.168.2.2,目的地址不变,这样这个数据包就可以被外部主机识别。
同时NAT服务器记录一条NAT地址转换的记录(LAN PC 192.168.3.3与公网地址192.168.2.2之间的转换),然后将这个包发送出去;
    4. WAN PC接收到这个数据包后,响应数据包的源IP是192.168.1.2,目的IP是192.168.2.2,这个包到达NAT服务器后首先经过nat prerouting链,根据封包的序号和之前的NAT地址转换记录,将目的地址修改为LAN PC地址192.168.3.3,然后经过路由将这个包从私网地址192.168.3.2上发送给LAN PC,完成整个通信过程。

IPtables:配置SNAT实现IP共享,DNAT访问内部ftp服务器-LMLPHP
在NAT服务器上添加IPtables规则实现SNAT:
iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j SNAT --to-source 192.168.2.2
表示在nat中插入POSTROUTING链,将来自192.168.3.0/24网段的源地址都做SNAT转换成地址192.168.2.2
或者可以使用IP伪装来实现SNAT:
iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j MASQUERADE
表示将来自192.168.3.0/24网段的源地址都进行伪装,转换成公网地址
通过命令添加的iptables规则,在iptables服务重启之后会被清除,执行service iptables save可以将这些规则加入到配置文件/etc/sysconfig/iptables中,永久保存。



SNAT可以实现LAN内主机主动访问外部主机,然而外部主机并无法主动连接到内部LAN主机,假如LAN内部存在一台服务器,外部主机该如何访问到这台服务器呢?这就涉及到DNAT了。
DNAT:目的NAT,nat table的PREROUTING链修改目的IP,实现DMZ功能。
还是同样的网络拓扑,LAN PC 192.168.3.3上架设了一台ftp服务器,端口是21,WAN PC 192.168.1.2想要访问这个ftp服务器,经过一下几个步骤:
    1. WAN PC首先将请求包发送到NAT服务器的wan端,请求包的源IP是192.168.1.2,目的地址是NAT服务器的公网地址192.168.2.2,目的端口是21;
    2. 请求包经过nat表的PREROUTING链,NAT服务器上预设了一条port 21的nat规则,会将目的地址转换成LAN内服务器的地址192.168.3.3;
    3. NAT服务器分析这个包不是发给自己的,经过路由forward,从私网接口将这个包转发出去;
    4. LAN PC接收到请求包后,返回响应包给WAN PC,响应包的源IP是192.168.3.3,目的IP是192.168.1.2,经由NAT服务器后,再将源IP转换成pubic ip 192.168.2.2发送给WAN PC;

在NAT服务器上添加规则实现DNAT:
iptables -t nat -A PREROUTING -p tcp --dport 21 -j DNAT --to-destination 192.168.3.3:21
表示在nat表中添加prerouting规则,将目的端口是21的数据包都重定向到192.168.3.3这台主机的21号端口上
需要注意的是,添加这条规则后,WAN PC可以登录上ftp服务器,但是并不能读取ftp上的数据,这是因为21号端口是ftp的控制端口,数据端口并不是21。
ftp存在两种工作模式,PORT(主动)模式和PASV(被动)模式,主动模式下使用的数据端口是固定的20号端口,被动模式下数据端口是一系列随机的大于1024的非特权端口,ftp默认采用PASV模式,而且通过防火墙端口映射访问ftp的情况下只能使用PASV模式。
所以iptables除了允许21号端口的映射外,还要允许这些随机的数据端口的映射。
这些随机的数据端口并不需要像21号端口一样一条条地添加PREROUTING规则,只需要NAT服务器上支持ftp的端口转发就可以了:
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp

当然,NAT服务器作为一种路由器,必须开启数据转发功能才可能实现以上的nat功能:
/etc/sysctl.conf配置文件中使net.ipv4.ip_forward=1
sysctl -p
10-02 04:45