Потеря пакетов в туннеле 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-адреса в Интернете и туннель 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!).
  • Перестановка ролей A и E не помогает. (E как сервер, A как клиент или большие пакеты в другом направлении не работают.)

Теперь я застрял. Есть ли какие-нибудь советы, что проверить? Какая конфигурация поможет диагностировать? Большое спасибо!

решение1

Вы забыли про MSS

1) Необходимо установить mtu на gre туннеле 1400

2) Для пакетов SYN установите mss того же размера mtu 1400

в линуксе:

iptables -I ПЕРЕНАПРАВИТЬ -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

Связанный контент