Ubuntu
如何設置 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
最直接的問題是您的 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
只能綁定到 localhost,但您願意擺脫 33306/3306 的區別,讓傳入的客戶端連接到埠 3306。鑑於此,我認為您有問題;我們不能使用 SNAT 來重寫數據包,就好像它們來自 一樣
localhost
,因為流量沒有離開盒子,所以數據包不會通過 nat 表的POSTROUTING
鏈,這是 SNAT 是有效目標的唯一地方。我認為您不能使用 iptables 輕鬆做到這一點,並且需要 SSH 連接或提供邏輯介面的 VPN,例如 OpenVPN;對不起。