Universal Plug’n’Play and NAT-PMP on OpenWrt
UPnP (Universal Plug’n’Play) is a protocol that enables programs running on a host to automatically configure port forwardings on their NAT -Router. UPnP basically allows a program to make the router to open necessary ports, without any intervention from the user, without making any check. For this reason, there is a security risk associated with enabling UPnP on your router: technically a worm or malware program could use this function to compromise security for the entire LAN .
Thus, it is recommended to set up port forwarding manually whenever possible, and leave UPnP disabled. However, in some cases dynamic port forwarding is required and manual port forwarding becomes impractical, leaving the user with no other option than to enable UPnP.
NAT-PMP is a protocol similar to UPnP, that is currently an IETF standard, and a number of Windows and Linux applications support it.
Security Concerns
CAUTION: mixing up WAN and LAN interfaces may introduce security risks! See also Incorrect implementation of NAT-PMP in multiple devices.
miniupnpd in Backfire is vulnerable to remote code execution CVE-2013-0230. It is strongly recommended not to use UPnP on this OpenWRT version (what version?). You can check your device with Metasploit:
msfconsole msf> msf > use auxiliary/scanner/upnp/ssdp_msearch msf auxiliary(ssdp_msearch) > set RHOSTS 192.168.0.0/24 msf auxiliary(ssdp_msearch) > run
[*] 192.168.0.9:1900 SSDP Net-OS 5.xx UPnP/1.0 | 192.168.0.9:3278/etc/linuxigd/gatedesc.xml [+] 192.168.0.254:1900 SSDP miniupnpd/1.0 UPnP/1.0 | vulns:2 (CVE-2013-0229, CVE-2013-0230)
Setting up UPnP in backfire
The repositories for OpenWrt Backfire contain minidlna and miniupnpd to provide UPnP support. They are configured in /etc/config/minidlna or /etc/config/miniupnpd respectively. Note that the minidlna package is quite large, and may not fit on routers with a fresh install on Openwrt. If you are only looking for UPnP functionality, miniupnpd is all you need.
To enable/disable NAT -PMP edit /etc/config/upnpd file:
option 'enable_natpmp' '1' option 'enable_upnp' '0'
Also, you need to apply changeset 25251: it’s basically a matter of editing /etc/init.d/miniupnpd, something you can do directly on your live router using nano; please be advised that failing to apply the patch correctly miniupnpd might stop working correctly.
Finally, you may need to execute the following command:
root@OpenWrt:~# uci set upnpd.config.enable_natpmp=1 root@OpenWrt:~# /etc/init.d/miniupnpd restart
Once miniupnpd is installed, it may be necessary to take an addition step to enable it. Navigate to System > Startup, and ensure that the miniupnpd entry is enabled. If it is not, enable it, and click on start.
Checking if UPnP is working
Click on Status > Firewall. If UPnP has been properly enabled, the chains zone_wan_forward and zone_wan_prerouting will both contain an entry named “miniupnpd”. Additionally if you have any UPnP application working, you will be able to find their port mappings. Please note if you have just enabled UPnP, your application may need to be restarted, in order to reconfigure the firewall.
Checking if NAT-PMP is working
From a shell, issue the command:
root@oberon:~# logread | grep -i "\-pmp"
If NAT -PMP is enabled you’ll see something like this:
Mar 24 21:16:59 OpenWrt daemon.notice miniupnpd[2631]: Listening for NAT-PMP traffic on port 5351
Otherwise you will see no message.
Security considerations
As UPnP provides no authentication mechanisms, it is commonly regarded as one giant security hole. A great deal of concern was also generated by the discovery of a buffer overflow vulnerability in the UPnP stack of Windows XP in 2001, which made it possible to obtain SYSTEM level access, and some institutions recommended disabling it altogether. For an historical perspective, see this page from Gibson Research.
It is also been speculated that the design flaws in UPnP would lead to development of a new class of attacks which relied on UPnP. More information about this and possible exploits can be found on UPnP Hacks.
This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website. OK More information about cookies
Self-registration in the wiki has been disabled.
If you want to contribute to the OpenWrt wiki, please post HERE in the forum or ask on IRC for access.
Except where otherwise noted, content on this wiki is licensed under the following license:
CC Attribution-Share Alike 4.0 International
Открываем порты за NAT при помощи NAT-PMP и UPnP IGD
Ранее я много раз слышал, что 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). Если указанный внешний порт свободен, маршрутизатор формирует у себя правило трансляции и рапортует запросившему компьютеру об успешном выполнении запроса.
Q: Проводится ли на маршрутизаторе аутентификация/авторизация запросов на открытие порта?
A: Нет, не проводится.
Теперь же рассмотрим работу данных протоколов более подробно (под катом).
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 ответа).
Первые 2 это запрос внешнего адреса маршрутизатора и ответ с указанием этого самого адреса. Не будем на них подробно останавливаться и лучше рассмотрим, как происходит маппинг портов на примере пакетов 3-4.
Здесь мы видим, что запрашивается проброс внешнего UDP порта 48166 на такой же внутренний порт. Интересно, что внутри протокола не указывается адрес хоста, на который должна происходить трансляция (Inside Local в терминологии Cisco). Это означает, что маршрутизатор должен взять адрес источника пакета из IP-заголовка и использовать его в качестве Inside Local.
Параметр 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 и используется для обнаружения сервисов).
Запускаем торрент-клиент. Он формирует SSDP-запрос и отсылает его на мультикастовый адрес 239.255.255.250.
Маршрутизатор формирует ответ и отправляет его уже юникастом:
Внутри ответа мы можем увидеть 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, Inside Local-адрес указывается внутри самого протокола.
Аналогично NAT-PMP, при закрытии торрент-клиента маппинги проброшенных портов удаляются. Делается это функцией DeletePortMapping:
Можно заметить, что для удаления правила достаточно указать только тип протокола (UDP) и номер внешнего порта, не указывая остальные параметры.
Заключение
В данной статье мы рассмотрели два достаточно простых способа по созданию на домашнем роутере правил Port Forwarding по команде от хоста из локальной сети. Остается лишь отметить, что если вы считаете работу данных протоколов угрозой безопасности вашей домашней сети, то их можно попытаться выключить (хотя, конечно, гораздо лучше доверить вопросы безопасности утилите, которая для этого предназначена — файрволу). В случае моего Zyxel Giga II, на котором, к слову, и проводились все тесты, это делается CLI-командой no service upnp (примечательно, что в веб-интерфейсе опция включения/отключения UPnP отсутствует).