Протокол 47 проти порту TCP 47: два заголовки, два правила
Номер протоколу і порт живуть у різних заголовках, тому одне правило не може замінити інше. PPTP розділяє їх, а поле порту не може виразити GRE.
Готельні мережі та конференц-міжмережеві екрани часто показують власне поле дозволу, і хтось вводить у нього 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 і більше нічого, дає переговорам початися, а потім відкидає корисне навантаження. Тунель виглядає завислим після автентифікації, а не не з'єднується, і саме тому симптом часто повідомляють як проблему з паролем.
| Path | Outer protocol | Port |
|---|---|---|
| Control channel | TCP, protocol 6 | 1723 |
| Data channel | GRE, protocol 47 | None |
Читайте два рядки окремо, коли пишете правило, і перевіряйте кожен за синтаксисом виробника. Одному рядку потрібен порт, іншому — номер протоколу, і жоден запис не охоплює обидва.
Чому сторінка переадресації портів не може виразити GRE
Форма переадресації, що приймає лише TCP і UDP, не може описати GRE, як би ця форма не називалася. Трансляція адрес додає другу складність, бо GRE не має портів, і транслятор має натомість стежити за ідентифікатором виклику. Деякі домашні маршрутизатори постачаються з помічником, який це обробляє; багато — ні, і жоден додатковий запис дозволу TCP не створить такої поведінки.
Там, де реальною вимогою є сучасний тунель, вибирайте рішення, яке навмисно використовує TCP або UDP, замість сподіватися, що транслятор вгадає правильно.
Інкапсуляція визначає, що бачить фільтр
Інкапсуляція змінює зовнішній пакет, а правило зіставляється саме із зовнішнім пакетом. Власний ESP — це протокол 50, тоді як проходження через NAT загортає ESP в UDP 4500, щоб він пережив трансляцію адрес. Фільтр, що дозволяє UDP 4500, ніколи не бачить протоколу 50, а фільтр, написаний для протоколу 50, ніколи не збігається із загорнутою формою.
Запитайте, про яку інкапсуляцію домовилися клієнт і шлюз, а потім напишіть правило саме для цієї зовнішньої форми і нічого більше.
Пишіть правило так, щоб хтось міг його перевірити
Виражайте кожне правило як родину адрес, зовнішній протокол, транспортні порти, якщо вони є, напрямок і обидві кінцеві точки. Рецензент може порівняти це речення із записом пакетів і дійти вердикту. Інструкцію відкрити 47 ніхто не може перевірити, і саме тому вона роками живе в книжках процедур.
Додайте тест, який це доводить: підключіться, водночас записуючи трафік на зовнішньому інтерфейсі, і підтвердьте зовнішній протокол і порт, які справді видно в сліді.