Firewall

Linux 伺服器上奇怪的 TCP/IP 行為以及埠 21 上的企業防火牆

  • April 13, 2020

這是一個棘手的問題。

TL;博士

  1. 客戶端在(關閉/不可用)埠 21 上與防火牆建立 TCP 握手,即使防火牆沒有響應客戶端的 SYN 數據包。

  2. 客戶端發送 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 工作,自行完成三次握手,並同時進行三次嘗試到達目標伺服器。當目標伺服器沒有響應時,它會在下一次機會時終止來自客戶端的連接。

引用自:https://serverfault.com/questions/1011900