为什么在不存在的端口上 telnet 不直接拒绝,而是超时?

Ale*_*lex 4 telnet tcp-ip

telnet 8.8.8.8 8888
Run Code Online (Sandbox Code Playgroud)

显示

试...

我期待,这直接被拒绝。

背景:当我们有一个 NGINX 反向代理服务器时,它会直接检测后端不存在的情况。

ilk*_*chu 14

这取决于远程端发回的内容。

对于没有进程正在侦听的端口,远程发送一个设置了重置 (RST) 位的数据包,这会导致客户端出现“连接被拒绝”错误。另一种可能性是ICMP“端口无法访问”消息,例如Linuxiptables -j REJECT默认发送。这也会导致“连接被拒绝”。

另一方面,如果远程没有返回任何内容,则客户端无法知道问题是什么,并且可能会重试和/或等待很长时间。

iptables在 Linux 上的一个例子:

# iptables -I INPUT -p tcp --dport 3001 -j REJECT
# iptables -I INPUT -p tcp --dport 3002 -j DROP

$ nc -v 127.0.0.1 3000
nc:连接到 127.0.0.1 端口 3000 (tcp) 失败:连接被拒绝

$ nc -v 127.0.0.1 3001
nc:连接到 127.0.0.1 端口 3001 (tcp) 失败:连接被拒绝

$ nc -v 127.0.0.1 3002
(等等……)

因此,要发现后端不活动,您需要确保那里有人将错误发回。当然,如果整个主机出现故障,这可能很难做到,因此您可能只需要安排更短的超时时间。


Edu*_*ani 8

TCP 堆栈根据一组规则(可能在防火墙级别)决定如何响应连接。您可以拒绝连接包 (SYN),但也可以删除它。例如,由于端口扫描,删除它是有意义的。

  • @Alex“如果我希望自己的服务器正常运行并拒绝连接怎么办?” 通常,服务器处理不需要的 TCP 连接的理想方式是丢弃此流量,而不是拒绝它。丢弃通常比拒绝更安全。但是,如果这不是面向公众的,那么您可以将防火墙上的默认策略设置为拒绝。 (3认同)