Linux 伺服器上奇怪的 TCP/IP 行為以及埠 21 上的企業防火牆
這是一個棘手的問題。
TL;博士:
客戶端在(關閉/不可用)埠 21 上與防火牆建立 TCP 握手,即使防火牆沒有響應客戶端的 SYN 數據包。
客戶端發送 1 個 SYN 包(不重傳),防火牆看到來自客戶端的 3 個 SYN 包。
3)同樣的事情發生在另一個大陸的 Linux 伺服器上,它的 PREROUTING 鏈上有塊規則。
最近我們注意到我們的邊緣企業防火牆(Gartner 排名前 3 名)將埠 21 顯示為其 WAN 埠上的開放埠。
即使防火牆本身沒有將該埠用於其任何服務,也沒有將其重定向到另一個主機/伺服器的策略/NAT/LB,它仍然在 NMAP 或 telnet/NC 輸出中顯示為打開狀態。
在防火牆的界面下並通過安全策略明確拒絕它並沒有什麼不同。我在那個供應商的文件中搜尋並沒有產生任何結果。
當時,為了確保防火牆是響應埠 21 的防火牆,我在我的系統上執行 tcpdump 並使用防火牆的“數據包流”工具查看發生了什麼,你瞧,我看到我與埠 21 的連接正在流動進入防火牆,證明來自客戶端的數據包到達防火牆本身。
奇怪的是,我的客戶端發送了1 個 SYN 數據包,而防火牆接收了3 個 SYN 數據包,沒有響應我的客戶端(未發送 SYN/ACK),但不知何故連接成功。
問題只是客戶端的 TCP 握手成功**,**如果您在客戶端按 Enter,您的連接會立即關閉。
由於這些防火牆的核心是基於 UNIX 的,出於好奇,我開始嘗試看看是否可以在另一個大陸的VPS(執行 Ubuntu Server 19)上複製這種行為。
使用 IPTABLES,我在PREROUTING鏈上創建了一個 DROP 策略來阻止發往埠 21 的流量。我重複了我的測試,結果完全一樣!客戶端發送1 個 SYN 數據包,Ubuntu 伺服器看到 3 個 SYN 數據包,沒有以 ACK 響應,但不知何故,為客戶端建立了連接!需要說的是,在客戶端上按 Enter 後,連接會立即關閉。防火牆上的行為完全相同。
以下是我執行的測試,在伺服器和防火牆上都是相同的:
客戶端通過 21 埠遠端登錄伺服器:
Client~# telnet Server-IP 21 Trying Server-IP... Connected to Server-IP. Escape character is '^]'. Connection closed by foreign host.
執行 telnet 時在客戶端上執行 TCPDUMP:
Client~# tcpdump -ni any port 21 listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 19:24:05.456477 IP Client-priv-IP.36284 > Server-IP.21: Flags [S], seq 3093982956, win 64240, options [mss 1460,sackOK,TS val 3370721563 ecr 0,nop,wscale 7], length 0 19:24:05.557556 IP Server-IP.21 > Client-priv-IP.36284: Flags [S.], seq 3130560876, ack 3093982957, win 4080, options [mss 1360,sackOK,TS val 1773913297 ecr 3370721563], length 0 19:24:05.557679 IP Client-priv-IP.36284 > Server-IP.21: Flags [.], ack 1, win 64240, options [nop,nop,TS val 3370721664 ecr 1773913297], length 0 19:24:17.740636 IP Server-IP.21 > Client-priv-IP.36284: Flags [R.], seq 1, ack 1, win 0, length 0
執行 telnet 時在伺服器上執行 TCPDUMP:
Server~# tcpdump -ni any -Q in port 21 listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes 19:25:05.001238 IP Client-pub-IP.36288 > Server-IP.21: Flags [S], seq 2605288404, win 4080, options [mss 1360,sackOK,TS val 1773972678 ecr 0], length 0 19:25:08.000566 IP Client-pub-IP.36288 > Server-IP.21: Flags [S], seq 2605288404, win 4080, options [mss 1360,sackOK,TS val 1773975678 ecr 0], length 0 19:25:10.999775 IP Client-pub-IP.36288 > Server-IP.21: Flags [S], seq 2605288404, win 4080, options [mss 1360,sackOK,TS val 1773978678 ecr 0], length 0 19:25:16.999702 IP Client-pub-IP.36288 > Server-IP.21: Flags [R.], seq 2605288405, ack 0, win 0, length 0
IPTABLES 丟棄 3 個 SYN 數據包:
Server~# iptables -t raw -L -n -v Chain PREROUTING (policy ACCEPT 36M packets, 26G bytes) pkts bytes target prot opt in out source destination 3 2468 DROP tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:21
我們已經在不同的 PC 和 ISP 上對此進行了測試,以排除任何奇怪的客戶端或網際網路連接問題。
為保密起見,我無法分享 IP 地址和供應商名稱。
誰能解釋這種行為?最令人費解的是客戶端發送 1 個 SYN 而伺服器/防火牆接收 3 個。
提前致謝
埠 21 是眾所周知的 FTP 埠,它並不是一個對 NAT 友好的協議。您從客戶端編輯的 tcpdump 說“Client-priv-IP”,而來自伺服器的那個說“Client-pub-IP”,所以我認為客戶端位於 NAT 路由器後面。我敢打賭,路由器正在攔截 FTP,以使其通過 NAT 工作,自行完成三次握手,並同時進行三次嘗試到達目標伺服器。當目標伺服器沒有響應時,它會在下一次機會時終止來自客戶端的連接。