Ubuntu

如何設置 iptables 訪問 MySQL?

  • April 21, 2013

我需要使用自定義埠從另一台伺服器訪問 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;對不起。

引用自:https://serverfault.com/questions/500869