Потеря пакета в туннеле 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        |
  | Сервер А | | Клиент E            |
  |                    |                            |                    |
  |                    |                            |                    |
  +--------------------+                            +--------------------+
  • Маршрутизаторы B и C имеют публичные IP-адреса в Интернете и туннель IpSec (Racoon) для 192.168.10.1-192.168.2.57.
  • Все машины работают под управлением 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 может пропинговать любой другой IP.
  • Если клиент E открывает веб-страницу на сервере A, квитирование TCP/IP и "GET /" прибывают на сервер A, но (большой) ответ сервера A не приходит на клиент E, но теряется "в" GRE туннель.
  • Я думал, что мы теряем большие пакеты из-за фрагментации и уменьшаем MTU на интерфейсах a и b, в конце концов, до 1000 байтов, но это не помогло.
  • tcpdump на интерфейсе a показывает правильный трафик HTTP
  • tcpdump на интерфейсе b показывает квитирование и HTTP-трафик от E->A, но не показывает большие ответные пакеты от A-> E.
  • tcpdump на маршрутизаторе + межсетевой экран C показывает, что пакеты GRE выпадают из туннеля IpSec, большие пакеты не поступают
  • HTTP-запрос от B->E работает нормально.
  • Большие пакеты между D<->B не через GRE, а непосредственно в туннеле IpSec (т. Е. Ssh 192.168.10.1 на интерфейсе 192.168.2.57) работают
  • Большие пакеты между B и "больше сетей" работают (через GRE туннель!).
  • Поменяться ролями А и Е не помогает. (E как сервер, A как клиент или большие пакеты в другом направлении не работают.)

Теперь я застрял. Любой совет, что проверить? Какой конфиг поможет диагностировать? Большое спасибо!

1 ответ

Решение

Вы забыли о MSS

1) Вы должны установить mtu на gre tunnel 1400

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

Таблица по умолчанию - фильтр, поэтому, когда вы указываете правило вроде iptables -A FORWARD ...вы просто помещаете правило в таблицу фильтров. Есть также несколько других таблиц, и таблица mangle - одна из них. По словам 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

Другие вопросы по тегам