2016-03-21 12 views
7

Uruchamiam serwer przy użyciu gniazd i chcę umożliwić klientom łączenie się z nim.Przekierowanie portów w pythonie, aby umożliwić połączenia z gniazdami

self.sock.bind(('0.0.0.0',0)) # 0.0.0.0 will allow all connections and port 0 -> os chooses a open port. 
stroke_port=self.sock.getsockname()[1] 
self.sock.listen(75) 
self.open_port_popup(stroke_port) 

Teraz, dla innych klientów do połączenia Mam port do przodu ręcznie i działa dobrze. enter image description here

Chcę to zrobić w sposób zautomatyzowany. -> Próbuję upnp.

import miniupnpc 

def open_port(port_no): 
    '''this function opens a port using upnp''' 
    upnp = miniupnpc.UPnP() 

    upnp.discoverdelay = 10 
    upnp.discover() 

    upnp.selectigd() 

    # addportmapping(external-port, protocol, internal-host, internal-port, description, remote-host) 
    result=upnp.addportmapping(port_no, 'TCP', upnp.lanaddr, port_no, 'testing', '') 
    return result 

Otwiera port pokazany na obrazku poniżej. Ale lista przekazywania portów widoczna na pierwszym obrazie jest pusta. To nie działa, a klienci nie mogą się połączyć. Jak mogę to naprawić? czego mi brakuje? enter image description here

+0

Czy możesz połączyć się lokalnie? –

+0

@BrianCain Tak, używając 127.0.0.1 na tym samym komputerze. –

+1

Myślę, że "lista przekierowania portów na pierwszym obrazie" pokazuje tylko odwzorowania ręczne. –

Odpowiedz

-3

to interesujące pytanie. z tego, co mogłem przywołać, myślę, że

GUI pokazuje, że dodano reguły przekierowania portów UPNP. więc Najprawdopodobniej jest problem z konfiguracją UPNPC. Wątpię, czy robisz to na routerze lub na podobnej platformie z X-WRT lub OpenWRT

problemu, który moim zdaniem nie można użyć upnp do tego lub nie działa z jakiegoś dziwnego powodu.

Proponuję wypróbować tę bibliotekę pytables.

Wiem, że chciałeś wiedzieć dlaczego i pracuję nad ustaleniem przyczyny.

to tylko, aby dostać się dzieje na tym projekcie

i szybkie rozwiązanie

Spróbuj

import subprocess 

p = subprocess.Popen(["iptables", "-A", "INPUT", "-p", "tcp", "-m", "tcp", "--dport", "22" , "-j", "ACCEPT"], stdout=subprocess.PIPE) 
     output , err = p.communicate() 
     print output 
+0

Witam i jest to gotowy kod Znalazłem go [tutaj] (http://stackoverflow.com/questions/20734319/how-to-write-specific-iptables-rules-using-python-iptables). 'importuj podproces p = podproces.open ([" iptables "," -A "," INPUT "," -p "," tcp "," -m "," tcp "," --dport ", "22", "-j", "AKCEPTUJĘ"], stdout = podproces.PIPE) dane wyjściowe, err = p.communicate() wydrukuj " – Devidas

+2

Proszę [edytuj] swoją odpowiedź, aby dołączyć kod lub inne rzeczy, które odpowiadają pytanie, a nie komentowanie. – Ajean

+0

@Devidas Cześć, thx za odpowiedź! Próbowałem twojego kodu, to daje mi ten błąd: '>>> p = subprocess.Popen ([" iptables "," -A "," INPUT "," -p "," tcp "," -m "," tcp "," --dport "," 22 "," -j "," ACCEPT "], stdout = subprocess.PIPE) ' 'Traceback (ostatnie ostatnie połączenie): Plik" ", wiersz 1, w pliku "C: \ Anakonda \ lib \ subprocess.py" linia 710 w __init__ errread, errwrite) pliku "C: \ Anakonda \ lib \ subprocess.py" linia 958 w _execute_child STARTUPINFO) WindowsError: [Error 2] System nie może znaleźć określonego pliku. Daj mi znać, na wypadek, gdy czegoś mi brakuje. –

4

myślę, że popełnił błąd, używając upnp.lanaddr jako adres wewnętrzny-gospodarza. upnp.lanaddr to adres urządzenia upnp, które jest routerem, którego chcesz użyć lokalnego adresu serwera.

W razie potrzeby spójrz na numer Finding local IP addresses using Python's stdlib, aby dynamicznie uzyskać lokalny adres IP serwera.

0

Myślę, że brakuje wielu powiązanych informacji, aby dowiedzieć się, jaki jest główny problem. Widzę wielu ludzi zgadujących.

Nawiasem mówiąc, po prostu edytując tę ​​linię

result=upnp.addportmapping(port_no, 'TCP', upnp.lanaddr, port_no, 'testing', '') do

result=upnp.addportmapping('7777', 'TCP', '192.168.1.8', '7777', 'testing', '') powie ci, czy to w ogóle działa. Wykonywanie testów portu z localhost to manekin, w ogóle nie jesteś pod routerem.

Pamiętaj też, aby używać bloków Try/Except do informowania o błędach w kodzie.

try: 
    print "1" + 1 
except Exception as e: 
    print str(e) 

Innym sposobem, nie ukształtowana jest wykorzystanie automatyzacji html/WWW, nawet cURL, aby te wnioski, a nie za pomocą UPnP, w ten sposób naprawdę nie potrzeba go obsłużyć.

Powiązane problemy