Python: открыть слушающий порт за маршрутизатором (upnp?) - PullRequest
12 голосов
/ 08 декабря 2010

Я разработал приложение, которое, по сути, представляет собой небольшой FTP-сервер с возможностью указывать, какой каталог вы хотите использовать при запуске. Я использую ftplib для сервера, потому что он болен легко. Единственная проблема, с которой я сталкиваюсь, заключается в том, что если вы находитесь за маршрутизатором, вам нужно вручную переадресовать порты на вашем маршрутизаторе, и я обнаружил, что это слишком сложно для моих пользователей (так называемых коллег / клиентов).

Итак, я искал простое решение для открытия портов, но я обнаружил, что большинство API слишком широки и неоправданны. Кто-нибудь знает решение, которое было бы относительно простым в реализации?

Примечание: он действительно будет использоваться только в Windows, хотя кросс-платформенная совместимость приветствуется. Если есть решение для Windows, которое проще, я бы выбрал это.

Спасибо!

Ответы [ 5 ]

9 голосов
/ 04 мая 2012

Требуемый протокол называется IGD (для устройства интернет-шлюза) и основан на UPNP.Это позволяет клиентской программе (вашей) обнаружить маршрутизатор в сети (используя UPNP), а затем попросить ее переадресовать определенный порт.

Это поддерживается большинством домашних маршрутизаторов, и метод используетсямного сервисов, таких как BitTorrent или многопользовательские игры, но немного сложнее в использовании или реализации.Существует несколько библиотек с открытым исходным кодом, которые поддерживают IGD, и одна из самых простых (также кросс-платформенных) - « miniupnp »: см. http://miniupnp.free.fr/

8 голосов
/ 27 февраля 2016

Простой пример для miniupnp.Он создает сопоставление на обнаруженном шлюзе от внешнего порта 43210 до интерфейса, подключенного к порту 43210 на интерфейсе, подключенном к обнаруженному шлюзу.

import miniupnpc

upnp = miniupnpc.UPnP()

upnp.discoverdelay = 10
upnp.discover()

upnp.selectigd()

port = 43210

# addportmapping(external-port, protocol, internal-host, internal-port, description, remote-host)
upnp.addportmapping(port, 'TCP', upnp.lanaddr, port, 'testing', '')
3 голосов
/ 22 февраля 2015

Похоже, есть несколько вариантов, один из которых miniupnp . Здесь также есть привязки python для GNUPnP здесь . Для Windows minupnp будет работать, или вы можете пойти чистый Python с Миранда-UpNP .

Есть хороший пример привязки Python GNUPnP, используемой для открытия портов на маршрутизаторе здесь . В этом примере время аренды установлено на 0, что не ограничено. См. здесь для определения add_port.

Простой пример может быть:

#! /usr/bin/python
import gupnp.igd
import glib
from sys import stderr

my_ip = YOUR_IP

igd = gupnp.igd.Simple()
igd.external_ip = None

main = glib.MainLoop()

def mep(igd, proto, eip, erip, port, localip, lport, msg):
    if port == 80:
        igd.external_ip = eip
        main.quit()

def emp(igd, err, proto, ep, lip, lp, msg):
    print >> stderr, "ERR"
    print >> stderr, err, proto, ep, lip, lp, msg
    main.quit()

igd.connect("mapped-external-port", mep)
igd.connect("error-mapping-port", emp)

#igd.add_port("PROTO", EXTERNAL_PORT, INTERNAL_IP, INTERNAL_PORT, LEASE_DURATION_IN_SECONDS, "NAME")
igd.add_port("TCP", 80, my_ip, 8080, 86400, "web")

main.run()
2 голосов
/ 09 декабря 2010

Есть статья , объясняющая, как использовать COM-объект Windows IGD с win32com.

0 голосов
/ 01 мая 2018

Я искал это много дней.Мне не удалось установить miniupnpc с помощью pip для Python 3.

Я решил эту проблему с помощью найденной реализации здесь , которая будет работать для Python 2.

Я разветвил ее ивнесите изменения, которые будут использоваться на python 3, вы можете найти его Здесь

Эта реализация является самой простой из тех, что я видел, и хорошо работает.

...