通过iptables进行端口映射,可以实现发送给A机器指定端口的请求被转发到B机器上。
设置入路径的转发规则:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8080 -j DNAT --to xx.xx.xx.xx:80
设置出路径的转发规则:
iptables -t nat -A POSTROUTING ! -o lo -j MASQUERADE
注意:如果不排除掉lo,会导致DNS解析无法正常工作,DNS的缓存机制会用到lo接口。
完成上面的设置,就可以实现从机器S访问机器A的8080端口,而实际访问到的是机器B的80端口。但是却不能直接在机器A上访问本地的8080端口,原因在于PREROUTING是在数据包到达A机器的程序进程之前,而如果我们使用ping、telnet、curl之类在机器A上操作,数据包是从程序进程出发的,已经跳过了PREROUTING,此时我们需要在OUTPUT链的nat表中添加规则:
iptables -t nat -A OUTPUT -p tcp -m tcp --dport 8080 -j DNAT --to xx.xx.xx.xx:80 -m comment --comment '本地转发'
这样就实现了,无论外部访问,还是本机访问,都能将请求转发到外部其他机器的效果。