Alex Asked: 2019-10-31 07:24:33 +0800 CST2019-10-31 07:24:33 +0800 CST 2019-10-31 07:24:33 +0800 CST 为什么不存在端口上的telnet 不直接拒绝,而是超时? 772 telnet 8.8.8.8 8888 显示 试... 我期待,这直接被拒绝。 背景:当我们有一个 NGINX 反向代理服务器时,它会直接检测到后端不存在时,它会很棒。 telnet 2 个回答 Voted ilkkachu 2019-10-31T07:40:07+08:002019-10-31T07:40:07+08:00 这取决于远程端发回的内容。 对于没有进程正在侦听的端口,远程发送一个设置了重置 (RST) 位的数据包,这会导致客户端出现“连接被拒绝”错误。另一种可能性是 ICMP“端口不可达”消息,例如 Linuxiptables -j REJECT默认发送的消息。这也会导致“连接被拒绝”。 另一方面,如果远程没有发回任何东西,那么客户端就无法知道问题是什么,并且可能会重试和/或等待相当长的时间。 iptablesLinux 上的示例: # 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 (等等……) 因此,要找出后端不存在,您需要确保其中有人将错误发回。如果整个主机出现故障,那当然可能很难做到,因此您可能只需要安排更短的超时时间。 Best Answer Eduardo Trápani 2019-10-31T07:31:19+08:002019-10-31T07:31:19+08:00 TCP 堆栈根据一组规则(可能在防火墙级别)决定如何响应连接。您可以 REJECT 连接包 (SYN),但也可以 DROP 它。例如,由于端口扫描,丢弃它是有意义的。
这取决于远程端发回的内容。
对于没有进程正在侦听的端口,远程发送一个设置了重置 (RST) 位的数据包,这会导致客户端出现“连接被拒绝”错误。另一种可能性是 ICMP“端口不可达”消息,例如 Linux
iptables -j REJECT
默认发送的消息。这也会导致“连接被拒绝”。另一方面,如果远程没有发回任何东西,那么客户端就无法知道问题是什么,并且可能会重试和/或等待相当长的时间。
iptables
Linux 上的示例:因此,要找出后端不存在,您需要确保其中有人将错误发回。如果整个主机出现故障,那当然可能很难做到,因此您可能只需要安排更短的超时时间。
TCP 堆栈根据一组规则(可能在防火墙级别)决定如何响应连接。您可以 REJECT 连接包 (SYN),但也可以 DROP 它。例如,由于端口扫描,丢弃它是有意义的。