iptables之NAT

来源:互联网 发布:如何申请网址域名 编辑:程序博客网 时间:2024/05/22 15:58

在传统的标准的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端口