iptables中NAT表

iptables是我们在实际生产环境中大量的使用的工具,它能对进出主机的数据进行过滤以及转发等等,我们在平时用的比较多的就是iptables的net表和filter表,在这里就简要的讲解下iptables的nat表,来实现主机上的路由转发,如果对iptables还不是很了解的可以上网去搜索会有很多详细的资料。

nat表是对进出主机的ip或端口进行转发,在这里必须要知道的是在linux系统中ip地址并不属于某一张网卡的,而是属于linux主机的内核的所以在linux系统里ip是可以转换的,其实在我们平时用的路由器或者是刷的软路由都是基于linux的iptables来实现的,在使用iptables的nat表之前需要开启内核ip地址转发的功能
[root@test ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
#或者是直接vim编辑把net.ipv4.ip_forward=0改成1
然后再使之生效
[root@test ~]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

在其中呢我们会用到3种状态MASQUERADE、DNAT、SNAT和3条链PREROUTING,POSTROTING,OUTPUT。
 我们将我们内网的地址转换为一个外网的IP时有2中方式要用在POSTROUTING链上,其中MASQUERADE是源地址伪装,一般用在ADSL动态上网的环境中把做地址转发,他会自动识别内核中的地址,但是如果你是用静态ip或者是某一个内网中的ip做转发尽量不要用这种方式,以节省系统开销
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0] 
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
#这里就是把10.8.0.0/24网段的ip动态识别eth0网卡上的地址转发出去
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source 192.168.168.253
#这一条的意思是把10.8.0.0/24网段的ip通过eth0都转发成192.168.168.253

要注意的是如果用SNAT转发出去的话就必须用--to-source ip给转发出去。
  以上2种的都是ip地址由内到外的转发,如果在一个公网1.1.1.1中的局域网里的一个内网172.32.0.0/24中的172.32.0.1要访问10.8.0.0/24网段中的10.8.0.1那我们就要在PREROUTING链上做DNAT了,当然要在1.1.1.1的局域网内先做好SNAT
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 172.32.0.1 -o ehth0 -j SNAT --to-source 1.1.1.1

192.168.168.0/24的局域网内做DNAT,当然filter表中的如口也要做好还要做好其中的forward链
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -d 192.168.168.253 -i ehh0 -j DNAT --to-destination 10.8.0.1
#把到192.168.168.253转发成10.8.0.1

这样172.32.0.0/24网段中的172.32.0.1就可以访问10.8.0.0/24网段中的10.8.0.1了,要注意的是在DNAT中是可以限制tcp或者是udp的某一个端口的进出的,如果是只让172.32.0.0/24网段中的172.32.0.1访问10.8.0.0/24网段中的10.8.0.1的http服务那就只开放80端口
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -d 192.168.168.253 -i ehh0 -p tcp --dport 80 -j DNAT --to-destination 10.8.0.1

或者是我要把10.8.0.0/24网段中的10.8.0.1的http服务端口映射出去不用标准端口,如8080就
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -d 192.168.168.253 -i ehh0 -p tcp --dport 8080 -j DNAT --to-destination 10.8.0.1:80

所以在DNAT中是支持端口映射的,这样就可以实现内网中的DZM区和非DZN区的保护

更多iptables相关教程见以下内容

猜你喜欢

转载自www.linuxidc.com/Linux/2016-08/134590.htm