Linux:跟踪netstat -s“失敗的連接嘗試”的來源
我有幾台伺服器,netstat -s(來自/proc/net/snmp)返回的失敗連接嘗試指標大約每秒增長一次,我想診斷這些伺服器的來源。
通過使用這個 ipTables 規則(在不同的伺服器上):
-A 輸出 -p tcp –dport 23 -j 拒絕
我正在阻止傳出 telnet,所以我可以執行這個循環:
雖然是真的;遠端
netstat -s | grep“連接失敗”
完成
正在嘗試 209.85.203.94…
telnet:無法連接到遠端主機:連接被拒絕
52 次連接嘗試失敗
正在嘗試 209.85.203.94… telnet:無法連接到遠端主機:連接被拒絕
53 次連接嘗試失敗
正在嘗試 209.85.203.94.. . telnet:無法連接到遠端主機:連接被拒絕
54 次連接嘗試失敗
因此證明計數器因嘗試連接遠端套接字失敗而增加。(當然,雖然它不能證明這是增量的唯一原因)。
問題是,我怎樣才能找到失敗的遠端地址和埠(或兩者的複數)的具體組合,以便我可以查看下一步;路由/防火牆問題?
順便說一句,如果我執行這個:
觀看 -n1 的 ss | grep “<23>”'
我希望看到處於 SYN-SENT 狀態的套接字,但沒有。這是因為我使用了 REJECT,而不是 DROP?謝謝
讓我們嘗試以另一種方式(困難的方式)回答這個問題。閱讀核心的原始碼,看看,只有一個地方,這個度量值遞增 - tcp_done函式。正如我們在程式碼中看到的,遞增僅發生在 SYN_SEND 或 SYN_RECV 狀態的連接上。然後我們檢查,從哪裡可以呼叫 tcp_done。我們可以找到幾個地方:
- tcp_reset - 在連接中止時呼叫(收到第一個標誌的回複數據包)。是的,它可能發生在 SYN_SENT 和 SYN_RECV 狀態(理論上,在其他狀態下)。
- tcp_rcv_state_process - 在狀態 TCP_FIN_WAIT1 和 TCP_LAST_ACK 中呼叫,因此指標不會增加 - 這不是我們的情況。
- tcp_v4_error - 在 SYN_SENT 或 SYN_RECV 的情況下呼叫。ICMP 處理程序呼叫的 tcp_v4_error 函式。
- tcp_time_wait - 在將套接字移動到 time-wait 或 fin-wait-2 狀態時呼叫 - 也不是我們的情況。
- tcp_write_error - 在超時和重傳計數超出時從多個地方呼叫。它也可能是我們的嫌疑人。
現在,打開任何 TCP FSM 圖來檢查,在什麼情況下我們的連接可以是 SYN_SENT 或 SYN_RECV。
在客戶端情況下,它只能是 SYN_SENT 狀態,其中同步數據包正在傳輸,並且由於接收到拒絕(tcp-rst 或 icmp 錯誤)或未收到回复而中止連接。
在伺服器情況下,它只能是 SYN_RECV 狀態(syn 已經收到並且 syn+ack 已經發送),並且由於接收到拒絕而中止連接(syn+ack 在某處被拒絕)或超過了回復等待超時(確認沒有已收到)。
現在您知道了該指標更新的原因,並且可以在您的系統中檢查它的可能來源。在現代核心中,有一個強大的工具可以在核心級別進行故障排除。從 Brendan Gregg的這個簡短教程開始。