我有两台服务器。第一台服务器上的程序需要通过端口 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
答案1
要允许通过 TCP 端口 2194 从 server1 到 server2 进行传出连接,请在 server1 上使用以下命令:
iptables -A OUTPUT -p tcp -d <server2ip> --dport 2194 -j ACCEPT
要允许从服务器 1 到服务器 2 通过 TCP 端口 2194 进行传入连接,请在服务器 2 上使用以下命令:
iptables -A INPUT -p tcp -s <server1ip> --dport 2194 -j ACCEPT
答案2
几点建议
您正在运行的服务是否仅在本地主机上侦听?运行
netstat -ltn
如果您看到类似这样的行0.0.0.0:2194
,则表示您没问题。如果您看到这样的行127.0.0.1:2194
,则表示您只监听本地连接(对于 IPv6 地址,则:::2194
分别::1:2194
显示为和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 数据包,包括来自源和目标的数据包。有了这些信息,您应该能够确定问题出在哪里。