
這是我的設定:
+--------------------+ +--------------------+ +----- --------------+ |路由器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 擁有網路上的公共 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的大響應資料包。
- 路由器+防火牆 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 作為客戶端或其他方向的大數據包不起作用。)
現在我被困住了。有什麼建議要檢查什麼嗎?哪個配置有助於診斷?多謝!
答案1
你忘了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
答案2
預設表是篩選,所以當你提供一個規則時,就像iptables -A FORWARD ...
你只是將規則放入篩選桌子。還有另外幾張桌子和桌子碾壓是其中之一。從 man iptables 開始:“該表用於專門的資料包更改。”
因此,為了編輯包(由 完成-j TCPMSS --set-mss
),應該使用碾壓表,這就是為什麼規則應該是這樣的:
iptables -t mangle -A FORWARD -i tun+ -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1400