背景

由于有些时候我们无法直接连接到应用机器的某些端口,所以需要使用流量包/连接转发才能实现。

 

解决方案

由于linux有iptables这个工具,而且iptables可以编写nat转发规则,所以我们选择iptables的nat表来实现转发效果。

 

实现原理

由于连接内部端口(如Mysql或postgres)需要一次完整的tcp连接,所以我们需要在nat表中加入两条相反的规则。一条负责外部向内的通路,一条负责内部向外的通路。当一个完整的tcp连接被模拟出来的时候,就可以实现端口的转发了。

 

具体操作

按照以下模板修改具体信息,并执行。

MYSQLIP='x.x.x.x'           #修改此ip为Mysql主机的内网ip
NGINX='x.x.x.x'             #修改此ip为nginx主机的内网ip
iptables -t nat -A PREROUTING -p tcp --dport 5432 -j DNAT --to-destination $MYSQLIP             #从外向内的规则
iptables -t nat -A POSTROUTING -p tcp --dst $MYSQLIP --dport 5432 -j SNAT --to-source $NGINX    #从内向外的规则

iptables-save > /etc/iptables      #保存iptables规则到/etc/iptables文件
iptables-restore < /etc/iptables   #加载刚才保存的文件到系统内核,修改iptables规则

 

补充

iptables的nat表里,有3个不同的规则链,分别是:
POSTROUTING
FORWARD
PREROUTING

这三个规则的意思分别是:

POSTROUTING: 用于修改源地址,即将源地址的公网ip修改为内网ip。

FORWARD: 流量转发。

PREROUTING: 用于修改目的地址,即将目的地址的内网ip修改为公网ip。

 

流量包从外网进来,会依次经过POSTROUTING->FORWARD->PREROUTING三条链,然后才可以正确地进行转发。

posted on 2020-04-26 14:34  eryoung2  阅读(440)  评论(0编辑  收藏  举报