我找到了类似的线索,但是不起作用: https://stackoverflow.com/questions/10864854/forwarding-mysql-connection-with-iptables-and-differents-network-interfaces?rq=1
我的环境如下:
- 计算机A有两个网络接口: eth0
192.168.42.67
和 eth1192.168.110.2
,安装了 MySQL 客户端,禁用了 selinux。 - 计算机B只有一个网络接口: eth0
192.168.110.4
,安装了 MySQL 服务器,停止了 iptables,禁用了 selinux。
在计算机 A 上,我使用命令mysql -h192.168.110.4 -uroot -p
成功连接到计算机 B 上的 MySQL。
计算机A的/etc/sysconfig/iptables
外观如下:
[root@net ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Mon Jun 9 20:25:07 2014
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:140]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Mon Jun 9 20:25:07 2014
# Generated by iptables-save v1.4.7 on Mon Jun 9 20:25:07 2014
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 3306 -j LOG --log-prefix "REX_NAT_PRE2:"
-A PREROUTING -p tcp -m tcp --dport 3306 -j DNAT --to-destination 192.168.110.4:3306
-A POSTROUTING -s 192.168.110.4/32 -j MASQUERADE
-A POSTROUTING -p tcp -j LOG --log-prefix "REX_NAT_POST:"
COMMIT
注意:我将每个链的默认策略设置为ACCEPT
。
我希望我可以mysql -h192.168.42.67 -uroot -p
在计算机 A 上使用来操作计算机 B 的 MySQL
我还执行modprobe iptable_nat
了echo 1 > /proc/sys/net/ipv4/ip_forward
答案1
更改此规则
-A POSTROUTING -s 192.168.110.4/32 -j MASQUERADE
到
-A POSTROUTING -p tcp -m tcp -d 192.168.110.4/32 --dport 3306 -j MASQUERADE
有了您指定的其他规则,这就足够了。
答案2
您的PREROUTING
规则不适用于来自A,因为PREROUTING
仅适用于转发的数据包,而不适用于本地生成的数据包。相反,您可以使用OUTPUT
链,它适用于本地生成的数据包。
对于这两者PREROUTING
,OUTPUT
我建议您添加-d 192.168.42.67
到规则中DNAT
,以使其不匹配不打算匹配的数据包。
此外,我建议您在链中的规则中添加-o eth0
或,以使其不匹配不打算匹配的数据包。-o eth1
MASQUERADE
POSTROUTING