Linux
如何允許通過 iptables 進行傳出連接?
我有兩台伺服器。第一個程序需要與埠 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:2194
IPv6 地址,顯示為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 數據包。有了這些資訊,您應該能夠查明問題出在哪裡。