Telnet

為什麼不存在埠上的telnet 不直接拒絕,而是超時?

  • October 30, 2019
telnet 8.8.8.8 8888

顯示

試…

我期待,這直接被拒絕。

背景:當我們有一個 NGINX 反向代理伺服器時,它會直接檢測到後端不存在時,它會很棒。

TCP 堆棧根據一組規則(可能在防火牆級別)決定如何響應連接。您可以 REJECT 連接包 (SYN),但也可以 DROP 它。例如,由於埠掃描,放棄它是有意義的。

這取決於遠端端發回的內容。

對於沒有程序正在偵聽的埠,遠端發送一個設置了重置 (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
*(等等……)*

因此,要找出後端不存在,您需要確保其中有人將錯誤發回。如果整個主機出現故障,那當然可能很難做到,因此您可能只需要安排更短的超時時間。

引用自:https://unix.stackexchange.com/questions/549532