Можно ли сопоставить порт с помощью UPnP и SOAP для привязки к локальному порту, где прослушивает мой http-сервер? - PullRequest
2 голосов
/ 05 декабря 2010

Скажем, я за маршрутизатором на 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: без кеша Подключение: Закрыть Прагма: без кеша Content-Type: text / xml; кодировка = "UTF-8" Пользователь-агент: Microsoft-Windows / 6.1 UPnP / 1.0 SOAPAction: "urn: schemas-upnp-org: service: WANIPConnection: 1 # AddPortMapping" ... ..

Спасибо.

1 Ответ

4 голосов
/ 05 декабря 2010

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

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

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

Я предполагаю, что вы хотите сделать это автоматически / программно как часть чего-то, что вы создаете, поэтому я указал вам выше Согласованная структура 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: Другой возможный способ обойти двойную NATting - заменить ваш маршрутизатор на Linux-систему (например, с помощью OpenWRT или аналогичной) и запустить там код upnp для пересылки. порт модема DSL, а затем также запустите на хосте хост-код на основе miniupnp за маршрутизатором, чтобы дополнительно открыть маршрутизатор. Однако в этот момент, поскольку у вас есть контроль над маршрутизатором, вы можете просто создать статическое сопоставление портов и передать его через все запросы протокола UPNP к модему DSL (сообщая iptables выборочно пересылать / NAT эти пакеты обратно / далее, что выходит за рамки этого ответа).

...