Хороший пример можно увидеть как часть структуры 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 эти пакеты обратно / далее, что выходит за рамки этого ответа).