ESP — це IP-протокол 50, а не TCP-порт 50: що дозволяти
Номери протоколів і номери портів — різні простори імен. Правило для TCP-порту 50 нічого не дозволяє, а NAT traversal переносить ESP у UDP 4500.
Форми налаштування міжмережевого екрана запитують TCP-порт, і очевидна відповідь — 50. Ця відповідь нічого не дозволяє, бо ESP — це IP-протокол номер 50, а номери протоколів не є портами. Ці два простори імен поділяють лише малі цілі числа і більше нічого, і помилка залишається невидимою, доки IKE не завершиться, а захищений трафік так і не надійде.
Два простори імен, які поділяють малі числа
У заголовку IP є поле протоколу, яке називає наступне: 6 для TCP, 17 для UDP, 1 для ICMP, 50 для ESP, 51 для AH. У заголовку TCP або UDP є номери портів, які вибирають процес на хості призначення. Протокол 50 і TCP-порт 50 — не пов’язані значення, але діалогове вікно може показати їх як взаємозамінні.
Саме тому правило переспрямування портів не може виразити нативний ESP. Портів призначення ESP для переспрямування не існує, а пристрій, який розуміє лише правила портів, узагалі не має словника для такого пакета. Правильне правило називає IP-протокол. Будь-яке діалогове вікно портів — неправильний інструмент для цього пакета.
У плутанини є й друга половина. Коли пакет зашифровано, усе всередині нього непрозоре, включно із заголовком TCP початкового з’єднання. Міжмережевий екран, який перевіряє порти в цьому пакеті, дивиться на зовнішній заголовок, у якому в нативному випадку немає портів для перевірки.
Нативний ESP, потім інкапсульована альтернатива
Нативний ESP передається безпосередньо як IP-протокол, що однаково ефективно й незручно. Ефективно, бо немає додаткового заголовка, і незручно, бо жоден пристрій, що виконує трансляцію адрес і портів, не може його відстежити. NAT traversal існує саме для цього: він загортає пакет ESP в UDP, щоб у транслятора були порти для перезапису.
| Form on the wire | How it is identified | What the firewall must permit |
|---|---|---|
| IKE negotiation | UDP with a destination port | UDP 500, and 4500 once traversal is detected |
| Native ESP | IP protocol 50 in the outer header | The protocol itself, with no port to name |
| ESP inside UDP | UDP 4500 carrying an ESP payload | The UDP port pair, which translation devices can track |
Дві форми — це альтернативні варіанти розгортання одного й того самого каналу даних, а не рівні одного. Дозвіл нативного ESP не дозволяє інкапсульовану форму, а дозвіл UDP 4500 не дозволяє нативний трафік, тому набір правил має відповідати розгортанню, а не випадково охоплювати обидва варіанти.
Виявлення тут теж важливе. Кінцеві точки вибирають форму під час узгодження, і перемикання зазвичай відбувається, коли між ними виявлено NAT. Тому маршрут, який змінився після встановлення тунелю, може перенести трафік у простір імен, який ваші правила ніколи не охоплювали.
Прочитайте, яку форму з’єднання насправді використовує
Запитайте кінцеву точку, а не вгадуйте з міжмережевого екрана. У Linux запис стану повідомляє, чи використовує асоціація інкапсуляцію UDP і які порти задіяні. Перехоплення пакетів відповідає на те саме питання з лінії, і обидва способи швидші, ніж читати набір правил і сподіватися.
ip xfrm state | grep -A3 encap
tcpdump -ni any 'ip proto 50 or udp port 4500'
Перша команда показує тип інкапсуляції, коли використовується NAT traversal, і нічого, коли ні. Друга показує, яка з двох форм насправді проходить через інтерфейс, і це припиняє суперечки про конфігурацію, яка на папері виглядає правильною.
Контрдоказ належить до того самого кроку. Правило, яке повідомляє про нуль збігів, каже вам, що пакет до нього не дійшов, і це питання маршрутизації або селектора, а не міжмережевого екрана.
Потім окремо підтвердьте канал керування. У IKE свої порти й свої журнали, і завершене узгодження без даних — це саме той поділ, про який ця стаття.
Запишіть правило в правильному просторі імен
Правило протоколу й правило порту — різні інструкції, тому інструмент має виражати саме те, що ви маєте на увазі. У nftables збіг за протоколом задається явно, а інкапсульована альтернатива отримує власне правило UDP. Тримайте два правила поруч, щоб пара була видима під час перегляду.
nft add rule inet filter input ip protocol esp accept
nft add rule inet filter input udp dport { 500, 4500 } accept
Не розширюйте жодне з правил, щоб компенсувати хибну діагностику. Дозвіл усього для протоколу ESP на кожному інтерфейсі або дозвіл UDP звідусіль куди завгодно виправляє симптом і прибирає контроль, який ви намагалися налаштувати. Вузький підтримуваний потік майже завжди достатній, коли форма відома.
Нарешті, тримайте рівні правильно, коли тунель працює, а застосунок ні. Пакетам, що надходять на шлюз, усе ще потрібні пересилання, зворотний маршрут і політика, яка їх пропускає, і ніщо з цього не виражається правилом ESP. Відсутній порт пояснює конкретний збій, а не кожен збій IPsec. Тримайте виправлення правила й перевірку маршрутизації як два окремі висновки.
Запишіть форму, яку ви спостерігали, додане правило протоколу і лічильник, який побачили після. Три рядки, і наступна людина відрізнить помилку простору імен від помилки маршрутизації за хвилину, а не за півдня.