我在 Docker 容器中有一个应用程序。我在另一个 Docker 容器中有一个数据库。数据库容器有一个公开端口 49155。应用程序要求数据库在端口 3306 上公开,由于 IonCube 混淆,我无法更改这一点。因此,我可以很好地将应用程序指向数据库容器,但应用程序找不到数据库(错误端口)。
我最初的解决方案是使用 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 已关闭。
答案1
如果我们参考NetFilter 数据包流图,我们可以看到只有输出和路由后对于本地进程生成的数据包将引用链。
因此,我会尝试以下几行:
-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
第一条规则‘替换’目标IP:端口;第二条规则‘替换’源IP:端口。
答案2
你试过
iptables -t nat -I OUTPUT -p tcp --dst 192.168.200.212 --dport 80 3306 -j REDIRECT --to-ports 49155
?
答案3
尝试在数据库服务器上使用 iptables,例如
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j REDIRECT --to-ports 49155
答案4
我遇到了类似的问题。我的解决方案(基于https://serverfault.com/a/566852/475571):
-t nat -A OUTPUT -p tcp --dst 127.0.0.1 --dport 3306 -j DNAT --to-destination 192.168.200.212:49155
-t nat -A POSTROUTING -p tcp --dst 192.168.200.212 --dport 49155 -j MASQUERADE