如何通过 docker 部署 n2n

在以往,部署 n2n 往往需要通过 make 进行源码编译,或是通过包管理器下载安装。安装过程繁琐且难以迁移,配置也容易造成混乱

我在 docker hub 上找到了一个制作水平很高的 n2n v2.9 docker,仅仅只有 7 MB 且运行良好。下面介绍如何通过这个镜像实现 n2n 的 docker 部署。

镜像获取与测试

首先需要下载镜像,通过以下代码将镜像从 docker hub 下载到本地:

1
docker push yingftf/n2n

运行以下指令就能在不运行容器的情况下测试镜像是否可用及其 n2n 版本:

1
2
3
docker run --rm --network host yingftf/n2n supernode -h

docker run --rm --cap-add=NET_ADMIN --cap-add=NET_RAW --device=/dev/net/tun --network host yingftf/n2n edge -h

n2n 的容器化部署

在 docker hub 页面上,作者介绍了通过映射卷操作配置文件部署的方法。但经过我的测试这个方法很不稳定,容器很可能无法启动。因此这里只介绍通过 docker 指令部署 n2n 的方法。

各位也可以参考 n2n 官方仓库文档

配置 supernode

直接输入以下指令即可:

1
2
3
4
5
docker run -d --restart=always --network host  --name supernode yingftf/n2n supernode -p 8990 -f -v

# 以上 docker 指令等价于以下指令

supernode -l 8990 -f -v

检查 docker ps,发现名为 supernode 的容器处于运行状态则说明部署完成

配置 edge

即使是部署了 supernode 的主机,也必须部署一个 edge 。也就是说,这个主机会同时运行两个容器

在每一个将要部署 edge 的主机上输入以下指令即可:

1
2
3
4
5
6
7
8
9
docker run -d --restart=always --cap-add=NET_ADMIN --cap-add=NET_RAW --device=/dev/net/tun --network host  --name edge0 yingftf/n2n edge -a 10.10.2.1 -c mynetwork -k nic1234 -l {supernode 的公网 IP}:8990 -r -f

# 以上 docker 指令等价于以下指令,
# 其中 `10.10.2.1` 是你可以自定义的该 edge 节点的 n2n 内网 IP;
# `mynetwork` 是你可以自定义的 n2n 网络名称;
# `nic1234` 是你可以自定义的 n2n 密钥;
# `{supernode 的公网 IP}` 是你部署 supernode 的主机的公网 IP。

edge -a 10.10.2.1 -c mynetwork -k nic1234 -l {supernode 的公网 IP}:8990 -r -f

检查 docker ps,发现名为 edge0 的容器处于运行状态则说明部署完成。

检查 n2n 连接是否建立

在 supernode 主机(10.10.2.1)上检查:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(base) [root@iz2zeid7airzi8dw94q5l4z ~]# ping 10.10.2.3
PING 10.10.2.3 (10.10.2.3) 56(84) bytes of data.
64 bytes from 10.10.2.3: icmp_seq=1 ttl=64 time=10.0 ms
64 bytes from 10.10.2.3: icmp_seq=2 ttl=64 time=9.25 ms
64 bytes from 10.10.2.3: icmp_seq=3 ttl=64 time=9.02 ms
64 bytes from 10.10.2.3: icmp_seq=4 ttl=64 time=9.63 ms
^C
--- 10.10.2.3 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 9.028/9.492/10.051/0.400 ms
(base) [root@iz2zeid7airzi8dw94q5l4z ~]# ssh root@10.10.2.3
root@10.10.2.3's password:
Last login: Tue Jan 17 05:45:36 2023 from 10.38.26.180
(env-3.7) (base) [root@localhost ~]#

Ping 和 SSH 均能连接,说明 n2n 连接成功建立

然后在 edge 主机(10.10.2.3)执行同样操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(env-3.7) (base) [root@localhost home]# ping 10.10.2.1
PING 10.10.2.1 (10.10.2.1) 56(84) bytes of data.
64 bytes from 10.10.2.1: icmp_seq=1 ttl=64 time=11.3 ms
64 bytes from 10.10.2.1: icmp_seq=2 ttl=64 time=10.0 ms
64 bytes from 10.10.2.1: icmp_seq=3 ttl=64 time=9.66 ms
64 bytes from 10.10.2.1: icmp_seq=4 ttl=64 time=9.69 ms
^C
--- 10.10.2.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 9.667/10.194/11.333/0.682 ms
(env-3.7) (base) [root@localhost home]# ssh root@10.10.2.1
root@10.10.2.1's password:
Last login: Tue Jan 17 20:20:28 2023 from 120.36.171.227

Welcome to Alibaba Cloud Elastic Compute Service !

(base) [root@iz2zeid7airzi8dw94q5l4z ~]#

至此, n2n 的容器化部署和连接建立全部完成。