Раніше я багато разів чув, що UPnP якимось чином вміє самостійно відкривати порти (виробляти Port Forwarding на роутері) за запитом від хоста з локальної мережі. Однак, те, яким саме чином це відбувається, і які протоколи для цього використовуються, досі було покрито для мене пеленою туману.
У даній статті я хочу коротко розповісти, як працюють два механізми для проброса портів, а саме NAT Port Mapping Protocol і Internet Gateway Device (IGD) Protocol. що входить в набір протоколів UPnP. На свій подив я виявив, що в рунеті інформація з даного питання більш ніж мізерна, що і спонукало мене на написання даної замітки.
Для початку наведу короткий FAQ:
Q: Для чого потрібні дані протоколи?
A: Для формування на маршрутизаторі правила проброса певного TCP / UDP порту (Port Forwarding) не вручну, а «автоматично», тобто за запитом від хоста у внутрішній мережі.
Q: Як це реалізується?
A: Пристрій за NAT відправляє маршрутизатора запит із зазначенням внутрішнього і зовнішнього номерів портів і типу протоколу (TCP / UDP). Якщо вказаний зовнішній порт вільний, маршрутизатор формує у себе правило трансляції та рапортує запит комп'ютера про успішне виконання запиту.
Тепер же розглянемо роботу даних протоколів більш докладно (під катом).
Port Mapping Protocol
NAT-PMP описаний в RFC 6886. Для своєї роботи він використовує UDP-порт сервера 5351.
Розглянемо роботу протоколу на конкретному прикладі - торрент-клієнті Vuze 5.7 для Windows 7.
Примітка: NAT-PMP у Vuze за замовчуванням вимкнений. Його необхідно активувати в настройках плагінів.
1. Запускаємо Wireshark. У рядку фільтра вводимо nat-pmp
2. Запусках Vuze.
3. Зупиняємо перехоплення пакетів, дивимося результати.
У мене вийшло наступне:
Всього бачимо 6 пакетів (3 запити і 3 відповіді).
Параметр Requested Port Mapping Lifetime очікувано означає час життя запису в таблиці трансляцій.
Як ми бачимо, маршрутизатор передбачувано створив запитувану трансляцію і відповів кодом Success. Параметр Seconds Since Start of Epoch означає час з моменту ініціалізації таблиці трансляцій (тобто з моменту останньої перезавантаження роутера).
Маппінг TCP-портів відбувається точно також і відрізняється тільки значенням поля Opcode.
Після того, як додаток припинило використовувати дані порти, воно може послати маршрутизатора запит на видалення трансляції.
Головна відмінність від запиту на видалення від запиту на створення полягає в тому, що параметр Lifetime встановлюється в нуль.
Ось що станеться, якщо ми закриємо Vuze.
На цьому розгляд NAT-PMP закінчено, пропоную перейти до більш «мудрованому» UPnP IGD.
Internet Group Device Protocol
Для обміну своїми повідомленнями даний протокол використовує SOAP.
Однак, на відміну від NAT-PMP, IGD не використовує фіксований номер порту сервера, тому перед тим, як обмінюватися повідомленнями, потрібно спершу цей порт дізнатися. Робиться це за допомогою протоколу SSDP (даний протокол є частиною UPnP і використовується для пошуку послуг).
Маршрутизатор формує відповідь і відправляє його вже Юнікаст:
Усередині відповіді ми можемо побачити URL для взаємодії з маршрутизатором по протоколу IGD.
Далі Vuze підключається до маршрутизатора за вказаною URL і отримує XML з інформацією про даний пристрій, в тому числі містить набір URI для управління деякими функціями маршрутизатора. Після того, як потрібний URI знайдений в rootDesc.xml, Vuze відправляє SOAP-запит на соданія NAT-трансляції по знайденому URI.
Примітка: до того, як запросити створення трансляції, Vuze змусив маршрутизатор перерахувати всі наявні Port Forwarding'і. Для чого це було зроблено, я можу лише здогадуватися.
SOAP-запит на створення трансляції UDP-порта:
Як говорилося раніше, потрібний URI (йде відразу після POST) Vuze взяв з rootDesc.xml. Для додавання трансляції використовується функція з назвою AddPortMapping.
Аналогічно NAT-PMP, при закритті торрент-клієнта Маппінг проброшенних портів видаляються. Робиться це функцією DeletePortMapping:
Можна помітити, що для видалення правила досить вказати тільки тип протоколу (UDP) і номер зовнішнього порту, що не вказуючи інші параметри.
висновок
У даній статті ми розглянули два досить простих способи по створенню на домашньому роутере правил Port Forwarding по команді від хоста з локальної мережі. Залишається лише відзначити, що якщо ви вважаєте роботу даних протоколів загрозою безпеки вашої домашньої мережі, то їх можна спробувати вимкнути (хоча, звичайно, набагато краще довірити питання безпеки утиліті, яка для цього призначена - файрвол). У разі мого Zyxel Giga II, на якому, до речі, і проводилися всі тести, це робиться CLI-командою no service upnp (примітно, що в веб-інтерфейсі опція включення / відключення UPnP відсутня).