Linux
IpSec/GRE 隧道中的封包遺失
這是我的設置:
+--------------------+ +-------------------+ +--------------------+ | 路由器 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