背景
由于有些时候我们无法直接连接到应用机器的某些端口,所以需要使用流量包/连接转发才能实现。
解决方案
由于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三条链,然后才可以正确地进行转发。
About me: 资深大猪蹄子