![Iptables 将 localhost:3306 路由到 remoteip:3306](https://linux22.com/image/779912/Iptables%20%E5%B0%86%20localhost%3A3306%20%E8%B7%AF%E7%94%B1%E5%88%B0%20remoteip%3A3306.png)
我有多个网站连接到localhost
mySQL(默认 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 发行版中可用。