Iptables 将 localhost:3306 路由到 remoteip:3306

Iptables 将 localhost:3306 路由到 remoteip:3306

我有多个网站连接到localhostmySQL(默认 3306 端口)。计划是转储并导入到外部服务器,1.1.1.1我如何localhost:3306使用 IP 表临时路由(直到重新启动)所有流量到1.1.1.1:3306

我努力了

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to 2.2.2.2:3306
iptables -t nat -A POSTROUTING -d 2.2.2.2 -j MASQUERADE

答案1

请注意,Linux 上的 MySQLlocalhost有以下特殊之处:

在 Unix 上,MySQL 程序对主机名进行localhost特殊处理,与其他基于网络的程序相比,其处理方式可能与您预期的不同:客户端使用 Unix 套接字文件进行连接.... 例如,
在Unix 上,客户端尝试使用 Unix 套接字文件连接到本地服务器,即使给出了 --port 或 -P 选项来指定 TCP/IP 端口号。https ://dev.mysql.com/doc/refman/8.0/en/connecting.html
--host=localhost

在这种情况下,将 127.0.0.1:3306 端口转发到其他地方在理论上是个好主意,但实际上不会对您的应用程序有所帮​​助。它们很可能不会使用 TCP/IP 连接到 127.0.0.1:3306,而是连接到 MySQL 守护程序提供的 Unix 套接字。

答案2

您需要route_localnet 并且应该首先在 OUTPUT 链上进行 nat,因为流量是从本地进程开始的。

尝试以下方法:

echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/conf/all/route_localnet

iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 3306 -j DNAT --to-destination 1.1.1.1:3306 
iptables -t nat -A POSTROUTING -d 1.1.1.1 -j MASQUERADE

请注意,如果您通过互联网路由未加密的 mysql,则会出现安全问题。如果您在本地网络上,或者使用 VPN 或 mysql 加密连接进行保护,则效果会更好。

答案3

您可以将其用于rinetd该目的。

man rinetd

rinetd 将 TCP 连接从一个 IP 地址和端口重定向到另一个。rinetd 是一个单进程服务器,可以处理与文件 /etc/rinetd.conf 中指定的地址/端口对的任意数量的连接。

rinetd在大多数 Linux 发行版中可用。

相关内容