Готельні мережі та конференц-міжмережеві екрани часто показують власне поле дозволу, і хтось вводить у нього 47, сподіваючись, що PPTP працюватиме. Правило створюється, тунель усе одно не працює, а наступна спроба використовує інший номер. Помилка в самому пакеті: у IPv4 є поле протоколу, яке називає те, що йде після заголовка IP, тоді як у TCP і UDP є поля порту, що існують лише всередині одного з цих заголовків. Це не два написання одного дозволу.

Заголовок IPv4 називає наступний протокол

Поле протоколу — це один байт у заголовку IPv4, і в ньому зберігається число, що описує корисне навантаження: 6 для TCP, 17 для UDP, 47 для GRE, 50 для ESP. Усе, що фільтрує пакети, читає це значення, перш ніж дивитися глибше, бо глибший заголовок має сенс лише після того, як тип відомий. Змініть порт пізніше в розмові, і це поле не зрушило.

Отже, правило, написане проти протоколу 47, описує рівень IP. Жоден порт не бере участі в рішенні.

Порти існують усередині TCP і UDP, більше ніде

Порти — це шістнадцятибітні ідентифікатори всередині заголовків TCP і UDP, і їхнє завдання — розділяти розмови, що ділять одну адресу. Заголовок GRE несе значення типу протоколу, часто EtherType, плюс необов'язкові ключі для мультиплексування. Тому вираз «порт 47» не називає нічого, з чим пакет GRE міг би збігтися.

Інтерфейси міжмережевих екранів різняться тим, наскільки це показують. Одні приймають номер протоколу, інші пропонують іменований список, а небагато приймають лише TCP або UDP з портами.

PPTP використовує обидва рівні одночасно

PPTP — найясніший приклад, бо він навмисно ділить роботу між двома рівнями. Керівне з'єднання — це сеанс TCP до порту 1723, а шлях даних — GRE, протокол 47, без жодного порту. Міжмережевий екран, що дозволяє 1723 і більше нічого, дає переговорам початися, а потім відкидає корисне навантаження. Тунель виглядає завислим після автентифікації, а не не з'єднується, і саме тому симптом часто повідомляють як проблему з паролем.

PathOuter protocolPort
Control channelTCP, protocol 61723
Data channelGRE, protocol 47None

Читайте два рядки окремо, коли пишете правило, і перевіряйте кожен за синтаксисом виробника. Одному рядку потрібен порт, іншому — номер протоколу, і жоден запис не охоплює обидва.

Чому сторінка переадресації портів не може виразити GRE

Форма переадресації, що приймає лише TCP і UDP, не може описати GRE, як би ця форма не називалася. Трансляція адрес додає другу складність, бо GRE не має портів, і транслятор має натомість стежити за ідентифікатором виклику. Деякі домашні маршрутизатори постачаються з помічником, який це обробляє; багато — ні, і жоден додатковий запис дозволу TCP не створить такої поведінки.

Там, де реальною вимогою є сучасний тунель, вибирайте рішення, яке навмисно використовує TCP або UDP, замість сподіватися, що транслятор вгадає правильно.

Інкапсуляція визначає, що бачить фільтр

Інкапсуляція змінює зовнішній пакет, а правило зіставляється саме із зовнішнім пакетом. Власний ESP — це протокол 50, тоді як проходження через NAT загортає ESP в UDP 4500, щоб він пережив трансляцію адрес. Фільтр, що дозволяє UDP 4500, ніколи не бачить протоколу 50, а фільтр, написаний для протоколу 50, ніколи не збігається із загорнутою формою.

Запитайте, про яку інкапсуляцію домовилися клієнт і шлюз, а потім напишіть правило саме для цієї зовнішньої форми і нічого більше.

Пишіть правило так, щоб хтось міг його перевірити

Виражайте кожне правило як родину адрес, зовнішній протокол, транспортні порти, якщо вони є, напрямок і обидві кінцеві точки. Рецензент може порівняти це речення із записом пакетів і дійти вердикту. Інструкцію відкрити 47 ніхто не може перевірити, і саме тому вона роками живе в книжках процедур.

Додайте тест, який це доводить: підключіться, водночас записуючи трафік на зовнішньому інтерфейсі, і підтвердьте зовнішній протокол і порт, які справді видно в сліді.

Схожі статті