使用 IPTables 将一个端口上的本地请求转发到另一个端口上的远程服务器

使用 IPTables 将一个端口上的本地请求转发到另一个端口上的远程服务器

我在 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

相关内容