
Background
I have multiple devices including a NAS, a Raspberry Pi, and two MacBooks in different networks, my home and office. All I need is that I want to let all these devices can be accessed in any of those networks. After searching on the internet, I found out n2n should be the one I looked for. The architecture and setup are very simple 👍.
Steps to Setup N2N Virtual Network
1. Setup a super node
The supernode should be run on a device that can be accessed from the public network. I'm using a VPS with public IP to run this, so all edge nodes can connect to it directly. The VPS I have is based on Debian, and the following commands only testyed on Debian in this post. Let's say the public IP of the VPS is 200.200.200.200.
supernode -l 9053
# output
-> supernode -l 9053
07/Aug/2019 06:45:47 [supernode.c: 476] Supernode ready: listening on port 9053 [TCP/UDP]
2. Run edge nodes
We can have multiple edge nodes that connect to one super node. Don't forget to change the virtual IP of the following command.
edge -d n2n0 -a 192.168.100.1 -c YOU_NETWORK_NAME -k YOUR_PASS -l 200.200.200.200:9053
now, we have a device with private network IP 192.168.100.1. If you have run this command on other devices, you can ping it from each other.
Run n2n in Docker Container
To run N2N VPN on macOS is not a good choice, I run into problems. It's better to use docker or vagrant, it depends on you.
# Dockerfile
FROM debian:stable-slim
RUN apt-get update && apt-get -y install iputils-ping n2n socat
# Build the Dockerfile
docker build -f Dockerfile -t n2n .
# Run a edge node
docker run -d -p 9091:9091/tcp --name=n2n --privileged --rm -it n2n edge -d n2n0 -a 192.168.100.1 -c YOU_NETWORK_NAME -k YOU_PASS -l 200.200.200.200:9053
Enable Port Forwarding
The port of 9091 is used by Transmission. At first, I tried to use iptables to forward port, so I can visit a remote Transmission by typing http://localhost:9091 in my browser on docker host device. But, it turns out not working, the socat is a good one for port forwarding. I also encountered a known bug of Linux, here the link if you are interested in it.
Run the command below in your edge node container.
# Forward a port
ifconfig n2n0 mtu 500
nohup socat TCP4-LISTEN:9091,fork TCP4:192.168.100.1:9091 &
Then, we can visit the Transimission web UI on my Chrome browser.
| REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
|---|---|---|---|---|
| n2n | latest | f0628fbbb0e6 | 3 hours ago | 93.4MB |
| CONTAINER ID | NAME | CPU % | MEM USAGE / LIMIT | MEM % | NET I/O |
|---|---|---|---|---|---|
| b6a1d36c60b2 | n2n | 0.00% | 1.77MiB / 1.952GiB | 0.09% | 40.2kB / 39.7kB |
From the two tables above, the memory and CPU usage is very small, don't have to worry about resource usage.