如何设置iptables访问MySQL?

如何设置iptables访问MySQL?

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

如果我理解正确的话,我应该将到达端口 33306 的流量转发到 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     

答案1

最直接的问题是你的 NAT 规则只适用于发127.0.0.1不是进入环回接口。根据定义,不会有任何此类流量。-d 127.0.0.1PREROUTING规则中删除。

您的第二个问题是它只mysqld监听环回接口。如果您想与外部系统通信,您还需要让它监听外部 NIC。我暂时不知道该怎么做;但您希望 netstat 的输出看起来更像

tcp      0    0 0.0.0.0:3306              0.0.0.0:*                 LISTEN      

第三个问题是,添加端口转发的 NAT 规则不会隐式地将转发的流量通过防火墙。在 TCP/33306 上重定向传入流量后,您仍然需要允许生成的重定向流量通过 INPUT 链,例如

iptables -I INPUT 8 -p tcp --dport 33306 -s a.b.c.d -j ACCEPT

a.b.c.d您想要进行通信的服务器的 IP 地址在哪里?

重新编辑:好的,您已决定只能mysqld绑定到本地主机,但您愿意摆脱 33306/3306 区别,并让传入客户端连接到端口 3306。

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

答案2

我发现把事情搞乱并不是一个好主意,就像我以前尝试过的那样,并改变了 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.x.x.xx -j ACCEPT

丢弃所有不允许到该端口的流量:

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

如果有人有更好、更安全的方法来完成此操作,请告诉我。

相关内容