Потеря пакета в туннеле 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