2016-03-21 15 views
7

Avvio un server tramite socket e voglio consentire ai client di connettersi ad esso.Port forwarding in python per consentire connessioni socket

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) 

Ora, per altri client da connettere, ho il port forward manualmente e funziona correttamente. enter image description here

Voglio farlo in modo automatico. -> Provo 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 

Apre una porta mostrata nell'immagine in basso. Ma l'elenco di port forwarding mostrato nella prima immagine è vuoto. Non funziona e i client non possono connettersi. Come posso risolvere questo? Cosa mi manca? enter image description here

+0

Puoi connetterti localmente? –

+0

@BrianCain Sì, utilizzando 127.0.0.1 sulla stessa macchina. –

+1

Penso che la "lista di inoltro porta nella prima immagine" mostra solo mappature manuali. –

risposta

-3

questa è una domanda interessante. da quello che potrei evocare credo

GUI mostra che le regole di inoltro porta UPNP sono state aggiunte. quindi Molto probabilmente c'è un problema nella configurazione UPNPC. Dubito che lo stiate facendo su Router o una piattaforma simile con X-WRT o OpenWRT

il problema penso che non sia possibile utilizzare upnp per questo o non funzioni per qualche strano motivo.

Ti suggerisco di provare questa libreria pytables.

So che volevi sapere perché e sto lavorando per capire il motivo.

questo è solo per voi per andare avanti su questo progetto

e per soluzione rapida

Prova questo

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

Ciao e questo è un codice già pronto l'ho trovato [qui] (http://stackoverflow.com/questions/20734319/how-to-write-specific-iptables-rules-using-python-iptables). 'sottoprocesso di importazione p = subprocess.Popen ([" iptables "," -A "," INPUT "," -p "," tcp "," -m "," tcp "," --dport ", "22", "-j", "ACCEPT"], stdout = subprocess.PIPE) output, err = p.communicate() output di stampa' – Devidas

+2

Si prega di [modificare] la risposta per includere il codice o altre cose che rispondono al domanda, piuttosto che virare su un commento. – Ajean

+0

@Devidas Ciao, grazie per la risposta! Ho provato il tuo codice, mi dà questo errore: '>>> p = subprocess.Popen ([" iptables "," -A "," INPUT "," -p "," tcp "," -m "," tcp "," --dport "," 22 "," -j "," ACCEPT "], stdout = subprocess.PIPE) ' 'Traceback (ultima chiamata ultima): File" ", riga 1, in file "C: \ Anaconda \ lib \ subprocess.py", la linea 710, in __init__ errread, errwrite) file "C: \ Anaconda \ lib \ subprocess.py", la linea 958, in _execute_child STARTUPINFO) WindowsError: [Errore 2] Il sistema non riesce a trovare il file specificato'. Per favore fatemi sapere se mi manca qualcosa. –

4

Credo che hai fatto un errore utilizzando upnp.lanaddr come indirizzo interno-host. upnp.lanaddr è l'indirizzo del dispositivo upnp che è il router, si desidera utilizzare l'indirizzo locale del proprio server.

Se necessario, dare un'occhiata a Finding local IP addresses using Python's stdlib se si desidera ottenere l'IP locale del server in modo dinamico.

0

Penso che ci manchino molte informazioni correlate per sapere qual è il problema principale qui. Vedo tanta gente che indovina.

Tra l'altro, proprio la modifica di quella linea

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

result=upnp.addportmapping('7777', 'TCP', '192.168.1.8', '7777', 'testing', '') sarebbe dirvi se funziona affatto. Fare test delle porte da localhost è fittizio, non sei affatto sotto il router.

Inoltre, ricorda di utilizzare i blocchi Try/Except per dirti cosa c'è di sbagliato nel tuo codice.

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

Un altro modo, non foggiato è quello di utilizzare l'automazione html/web, anche cURL per fare tali richieste invece utilizzare UPnP, in questo modo non si ha realmente bisogno per gestire la cosa.