Можно ли сопоставить порт с помощью UPnP с SOAP для привязки к локальному порту, который прослушивает мой http-сервер?

Скажем, я нахожусь за маршрутизатором 192.168.0.1, который ведет к внешнему IP-адресу 192.168.1.64 (модем dsl), который ведет к общедоступному интернет-адресу.

Возможно ли с помощью uPnP через запросы SOAP к шлюзу сопоставить локальный порт http-сервера с произвольным портом на этом общедоступном интернет-адресе?

Извините, я совсем новичок в этом деле. Я тестирую использование Putty на порту 80 на шлюзе, выдавая http с xml.

POST /upnp/control3 HTTP/1.1 Cache-Control: no-cache Connection: Close Pragma: no-cache Content-Type: text/xml; charset="utf-8" User-Agent: Microsoft-Windows/6.1 UPnP/1.0 SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping" ... ..

Спасибо.


person kaneda    schedule 05.12.2010    source источник


Ответы (1)


Вы можете увидеть хороший пример как часть инфраструктуры Coherence DNLA/UPnP в модуле Python под названием «Puncher» («пробивает» дыры в вашем брандмауэре, да! :о), который может создавать сопоставления внешних портов (например, порт 8080) на внутренние порты по вашему выбору:

http://coherence.beebits.net/browser/trunk/Puncher/puncher/base.py

Модули Coherence также доступны в Debian в виде пакета python-coherence. В Windows также, если вы используете ActiveState Python.

Я предполагаю, что вы хотите сделать это автоматически/программно как часть того, что вы создаете, поэтому я указал вам на приведенный выше заголовок Структура Coherence DNLA/UPnP в Python.

Если вы просто хотите сделать это вручную, есть несколько отличных инструментов командной строки и графического интерфейса для создания сопоставлений портов UPnP. На компьютерах Mac ручной инструмент с графическим интерфейсом доступен по адресу http://www.codingmonkeys.de/portmap/index.html от создателей SubEtha Edit. В Windows ручной инструмент с графическим интерфейсом доступен по адресу http://deusty.blogspot.com/2008/07/tcmportmapper-for-windows.html .

Я настоятельно рекомендую вам поиграть с Coherence в Python, это может быть увлекательным опытом программирования. В качестве альтернативы, многие различные программы, использующие сеть, будут иметь модули UPnP для открытия портов и перенаправления/сопоставления их с вашим локальным компьютером. Например, он есть у µTorrent, у libtorrent/rtorrent и у многих других.

См. также следующие библиотеки, примеры и инструменты с реализациями клиента UPnP для программного перенаправления/сопоставления портов на вашем маршрутизаторе, если вы не любите Python (они на C и Perl):

http://miniupnp.tuxfamily.org/

https://trac.transmissionbt.com/browser/trunk/libtransmission/upnp.c

http://www.howtoforge.com/administrating-your-gateway-device-via-upnp

Обратите внимание, что вторая ссылка, https://trac.transmissionbt.com/browser/trunk/libtransmission/upnp.c — это код популярного BitTorrent-клиента Transmission, который использует библиотеку miniupnp (первая ссылка).

Надеюсь, это ответило на ваш вопрос. Желаю удачи во всем, что вы делаете.

РЕДАКТИРОВАТЬ: @kaneda: В ответ на ваш комментарий вы находитесь за двумя NAT, один у вашего DSL-модема, а другой у вашего беспроводного маршрутизатора, если я вас правильно понимаю. Простой UPnP здесь вам не поможет, вам нужно либо настроить UPnP сопоставление портов как на DSL-модеме, так и на маршрутизаторе (вероятно, это невозможно, так как ваш маршрутизатор, вероятно, не позволит запросам UPnP покидать свой порт WAN), DSL-модем или ваш маршрутизатор для моста, а не NAT, чтобы вы были только за одним NAT.

РЕДАКТИРОВАТЬ 2: @kaneda: Другой возможный способ обойти двойное преобразование NAT — это заменить маршрутизатор устройством Linux (например, с помощью OpenWRT или аналогичного) и запустить там код upnp для переадресации DSL. порт модема, а затем также запустите код на основе miniupnp на своем хосте за маршрутизатором, чтобы еще больше открыть маршрутизатор. Однако в этот момент, поскольку у вас есть контроль над маршрутизатором, вы можете просто создать статическое сопоставление портов и передать ему все запросы протокола UPNP на модем DSL (указав iptables выборочно пересылать / NAT эти пакеты назад / далее, что выходит за рамки этого ответа).

person ido    schedule 05.12.2010
comment
Спасибо за быстрый ответ! К сожалению, tcpportmapper здесь работает фатально, не знаю почему. В настоящее время я нахожусь в окне Windows, я попробовал приложение Python, которое вы мне предложили. Похоже, мне нужно. Проблема в том, что, по-видимому, мой Wi-Fi-маршрутизатор поддерживает upnp, потому что он отвечает соответствующим образом. Как и мой DSL-модем. Проблема, я думаю, что сопоставления успешны, но бессмысленны, возможно, потому, что внешний IP-адрес, который я получаю от шлюза Wi-Fi, принадлежит модему, который, в свою очередь, имеет свой собственный внешний IP-адрес, который является интернет-адресом. Я могу сопоставить Wi-Fi GW, но я не могу получить доступ к сопоставленному порту из ниоткуда. - person kaneda; 05.12.2010