libp2p / go-libp2p-examples

Example libp2p applications
MIT License
338 stars 145 forks source link

Cannot connect to node in different a network #82

Open rahullenkala opened 5 years ago

rahullenkala commented 5 years ago

I have written a basic pubsub with bootstrap example using golang. I am unable to connect to a node in different network sometimes, I added NATPortMap to the new constructor while creating the node. Here is the code https://gist.github.com/rahullenkala/097fa1b0178a6fe9d275c506014c014c

@upperwal

bandoos commented 5 years ago

Hey @rahullenkala , can you clarify “sometimes”, do you mean that with some external nodes from the same network you can, and some not, or is a “temporal” sometimes? Maybe some node is behind a firewall?

rahullenkala commented 5 years ago

If the nodes are in same network we can connect but if nodes are in different network I am unable to connect @bandoos

upperwal commented 5 years ago

@rahullenkala

I am unable to connect to a node in different network sometimes

In most of the cases this is due to the NAT. When you are in the same network, nodes can connect via loopback or 192.168.*.* or some other private IP. Connecting to a node over the internet might not be that easy due to NATs and firewalls.

You should read some text on how NATs work.

Briefly: NATs helps you translate private IPs to public (routable) IPs and vice-versa. So as a node you would only know your private IPs (192.168.*.* etc) but other nodes (like bootstrap nodes) will only be able to see your public IP address. ISPs usually host multiple connections over the same public IP and hence you are sharing your public IP with maybe a couple of hundred people.

When some third node tries to connect to you on that public IP:port pair, your ISP's NAT will first see if that IP:port pair is "open" or not. Most of the time it won't be open and hence your packet is dropped (I think this is what is happening with you). If it is open then it will look for a private IP who has "opened" that port and redirect the traffic to that private IP after replacing the public IP with the private one in the packet header.

Then how to go about it. Most reliable solution as of now: Use a relay node. Not so reliable: Enable UPnP in Libp2p config. Future: Hole punching mechanism which is not yet available in libp2p.