我有一个Docker容器中的应用程序。 我有另一个Docker容器中的数据库。 数据库容器有一个暴露的端口49155.应用程序要求数据库暴露在3306端口,我不能改变,由于IonCube混淆。 所以,我可以将我的应用程序指向数据库容器,但应用程序无法find数据库(错误的端口)。
我最初的解决scheme是我们IPTables转发本地请求端口3306到远程容器端口49155使用:
iptables -t nat -A PREROUTING -p tcp --src 127.0.0.1 --dport 3306 -j REDIRECT --destination 192.168.200.212 --to-ports 49155
还是行不通。 有什么想法吗?
从应用服务器尝试:
iptables -t nat -I OUTPUT -p tcp --dst 192.168.200.212 --dport 3306 -j REDIRECT --to-ports 49155
和
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to-destination 192.168.200.212:49155
仍然没有运气。 还运行nmap -p 3306 -sT 192.168.200.212 ,它显示3306从应用程序服务器的angular度来看是封闭的。
如果我们参考NetFilter数据包stream程图 ,我们可以看到只有OUTPUT和POSTROUTING链会被本地进程生成的数据包引用。
所以,我会尝试这些行:
-t nat -A OUTPUT -p tcp --dst 192.168.200.212 --dport 3306 -j DNAT --to-destination 192.168.200.212:49155 -t nat -A POSTROUTING -p tcp --dst 192.168.200.212 --dport 3306 -j MASQUERADE
第一条规则“replace”目的IP:端口; 第二个规则“replace”源IP:端口。
你尝试过吗?
iptables -t nat -I OUTPUT -p tcp --dst 192.168.200.212 --dport 80 3306 -j REDIRECT --to-ports 49155
?
试试在DB服务器上的iptables,而不是
iptables -t nat -A PREROUTING -p tcp –dport 3306 -j REDIRECT – 到端口49155
我将在应用服务器端使用DNAT进行端口转发,将端口3306转发到端口49155:
iptables -t nat -A PREROUTING -p tcp -–dport 3306 -j DNAT --to 192.168.200.212:49155
要在数据库服务器端设置端口转发,我将使用:
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j REDIRECT --to-ports 49155
在这两种情况下--src 127.0.0.1在这里没有任何关系。
如果你想过滤源IP,在这两种情况下,– --src应该是应用服务器的IP地址。