IpSec/GRE 隧道丟包

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 擁有網路上的公共 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

相關內容