Траблшутинг IPsec за NAT: настройка NAT-Traversal (NAT-T RFC 3948)
- IKE Phase 1 (ISAKMP) успешно согласовывается по UDP 500, но Phase 2 (IPsec SA) завершается ошибкой или трафик внутри туннеля полностью отсутствует (0 bytes RX).
- Пакеты протокола ESP (IP протокол 50) блокируются промежуточными провайдерскими NAT-маршрутизаторами (CGNAT) или офисными фаерволами.
- Обрыв туннеля ровно через 30–60 секунд после установления из-за закрытия сессии в таблице трансляций NAT (State Table Timeout).
- Ошибка в логах strongSwan/Cisco/MikroTik:
NAT-T payload not detectedилиpeer behind NAT but NAT-T disabled.
1. Архитектура и принцип работы NAT-Traversal
Классический протокол ESP (IP protocol 50) не содержит портов L4 (TCP/UDP), поэтому стандартный NAPT/PAT не может мультиплексировать несколько туннелей за одним внешним IP-адресом. Технология NAT-T (RFC 3948) обнаруживает наличие трансляции адресов во время IKE Phase 1 (через вендорские Vendor ID или NAT-Detection payloads) и динамически переключает обмен и передачу зашифрованных данных на UDP-порт 4500, добавляя 4-байтный заголовок Non-ESP Marker перед зашифрованной полезной нагрузкой.
2. Открытие портов на межсетевых экранах (iptables / nftables)
Убедитесь, что разрешены как обмен ключами, так и инкапсулированный трафик данных:
# Разрешение IKE и NAT-T в iptables
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT
# Для nftables
nft add rule inet filter input udp dport { 500, 4500 } accept
nft add rule inet filter input ip protocol esp accept3. Конфигурация strongSwan (Linux)
В файле /etc/ipsec.conf (или swanctl.conf) принудительно включите или настройте автоматическое определение NAT-T:
conn Site-To-Site-NATT
left=192.168.1.100
leftsubnet=10.10.0.0/24
leftid=@gw1.corp.internal
right=203.0.113.10
rightsubnet=10.20.0.0/24
rightid=@gw2.corp.internal
authby=secret
auto=start
ike=aes256-sha256-modp2048!
esp=aes256-sha256!
# Активация инкапсуляции NAT-T
nat_traversal=yes
forceencaps=yes
# Защита от сброса NAT State сессии оператором
dpdaction=restart
dpddelay=15s
dpdtimeout=60s4. Конфигурация Cisco IOS-XE
! Включение детекции NAT-T в политике IKEv2 / ISAKMP
crypto ikev2 nat keepalive 15
! Проверка статуса инкапсуляции в криптосессии
Router# show crypto ipsec sa | include (inbound|outbound) esp sas
! Поле "encapsulation" должно содержать "transport/tunnel (UDP 4500)"5. Настройка на MikroTik RouterOS v7
/ip ipsec peer profile
set [ find default=yes ] nat-traversal=yes dpd-interval=15s dpd-maximum-failures=4
/ip ipsec identity
add peer=Peer-Remote auth-method=pre-shared-key secret="SecretKeyStrong2026"
# Если клиент находится за жестким Symmetric NAT, принудительно включите UDP инкапсуляцию:
/ip ipsec proposal
set [ find default=yes ] enc-algorithms=aes-256-cbc auth-algorithms=sha2566. Захват пакетов для верификации
tcpdump -nn -vv -i eth0 port 4500 Частые вопросы (FAQ)
Почему соединение разрывается каждые 30 секунд при включенном NAT-T?
Большинство промежуточных SOHO-роутеров и операторских CGNAT имеют жесткий таймаут неактивных UDP-сессий в 30–60 секунд. Для предотвращения закрытия трансляции необходимо настроить постоянную отправку keepalive/DPD пакетов с интервалом 10–15 секунд (параметры dpddelay или nat keepalive).
Что такое Non-ESP Marker и зачем он нужен?
Это 4 нулевых байта (0x00000000), помещаемые сразу за заголовком UDP-порта 4500. Они служат маркером для мультиплексора ядра, позволяя отличить пакеты согласования IKE от пакетов зашифрованных данных ESP, идущих на тот же самый UDP-порт.
Можно ли запустить несколько клиентов IPsec за одним NAT, если сервер не поддерживает NAT-T?
Нет. Без NAT-T чистый протокол ESP не содержит номеров портов, поэтому NAT-маршрутизатор не может сопоставить входящий обратный трафик конкретному внутреннему IP-адресу клиента.
Влияет ли NAT-T на производительность и MTU?
Да, добавление заголовка UDP (8 байт) снижает эффективный MTU/MSS туннеля. Также возрастают накладные расходы на обработку, если сетевые карты не поддерживают аппаратный оффлоад UDP-инкапсулированного ESP (IPsec crypto offload).