Linux

IpSec/GRE 隧道中的封包遺失

  • March 16, 2021

這是我的設置:

+--------------------+ +-------------------+ +--------------------+
| 路由器 B a +-----+ 路由器+防火牆 C | | b 路由器 D |
| 10.10.10.1 ----------------------------------10.10.10.2 |
| +-----+ | | +--- 更多網
| 192.168.10.1 | |192.168.2.11 +--+192.168.2.57 |
+----|---------------+ +-------------------+ +--------------------+
| | 
+----|---------------+ +----|---------------+
|192.168.10.11 | |192.168.2.38 |
|伺服器 A | |客戶E |
| | | |
| | | |
+--------------------+ +--------------------+
  • 路由器 B 和 C 具有 Internet 上的公共 IP 和 192.168.10.1-192.168.2.57 的 IpSec 隧道 (Racoon)。
  • 所有機器都執行 Ubuntu Linux。
  • 在 192.168.10.1-192.168.2.57 之間有一個嵌入式 GRE 隧道,隧道 IP 為 10.10.10.1 和 10.10.10.2。
  • 隧道需要能夠將數據從 192.168.10.0/24 網路路由到路由器 D 後面的其他網路(例如 192.168.3.0/24)。
  • 每個 IP 都可以 ping 其他每個 IP。
  • 如果客戶端 E 在伺服器 A 上打開一個網頁,TCP/IP 握手和“GET /”到達伺服器 A,但伺服器 A 的(大)響應沒有到達客戶端 E,而是在 GRE“中”失去隧道。
  • 我以為我們會因為碎片而產生大數據包並減少介面 a 和 b 上的 MTU,最終降低到 1000 字節,但這並沒有幫助。
  • 介面 a 上的 tcpdump 顯示正確的 HTTP 流量
  • 介面 b 上的 tcpdump 顯示來自 E->A 的握手和 HTTP 流量,但不顯示來自 A->E 的大響應數據包。
  • Router+Firewall C 上的 tcpdump 顯示 GRE 數據包從 IpSec 隧道中丟棄,沒有大數據包到達
  • 來自 B->E 的 HTTP 請求工作正常。
  • D<->B 之間的大數據包不通過 GRE,而是直接在 IpSec 隧道中(即 192.168.2.57 介面上的 ssh 192.168.10.1)工作
  • B 和“更多網路”之間的大數據包工作(通過 GRE 隧道!)。
  • 交換 A 和 E 的角色並沒有幫助。(E作為伺服器,A作為客戶端或其他方向的大數據包不起作用。)

現在我被困住了。有什麼建議要檢查什麼?哪個配置有助於診斷?非常感謝!

你忘了 MSS

1 ) 你必須在 gre 隧道 1400 上設置 mtu

2 ) 對於 SYN 數據包,將 mss 設置為相同大小 mtu 1400

在 Linux 中:

iptables -I FORWARD -i tun+ -p tcp -m tcp –tcp-flags SYN,RST SYN -j TCPMSS –set-mss 1400

預設表是filter,因此當您提供類似規則時iptables -A FORWARD ...,只需將規則放入filter表中。還有幾張桌子,桌子碎裂就是其中之一。從 man iptables 開始:“該表用於專門的數據包更改。”

因此,對於編輯包(由 完成-j TCPMSS --set-mss),應該使用mangle表,這就是為什麼規則應該是這樣的:

iptables -t mangle -A FORWARD -i tun+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1400

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