iptables中的表nat
该表主要用于各种灵活的网络地址和端口转换。地址转换分为SANT(source network address translation)源地址转换和DNAT(destination network address translation)目标地址转换;端口转换则为REDIRCT。
在任何一个IP数据包的报头中,都会有Source IP Address与Destination IP Address这两个字段,数据包所经过的路由器也是根据这两个字段是判定数据包是由什么地方发过来的,它要将数据包发到什么地方去。iptables的原理就是通过更改其中的源地址Source IP或者目标地址Destination IP来达到我们想要的效果。
接着,我们再来看看数据包是在iptables表中要经过的链:
其中,菱形链为判断链,如果检测到其中的报文头部中的目标地址即destination为本机地址,则会直接将数据发送给input然后传送给本机;如果不是则继续传给forward链检测。所以,想让DNAT目标地址转换与REDIRECT端口转换生效,则必须在其经过routing decision判断前修改。即PREROUTING链上进行目标地址destination IP的转换;而源地址Source IP的转换,则需要在POSTROUTING链中进行
DNAT
功能:将访问本机或访问以本机作为网关机的主机的数据包头中的目标地址(Destination IP)由原来的目标地址替换成指定的目标地址。
例:
iptables -t nat -A PREROUTING -d 192.168.127.130 -j DNAT --to-destination 192.168.0.110
释义:-t 在nat表中 -A 添加到 PREROUTING链中 -d 原目标地址(Destination IP) -j 执行动作为DNAT(目标地址转换) –to-destination 转换到192.168.0.110
REDIRECT
功能:将访问本机或访问以本机作为网关机的主机的数据包头中的端口由原来的目标端口替换成指定的目标端口。
例:
iptables -t nat -A PREROUTING --dport 80 -p tcp -j REDIRCT --to -port 8080
释义:将发送到原目标端口80的数据发送到8080端口。在端口转发时还需指定传输层协议即tcp协议。
SNAT
功能:将经过本机或本网关机发出的数据报文的头部中的源地址(Source IP)替换为指定的源地址。
例:
iptables -t nat -A POSTROUTING -s 192.168.127.0/24 -j SNAT --to-source 192.168.0.110
释义:将源地址为192.168.127.0/24网段的数据包改为以192.168.0.110为源地址再发送。
应用场景:数据包以该网段的其他无法联网的网卡发出时,将其标记为能够联网的网卡再发送,然后在服务器返回数据的时候才能找到源地址,再由可联网的网卡转发回真实的源地址。否则,网关会找不到真实的源地址,就无法收到reply。在为伪装源地址时也会使用。
MASQUERADE
功能:与SNAT相同,但是MASQ更加智能。在MASQ设定好之后,即使IP地址发生变化,也不会影响,MASQ主要用于,拨号上网或DHCP模式等IP地址容易发生大变化的时候,尤其是网段都会变化的时候。
例:
iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
释义:将经过本机发出的所有数据报文的头部中的源地址替换为,ens33的IP地址-o为指定数据流出设备。
总结
DNAT与REDIRCT主要用于伪装服务器真实IP或端口时使用。
SNAT与MASQUERADE主要用于内网其他机器无法访问网络时用,将其他机器的内网地址转为公网地址。
DNAT
iptables -t nat -A PREROUTING -d 原目标地址 -j DNAT --to-destination 指定目标地址
REDIRECT
iptables -t nat -A PREROUTNG --dport 原目标端口 -j REDIRECT --to-port 指定目标端口
SNAT
iptables -t nat -A POSTROUTING -s 原源地址 -j SNAT --to-source 指定源地址
MASQUERADE
iptables -t nat -A POSTROUTING -o 指定流出网卡 -j MASQUERADE