如何设置iptables访问MySQL?

我需要使用自定义端口从另一台服务器访问MySQL,并限制对其他服务器IP的访问。 我怎么做到这一点?

如果我理解正确,我应该转发可以说的端口33306的stream量到127.0.0.1:3306像这样的东西:

iptables -t nat -A PREROUTING ! -i lo -p tcp -m tcp -d 127.0.0.1 --dport 33306 -j REDIRECT --to-port 3306 

这不起作用,我不明白为什么。

我的iptables看起来像这样:

 Chain PREROUTING (policy ACCEPT 149 packets, 8788 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REDIRECT tcp -- !lo * 0.0.0.0/0 127.0.0.1 tcp dpt:33306 redir ports 3306 Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 22271 10M ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp spts:1024:65535 dpt:443 state NEW,RELATED,ESTABLISHED 2 8494 7799K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 3 10012 1177K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 4 7 352 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 5 3 117 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 6 5 772 ACCEPT all -- tun+ * 0.0.0.0/0 0.0.0.0/0 7 2 140 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1194 8 1 40 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT all -- tun+ * 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT 3338 packets, 1926K bytes) num pkts bytes target prot opt in out source destination 

mysql正在监听:

 netstat -tulpn | grep LISTEN tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1028/mysqld 

最直接的问题是,你的NAT规则只适用于预定为127.0.0.1stream量,但不能进入环回接口。 从定义上来说,不会任何这样的stream量。 从PREROUTING规则中删除-d 127.0.0.1

你的第二个问题是mysqld只能在loopback接口上进行监听。 如果您想要与外部系统通话,则还需要使用它来侦听外部NIC。 我不知道怎么做, 但是你希望netstat的输出看起来更像

 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 

你的第三个问题是添加一个端口转发的NAT规则不会隐式地通过防火墙转发stream量。 在TCP / 33306上redirect传入stream量之后,您仍然需要通过INPUT链允许产生的redirectstream量,

 iptables -I INPUT 8 -p tcp --dport 33306 -s abcd -j ACCEPT 

其中abcd是您希望能够进行通信的服务器的IP地址。

重新编辑:好的,你已经决定mysqld只能绑定到localhost,但是你愿意摆脱33306/3306的区别,并且让传入的客户端连接到3306端口。

给出的,我认为你有一个问题; 我们不能使用SNAT来重写数据包,就好像它们来自localhost ,因为stream量不会离开盒子,所以数据包不会通过nat表的POSTROUTING链,这是SNAT唯一有效的地方目标。 我不认为你可以用iptables轻松做到这一点,并且需要SSH连接或者提供逻辑接口的VPN,比如OpenVPN。 抱歉。

我发现,把我以前尝试过的东西弄糟,把etc / mysql / my.cnf改成适合一个普通的设置是不是个好主意,比如:

 # bind to all ip's bind to 0.0.0.0 

我还将3306端口的连接限制在一个IP上:

 iptables -I INPUT -i eth0 -p tcp --dport 3306 --src xxx.xxxx -j ACCEPT 

将所有stream量丢弃到不允许的端口:

 iptables -I INPUT -i eth0 -p tcp --dport 3306 -j DROP 

如果有人有一个更好,更安全的方法来完成它,请让我知道。