Abhishek Bhatia
Abhishek Bhatia

Reputation: 9796

Port forwarding in python to allow socket connections

I start a server using sockets and want to allow clients to connect to it.

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)

Now, for other clients to connect I have port forward it manually and it works fine. enter image description here

I want to do this in automated fashion. -> I try 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

It opens a port shown in the image below. But the port-forwarding list shown in the first image is empty. It doesn't work and clients can't connect. How can I fix this? What am I missing? enter image description here

Upvotes: 7

Views: 4639

Answers (4)

LakshayGMZ
LakshayGMZ

Reputation: 61

Most of the time ISP don't allow port forwarding, and you spend hours on this trying to forward port.

I went for ngrok - it's a lightweight free of cost (for basic usage) program that tunnels the port and give its own tunneled domain which can be accessed everywhere.

Upvotes: 0

m3nda
m3nda

Reputation: 2017

I think that we are missing lot of related info to know what's the main problem here. I see so many people guessing.

By the way, just editing that line

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

result=upnp.addportmapping('7777', 'TCP', '192.168.1.8', '7777', 'testing', '') would tell you if it works at all. Doing port testing from localhost it's dummy, you're not under the router at all.

Also, remember to use Try/Except blocks to tell you what's wrong on your code.

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

Another way, not fashioned is to use html/web automation, even cURL to make those requests instead using uPnp, this way you don't really need to handle it.

Upvotes: 1

MajorTom
MajorTom

Reputation: 357

I think you made a mistake using upnp.lanaddr as internal-host address. upnp.lanaddr is the address of the upnp device which is your router, you want to use the local address of your server.

If needed take a look at Finding local IP addresses using Python's stdlib if you want to get your server local IP dynamically.

Upvotes: 4

Devidas
Devidas

Reputation: 2517

this is interesting question. from what I could summon I think

GUI shows that UPNP port forwarding rules are added. so Most likely there is issue in UPNPC configuration. I doubt you are doing this on Router or similar platform with X-WRT or OpenWRT

the issue I think is you can't use upnp for this or it doesn't work for some strange reason.

I suggest you try this library pytables.

I know you wanted to know why and I am working on figuring out the reason.

this is just for you to get going on this project

and for quick solution

Try this

 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

Upvotes: -2

Related Questions