nat端口映射(iptables配置——NAT地址转换)

nat端口映射

刹客网络科技资讯点击右侧关注,最新科技资讯!
ptables nat 原理
PREROUTING:目的DNAT规则
把从外来的访问重定向到其他的机子上,比如内部SERVER,或者DMZ。
系统先PREROUTING DNAT翻译——>再过滤(FORWARD)——>最后路由。
POSTROUTING:源SNAT规则
在路由以后在执行该链中的规则。
其match 源地址是翻译前的。
OUTPUT:定义对本地产生的数据包的目的NAT规则
========================内网访问外网 -J SNAT============================
-j SNAT
SNAT 只能用在nat表的POSTROUTING链里
-j SNAT –to-source ipaddr[-ipaddr][:port-port]
a single new source IP address
range of IP addresses
or you can add several –to-source options. a simple round-robin takes place between these adresses.
port range(only valid if the rule also specifies -p tcp or -p udp)
mapped to other ports below 512
-j MASQUERADE

iptables -t nat -A POSTROUTING –o eth1 –s 192.168.1.0/24 –j MASQUERADE

MASQUERADE –to-ports port[-port]
固定public 地址(外网接口地址)的最基本内访外SNAT

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT –to 你的eth0地址

多个内网段SNAT,就是多条SNAT语句即可

iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

非外网口地址为NAT用,必须先要绑定到接口上,如eth0 :1,eth0 :2
================================外网访问内网 –J DNAT===========================
DNAT
–to-destination ipaddr[-ipaddr][:port-port]
典型的DNAT的例子

外部接口ip:210.83.2.206

web服务器 : ip 192.168.1.4

iptables -t nat -A PREROUTING -d 210.83.2.206 -p tcp –dport 21 -j DNAT –to 192.168.1.3

DNAT静态映射
DNAT用于内部SERVER的load-balance(即CISCO的rotery)

iptables –t nat –A PREROUTING –d 219.142.217.161 –j DNAT –to-destination 192.168.1.24-192.168.1.25

DNAT 带端口映射(改变SERVER的端口)

iptables -t nat -A PREROUTING -p tcp -d 216.94.87.37 –dport 2121 -j DNAT –to-destination 192.168.100.125:21

通常外网DNAT访问内网SERVER,内网SERV ER回包的源地址是经过另一个单独的SNAT进程的。而不属于DNAT STATIC进程的一部分。
对于穿过NAT,被NAT映射改变端口号的应用,也必须用一个单独的SNAT对回包的端口进行映射

iptables -t nat -A POSTROUTING -p tcp -s 192.168.100.125 –sport 21 -j SNAT –to-source 216.94.87.37:2121

不这样做的话,FTP SERVER会返回21到外网的客户机,外网用户发出一个to 2121的FTP request,收到一个from 21的,会不认

/sbin/iptables -t nat -A POSTROUTING -s 10.4.0.0/16 -o $WAN_INT -j SNAT –to 124.126.86.137

DNAT照样要做RULE,DNAT只是翻译,仍要做ACCEPT。(而且注意是FORWARD,不是INPUT)

/sbin/iptables -A FORWARD -i $WAN_INT -m state –state NEW -p tcp –dport 9000 -j ACCEPT
/sbin/iptables -A FORWARD -i $WAN_INT -m state –state NEW -p tcp –dport 22 -j ACCEPT
##########NAT CHAIN###############
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp –dport 2022 -j DNAT –to-destination 10.4.3.150:22
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp –dport 9000 -j DNAT –to-destination 10.4.3.150:9000

DNAT的FORWARD RULE总是出错,原来:DNAT RULE是在PREROUTING语句之后执行的,即DNAT RULE要match翻译过来的新接口号

/sbin/iptables -A FORWARD -i $WAN_INT -m state –state NEW -p tcp –dport 9000 -j ACCEPT
/sbin/iptables -A FORWARD -i $WAN_INT -m state –state NEW -p tcp –dport 2022 -j ACCEPT
##########NAT CHAIN###############
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp –dport 2022 -j DNAT –to-destination 10.4.3.150:22
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp –dport 9000 -j DNAT –to-destination 10.4.3.150:9000

后来发现原来9000和9001都是端口不变的翻译,只有2022是由2022到22的翻译。
改正:

/sbin/iptables -A FORWARD -i $WAN_INT -m state –state NEW -p tcp –dport 9000 -j ACCEPT
/sbin/iptables -A FORWARD -i $WAN_INT -m state –state NEW -p tcp –dport 22 -j ACCEPT

==============================NAT troubleshooting===================================
-i ,-o 参数在NAT中的用途
对于POSTROUTING和OUTPUT,只能用-o,通常也是外网口
linux iptables通常都用外网口地址做NAT public地址
失败原因是,非外网口地址为DNAT用,必须要绑定到接口上,如eth0 :1,eth0 :2
连续public 地址SNAT (也要先绑定到子接口上eth0:x)

iptables –t nat –A POSTROUTING –s 192.168.1.0 –j SNAT –to-source 219.142.217.161-219.142.217.166

一段连续的地址,这样可以实现负载平衡。每个流会被随机分配一个IP。
不存在所谓的PAT。理由:没有PAT相关的RFC
Linux实现的就是完整的NAT和NAPT(可以进行端口替换,参见RFC3022)
源端口必须>1024

iptables –t nat –A POSTROUTING -p tcp,udp –s 192.168.1.0 –j SNAT –to-source 219.142.217.161:1024-32000

这样包的源端口就被限制在1024-32000了
端口转换限定

iptables –A POSTROUTING –o eth1 –s 192.168.1.0/24 –j MASQUERADE –to-ports 1024-30000

只转换1024以上低于30000的源端口
对于”内网访问内网SERVER在外网的地址”的特殊处理
o 防火墙收到这个向124.126.86.138请求后根据策略表匹配发现是一个对内部服务器10.4.3.150映射,防火墙会通过纯路由的方式将数据包转发给服务器 10.4.3.150
o 10.4.3.119收到这个包后会感觉很奇怪,因为它从来就没有给10.4.3.150发送过连接请求报文(他只给124.126.86.138)发送过,所以就会将回应报文丢弃

/sbin/iptables -t nat -A POSTROUTING -s 10.4.0.0/16 -o $WAN_INT -j SNAT –to 124.126.86.137
/sbin/iptables -t nat -A PREROUTING -d 124.126.86.138 -p tcp –dport 9001 -j DNAT –to-destination 10.4.3.150:9001
/sbin/iptables -t nat -A POSTROUTING -d 10.4.3.150 -j SNAT –to 10.4.0.198
这样就能从内部访问内部SERVER的外部地址

上例的另一种情况:禁止server在内网访问他自己在外网的公有地址
iptables -t nat -A PREROUTING -d 210.83.2.206 -s ! 192.168.1.24 -p tcp –dport 21 -j DNAT –to 192.168.1.24
 
NAT表删除 iptables -t nat -F

点分享

点收藏

点点赞

点在看

nat端口映射相关文章

赞 (0)
版权声明