在传统的标准的TCP/IP通信过程中,所有的路由器仅仅是充当一个中间人的角色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改,更为确切的说,除了将源MAC地址换成自己的MAC地址以外,路由器不会对转发的数据包做任何修改。NAT (Network Address Translation,网络地址转换)恰恰是出于某种特殊需要而对数据包的源ip地址、目标ip地址、源端口、目标端口进行改写的操作。利用iptables的内置表NAT可以实现上述功能
iptables NAT的三个链:PREROUTING,POSTROUTING,OUTPUT
PREROUTING:可以在这里定义进行目标地址NAT的规则,因为路由器进行路由时只检查数据包的目标ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT
POSTROUTING:可以在这里定义进行源地址NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则
OUTPUT:定义对本地产生的数据包的目的NAT规则
注:在CentOS 7中NAT表增加了INPUT链,源地址转换(SNAT)也可以写在INPUT链上
NAT处理的动作选项
SNAT:源地址转换,改变数据包的源地址,常接选项--to-source
DNAT:目标址转换,改变数据包的目标地址,常接选项--to-destination
MASQUERADE:地址伪装,适用于ADSL等动态拨号上网的IP伪装
REDIRECT:端口映射,通常用实现透明代理和对外开放内网某些服务,常接选项--to-ports
三个链支持的处理动作
PRERROUTING:DNAT,REDIRECT 对目标地址进行修改,支持-o选项(路由之前)
POSTROUTING:SNAT,MASQUERADE 对源地址进行修改,支持-i选项(路由之后)
OUTPUT:DNAT,REDIRECT 处理来自NAT主机本身生成的出站数据包(本机)
要实现NAT,首先要打开核心转发功能
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
想要永久生效的话,编辑/etc/sysctl.conf文件,修改成net.ipv4.ip_forward = 1,然后执行sysctl -p可以立即生效
NAT不同处理动作的配置
1.SNAT:隐藏内网主机ip地址,也可以实现共享公网ip上网
eg:
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 172.16.8.9
源地址是192.168.1.0/24转化成172.16.8.9
2.DNAT:可以通过公网ip访问局域网内的服务
eg:
[root@localhost ~]# iptables -t nat -A PREROUTING -d 172.16.8.9 -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.9:8080
访问172.16.8.9的80端口时,会映射到192.168.1.9的8080端口
3.MASQUERADE:ADSL拨号上网,可以认为是SNAT的一种特殊情况(转换地址是动态的)
eg:
[root@localhost ~]# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
4.REDIRECT:在本机上进行端口映射,可以认为是DNAT的一种特殊情况(目标地址是本机)
eg:
[root@localhost ~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 21 -j REDIRECT --to-ports 2121
访问本机21端口时,会被映射到2121端口
本文介绍了iptables的NAT功能,用于改变数据包的源和目标IP地址及端口。详细讲解了NAT的PREROUTING、POSTROUTING、OUTPUT三个链,以及如何通过SNAT、DNAT、MASQUERADE和REDIRECT实现地址转换和端口映射。通过开启Linux系统的IP转发,并配置相应的iptables规则,可以实现内网主机的公网访问和共享IP上网等功能。
671

被折叠的 条评论
为什么被折叠?



