我需要使用自定义端口从另一台服务器访问 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.1
从PREROUTING
规则中删除。
您的第二个问题是它只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
如果有人有更好、更安全的方法来完成此操作,请告诉我。