Linux

如何允許通過 iptables 進行傳出連接?

  • May 1, 2013

我有兩台伺服器。第一個程序需要與埠 2194 上的第二個程序通信。

我知道它不起作用,因為當我這樣做時:

root@server1 [~]# telnet myserver2.com 2194
Trying 123.123.123.98...
telnet: connect to address 123.123.123.98: Connection timed out
telnet: Unable to connect to remote host: Connection timed out

server1# iptables -L -n

Chain INPUT (policy DROP)
...
...

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy DROP)
...

Chain LOCALINPUT (1 references)
target     prot opt source               destination
...

Chain LOCALOUTPUT (1 references)
target     prot opt source               destination
...

Chain LOGDROPIN (1 references)
target     prot opt source               destination
DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain LOGDROPOUT (1 references)
target     prot opt source               destination
DROP       all  --  0.0.0.0/0            0.0.0.0/0

要允許在 TCP 埠 2194 上從 server1 到 server2 的傳出連接,請在 server1 上使用:

iptables -A OUTPUT -p tcp -d <server2ip> --dport 2194 -j ACCEPT

要允許在 TCP 埠 2194 上從 server1 到 server2 的傳入連接,請在 server2 上使用:

iptables -A INPUT -p tcp -s <server1ip> --dport 2194 -j ACCEPT

只是幾個指針

您正在執行的服務是否僅在 localhost 上偵聽?跑步

netstat -ltn

如果你看到這樣的線,0.0.0.0:2194那麼你就沒事了。如果您看到127.0.0.1:2194,那麼您僅在偵聽本地連接(或:::2194分別偵聽::1:2194IPv6 地址,顯示為tcp6行)。

目前的 iptables 規則是什麼?

iptables -L

政策是 DROP/REJECT(如果不是,則對所有鏈都應該如此)?您需要的埠是否有特定規則?

如果是防火牆問題,則要麼修改違規規則,要麼添加類似的規則

iptables -A INPUT -p tcp --dport 2194 -j ACCEPT 

應該做的伎倆(未經測試)

=== 編輯 ===

測試網路問題的一個好工具是tcpdump。在嘗試連接時在兩台伺服器上執行它並查看數據包的去向。例如在伺服器 1 上執行:

tcpdump -i eth0 -n host server2.com

在伺服器 2 上執行:

tcpdump -i eth0 -n host server1.com

然後嘗試連接。您應該會在螢幕上看到從源和目標轉儲的所有 TCP 數據包。有了這些資訊,您應該能夠查明問題出在哪裡。

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