IPsec VPN и MTU 1400: настройка, проблемы и защита от атак на PMTUD

Подробное руководство по настройке MTU для IPsec VPN. Почему 1400 байт — оптимальное значение, как работает Path MTU Discovery, уязвимости PMTUD и методы ручной конфигурации.

Зачем VPN снижает MTU: влияние шифрования на размер пакета

При использовании VPN каждый пакет проходит дополнительную обработку: шифрование, добавление заголовков и аутентификационных меток. В случае IPsec это особенно заметно — протокол ESP (Encapsulating Security Payload) добавляет от 60 до 100 байт служебной информации. Если исходный пакет имел размер 1500 байт (стандартный MTU Ethernet), то после инкапсуляции он может достигать 1560–1600 байт, что превышает максимально допустимый размер кадра на большинстве сетевых устройств.

Когда пакет превышает MTU, он должен быть фрагментирован. Фрагментация нагружает процессор маршрутизатора, увеличивает задержки и может приводить к потере пакетов, если установлен флаг Don't Fragment (DF). Именно поэтому для VPN-туннелей рекомендуется устанавливать MTU ниже стандартного значения — обычно в диапазоне 1400–1440 байт. Это позволяет избежать фрагментации на всём пути следования трафика.

Для IPsec VPN оптимальным считается MTU 1400 байт. Это значение компенсирует типичную нагрузку шифрования (ESP-заголовок, padding, ICV) и оставляет запас для дополнительных сетевых накладных расходов, таких как PPPoE (8 байт) или MPLS.

Path MTU Discovery и IPsec: как работает автоматическое определение MTU

Path MTU Discovery (PMTUD) — это механизм, позволяющий хостам и VPN-шлюзам автоматически определять минимальный MTU на всём пути следования пакета. Он основан на отправке пакетов с флагом DF и обработке ICMP-сообщений «Fragmentation Needed» (тип 3, код 4). Если промежуточный маршрутизатор не может передать пакет без фрагментации, он отправляет обратно ICMP-уведомление с указанием максимально допустимого MTU.

На устройствах Cisco PMTUD для IPsec-туннелей включается командой tunnel path-mtu-discovery. После активации маршрутизатор отслеживает ICMP-ответы и динамически корректирует MTU туннеля. Например, если на одном из участков сети установлен MTU 1400, PMTUD снизит MTU туннеля до 1342 байт (с учётом собственных заголовков IPsec).

Однако у PMTUD есть серьёзный недостаток: он полагается на неаутентифицированные ICMP-пакеты, которые могут быть подделаны злоумышленником. В результате атакующий может искусственно снизить MTU туннеля до неприемлемо низких значений, вызывая деградацию или полную потерю связности.

Атака на PMTUD: как поддельные ICMP-пакеты могут разрушить VPN

Исследования показывают, что PMTUD в IPsec-туннелях уязвим для атак, основанных на подделке ICMP-сообщений. Злоумышленник, имеющий доступ к транзитной сети (например, к каналу между VPN-шлюзами), может перехватить ESP-пакеты, извлечь из них значения SPI (Security Parameter Index) и Sequence Number, а затем сформировать поддельный ICMP-пакет «Fragmentation Needed».

В лабораторном тесте на оборудовании Cisco (IOS XE 16.9.3) атакующему удалось снизить MTU туннеля с 1342 до 318 байт, отправив всего один поддельный ICMP-пакет. После этого пакеты с флагом DF перестали проходить через туннель, а обычные пакеты начали фрагментироваться на уровне CPU, что привело к росту загрузки процессора маршрутизатора и потенциальному нарушению доступности всей площадки.

Важно понимать, что это не баг конкретной прошивки, а архитектурная особенность PMTUD: маршрутизатор вынужден доверять информации из неаутентифицированных ICMP-пакетов. Даже если бы ICMP содержал фрагмент зашифрованной ESP-части, проверка целостности была бы невозможна, так как ICV ( Integrity Check Value) обычно не включается в ICMP-уведомление.

Почему ручная настройка MTU — единственная надёжная защита

Единственный способ полностью исключить риск атаки на PMTUD — отказаться от автоматического определения MTU и задать значение вручную. Для IPsec VPN рекомендуется устанавливать MTU туннеля в диапазоне 1400–1440 байт, в зависимости от используемых алгоритмов шифрования и дополнительных инкапсуляций.

На маршрутизаторах FortiGate ручная настройка MTU для IPsec-интерфейса выполняется через CLI:

config system interface
edit <IPSEC_interface_name>
set mtu-override enable
set mtu 1400
set tcp-mss 1360
next
end

Значение TCP-MSS (Maximum Segment Size) устанавливается на 40 байт меньше MTU (1360 для MTU 1400), чтобы избежать фрагментации на транспортном уровне.

На устройствах Cisco ручная настройка MTU для туннеля не предусмотрена — PMTUD отключается удалением команды tunnel path-mtu-discovery, а MTU задаётся на физическом интерфейсе или с помощью ip mtu на туннельном интерфейсе. Однако более надёжный подход — установить MTU на физическом интерфейсе, через который проходит VPN-трафик, например ip mtu 1400.

Как найти оптимальный MTU для IPsec VPN: пошаговый тест

Чтобы определить оптимальное значение MTU для вашего IPsec-соединения, выполните тест с помощью утилиты ping с флагом Don't Fragment. Начните с размера пакета 1472 байта (1500 минус 28 байт на заголовки ICMP и IP) и постепенно уменьшайте его, пока не перестанут появляться сообщения о фрагментации или тайм-ауты.

Windows:

ping -f -l 1472 <IP-адрес удалённого шлюза>

Уменьшайте значение -l на 10 байт, пока не получите успешные ответы. Запомните последний успешный размер и добавьте 28 байт — это и будет ваш оптимальный MTU.

Linux/macOS:

ping -M do -s 1472 <IP-адрес>

Флаг -M do запрещает фрагментацию. Уменьшайте -s до получения стабильных ответов.

Пример: если последний успешный размер данных составил 1372 байта, то MTU = 1372 + 28 = 1400 байт. Это значение можно использовать как базовое для настройки IPsec-туннеля.

Важно тестировать на обоих направлениях, так как MTU может различаться в зависимости от пути. Также учитывайте, что при использовании PPPoE (например, на DSL-подключениях) стандартный MTU снижается до 1492, и для VPN потребуется дополнительная корректировка.

MSS clamping: дополнительный уровень защиты от фрагментации

Даже после правильной настройки MTU туннеля могут возникать проблемы с фрагментацией на транспортном уровне. TCP-сегменты могут быть слишком большими, и если они не помещаются в MTU туннеля, происходит фрагментация на уровне IP, что снижает производительность.

MSS clamping (Maximum Segment Size clamping) — это метод, при котором VPN-шлюз или маршрутизатор принудительно устанавливает максимальный размер TCP-сегмента в SYN-пакетах. Обычно MSS устанавливается на 40 байт меньше MTU (20 байт IP-заголовок + 20 байт TCP-заголовок).

На FortiGate MSS clamping настраивается в firewall-политике:

config firewall policy
edit <vpn_policy_number>
set tcp-mss-sender 1360
set tcp-mss-receiver 1360
set auto-asic-offload disable
next
end

Значение 1360 соответствует MTU 1400 (1400 - 40 = 1360). Это гарантирует, что TCP-сегменты никогда не превысят размер, который может быть передан без фрагментации.

На Linux MSS clamping можно настроить с помощью iptables:

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1360

MSS clamping особенно полезен в сценариях, где невозможно изменить MTU на клиентских устройствах (например, при использовании мобильных приложений или сторонних VPN-клиентов).

Типичные симптомы неправильного MTU в IPsec VPN

Неправильная настройка MTU может проявляться по-разному, и не всегда очевидно, что проблема именно в этом. Вот наиболее распространённые симптомы:

  1. Некоторые сайты работают, другие нет. Небольшие страницы (Google, Reddit) загружаются нормально, а крупные порталы или банковские системы — нет. Это классический признак MTU black hole: пакеты большого размера теряются, а маленькие проходят.
  1. VPN подключён, но трафик не идёт. Соединение установлено, но ни один пакет не достигает цели. Чаще всего это происходит, когда MTU слишком высок, и все пакеты с флагом DF отбрасываются без уведомления.
  1. Низкая скорость при хорошем пинге. Speedtest показывает 100 Мбит/с, но реальная скорость загрузки файлов — 5–10 Мбит/с. Фрагментация заставляет TCP постоянно переотправлять сегменты, что резко снижает пропускную способность.
  1. Лаги в онлайн-играх. Пинг в норме (30–50 мс), но каждые 10–30 секунд возникают скачки задержки. Фрагментированные пакеты обрабатываются дольше, а потеря фрагмента вызывает повторную отправку всего сегмента.
  1. Ошибки при загрузке больших файлов. Маленькие файлы передаются нормально, но загрузка ISO-образов или видео обрывается на середине. Это связано с тем, что крупные файлы генерируют большие TCP-сегменты, которые не помещаются в MTU.

Если вы наблюдаете хотя бы один из этих симптомов, первым делом проверьте MTU вашего VPN-соединения.

Настройка MTU для IPsec на разных платформах

Конфигурация MTU для IPsec VPN зависит от используемого оборудования или программного обеспечения. Ниже приведены примеры для наиболее распространённых платформ.

Windows (IKEv2): В Windows MTU для IPsec-туннеля настраивается через реестр. Откройте regedit и перейдите к:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{GUID интерфейса}

Создайте DWORD-значение MTU и установите его в десятичном формате (например, 1400). После перезагрузки изменения вступят в силу.

macOS: В macOS MTU для IPsec можно изменить через системные настройки сети или командой:

sudo ifconfig utun2 mtu 1400

Замените utun2 на имя вашего VPN-интерфейса (можно узнать через ifconfig).

Linux (strongSwan): В strongSwan MTU задаётся в конфигурации соединения:

conn myvpn
  ...
  mtu=1400

Также можно настроить MTU на виртуальном интерфейсе:

ip link set dev ipsec0 mtu 1400

Маршрутизаторы (Cisco, FortiGate, MikroTik): На Cisco MTU настраивается на физическом интерфейсе или через ip mtu на туннеле. На FortiGate — через CLI, как описано выше. На MikroTik — в интерфейсе IPsec:

/interface ipsec
set [find] mtu=1400

Всегда проверяйте совместимость настроек с документацией производителя, так как синтаксис может отличаться в разных версиях ПО.

Распространённые ошибки при настройке MTU для VPN

Даже опытные администраторы иногда допускают ошибки при конфигурации MTU. Вот наиболее частые из них:

  1. Использование MTU 1500 на VPN-интерфейсе. Это гарантированно приведёт к фрагментации, так как шифрование добавляет минимум 60 байт. Исключение — только если вся транзитная сеть поддерживает jumbo frames (MTU > 1500).
  1. Установка слишком низкого MTU. Значение ниже 1300 байт может вызвать избыточную фрагментацию уже на уровне приложений, что снизит производительность. Оптимальный диапазон — 1400–1440.
  1. Забыли настроить MSS clamping. Даже при правильном MTU туннеля TCP-сегменты могут быть слишком большими. MSS clamping решает эту проблему на транспортном уровне.
  1. Настройка MTU на неправильном интерфейсе. MTU нужно менять на интерфейсе туннеля, а не на физическом порту (хотя в некоторых случаях это тоже работает).
  1. Игнорирование PPPoE. Если ваш интернет работает через PPPoE (например, DSL), стандартный MTU уже снижен до 1492. Для VPN потребуется дополнительное уменьшение — до 1400 или даже 1360.
  1. Блокировка ICMP файрволом. PMTUD полагается на ICMP-сообщения. Если файрвол блокирует ICMP типа 3 код 4, автоматическое определение MTU не будет работать, и пакеты будут теряться.
  1. Смешивание IPv4 и IPv6. MTU для IPv6 может отличаться от IPv4. Убедитесь, что вы тестируете и настраиваете MTU для каждого протокола отдельно.

Избегая этих ошибок, вы сможете значительно повысить стабильность и производительность вашего IPsec VPN.

Проверка работоспособности после изменения MTU

После настройки MTU необходимо провести серию тестов, чтобы убедиться, что изменения не вызвали новых проблем. Рекомендуется выполнить следующие проверки:

  1. Ping с флагом Don't Fragment. Отправьте пакет размером, равным новому MTU минус 28 байт. Например, для MTU 1400:
ping -f -l 1372 <удалённый шлюз>

Если все пакеты проходят успешно, MTU настроен корректно.

  1. Загрузка проблемных сайтов. Откройте те сайты, которые ранее не работали. Если они загружаются нормально, проблема решена.
  1. Скачивание большого файла. Попробуйте загрузить файл размером 100–500 МБ. Если загрузка завершается без ошибок, фрагментация не происходит.
  1. Потоковое видео. Запустите видео в высоком разрешении (1080p или 4K) на YouTube или другом сервисе. Если буферизация отсутствует, MTU достаточен.
  1. Проверка интерфейса. На маршрутизаторе выполните команду show interface tunnel0 (или аналог) и убедитесь, что MTU отображается как заданное значение.
  1. Тест на потерю пакетов. Используйте утилиту mtr или pathping для выявления потерь на маршруте. Если потери превышают 1%, возможно, MTU всё ещё слишком высок.
  1. Игровой тест. Если вы используете VPN для игр, запустите игру и проверьте, нет ли лагов или разрывов соединения.

Проводите тесты в разное время суток, так как состояние сети может меняться. Если после всех проверок проблемы сохраняются, попробуйте уменьшить MTU ещё на 20–40 байт.

Вопросы и ответы

Почему для IPsec VPN рекомендуется MTU 1400, а не 1500?

Стандартный MTU Ethernet составляет 1500 байт. IPsec добавляет к каждому пакету заголовки ESP (8 байт), аутентификационную метку ICV (12–32 байта), выравнивающий padding (0–15 байт) и внешний IP-заголовок (20 байт). В сумме это даёт 60–100 байт служебной информации. Если оставить MTU 1500, то после инкапсуляции пакет станет больше 1500 байт, что вызовет фрагментацию. MTU 1400 оставляет запас в 100 байт, что достаточно для большинства конфигураций IPsec, и позволяет избежать фрагментации на всём пути.

Как проверить, что проблема с VPN вызвана неправильным MTU?

Самый простой способ — выполнить ping с флагом Don't Fragment (в Windows -f, в Linux -M do) и размером пакета 1472 байта (1500 минус 28). Если пинг не проходит, постепенно уменьшайте размер на 10 байт, пока не получите успешные ответы. Если успешный размер меньше 1472, проблема в MTU. Также характерные симптомы: некоторые сайты работают, другие нет; VPN подключён, но трафик не идёт; низкая скорость при хорошем пинге.

Что такое MSS clamping и зачем он нужен для IPsec VPN?

MSS (Maximum Segment Size) clamping — это техника, при которой VPN-шлюз принудительно устанавливает максимальный размер TCP-сегмента в SYN-пакетах. Обычно MSS устанавливается на 40 байт меньше MTU (20 байт IP + 20 байт TCP). Это гарантирует, что TCP-сегменты никогда не превысят размер, который может быть передан без фрагментации. MSS clamping особенно полезен, когда невозможно изменить MTU на клиентских устройствах, и является дополнительным уровнем защиты от фрагментации на транспортном уровне.

Можно ли использовать PMTUD для IPsec VPN, если я доверяю своей сети?

Технически — да, но это не рекомендуется. Даже в доверенной сети злоумышленник может получить доступ к транзитному каналу и подделать ICMP-пакеты, что приведёт к снижению MTU до неприемлемого уровня. Как показали исследования, для этого достаточно отправить всего один поддельный пакет. Единственная надёжная защита — ручная настройка MTU и отключение PMTUD на туннеле. Современный интернет хорошо работает со статическим MTU 1400, поэтому автоматическое определение избыточно.

Как настроить MTU для IPsec на FortiGate?

На FortiGate MTU для IPsec-интерфейса настраивается через CLI. Войдите в конфигурацию интерфейса: config system interface, выберите ваш IPsec-интерфейс (edit <имя>), включите переопределение MTU (set mtu-override enable), установите значение MTU (set mtu 1400) и задайте TCP-MSS (set tcp-mss 1360). Затем примените изменения (next, end). Также рекомендуется настроить MSS clamping в firewall-политике для VPN-трафика с помощью команд set tcp-mss-sender 1360 и set tcp-mss-receiver 1360.

Что делать, если после настройки MTU 1400 некоторые сайты всё равно не работают?

Попробуйте уменьшить MTU до 1380 или 1360 байт. Возможно, на пути следования трафика есть участок с ещё более низким MTU (например, из-за PPPoE, MPLS или туннелирования). Также проверьте, не блокирует ли файрвол ICMP-сообщения типа 3 код 4 — это может мешать PMTUD, даже если вы используете ручную настройку. Если проблема сохраняется, выполните тест ping с флагом Don't Fragment, чтобы определить реальный максимальный размер пакета, и установите MTU соответственно.

Влияет ли MTU на скорость VPN-соединения?

Да, неправильный MTU может значительно снизить скорость. Если MTU слишком высок, пакеты фрагментируются, что увеличивает загрузку CPU и задержки. Если MTU слишком низок, каждый пакет несёт меньше полезных данных, что снижает пропускную способность. Оптимальный MTU (1400–1440 для IPsec) обеспечивает максимальную скорость без фрагментации. После настройки рекомендуется провести тест скорости (например, iperf3) для проверки.