n2n异地组网(Linux篇)
n2n异地组网(Linux篇)
一些基本概念
研究和使用过一些内网穿透的方案,比如frp
、autossh
等,也用过一些vpn组网,比如openvpn
、L2TP
等。以下是一些对比:
- frp和autossh只针对某些端口开放,如果只是需要暴露特定服务,这个方案不错。
- vpn的方案,比较依赖中心节点,如果是大公司,出口大也无所谓,使用上很方便,也可以异地三层组网。
- n2n比较特殊,中心节点会协助不同节点找到对方,如果能够udp打洞成功,则无需通过中心节点转发数据包,实现真正意义上的点到点网络。而且节点间打通的是局域网环境,二层组网。
由上图可知,我们只需要一台带宽一般的公网服务器作为中心节点,就可以充分利用我们家庭宽带的带宽资源,拿中国移动千兆带宽(上行40M,下行1000M)为例,如果节点A部署在该宽带中,那么就可以实现40M的上行服务,不受中心节点带宽限制。
安装和部署
建议以官网介绍为准。
部署环境
软件支持centos、debian系列、openwrt、windows等,下面我以ubuntu举例。
- 3台机器,一台作为中心节点(supernode,一般为公网机器),两台作为客户端节点(edge)。
- 操作系统全部为Ubuntu20.04
- 下载安装包 --> 链接
supernode节点
- 安装软件
sudo dpkg -i n2n_3.0.0-1038_amd64.deb
- 修改配置文件
sudo vim /etc/n2n/supernode.conf
修改并填入内容,其中-p
是你服务监听的端口,需要防火墙放通该端口(udp),-c
是指定community文件路径,当前配置是和配置文件同目录,主要是限制edge必须设置指定的community才可以连接supernode。
-p=27777
-c=community.list
- 配置community文件
sudo vim /etc/n2n/community.list
修改并填入内容,其中每行可以填入一个community,配置相同community的edge们才能互相通信。
mynetwork
- 启动
sudo systemctl start supernode
- 设置开机启动
sudo systemctl enable supernode
edge节点
- 安装软件
sudo dpkg -i n2n_3.0.0-1038_amd64.deb
- 修改配置文件
sudo vim /etc/n2n/edge.conf
修改并填入内容,其中参数如下
- d : 绑定网卡名称,启动后会新增一个
n2n0
的网卡,并绑定。 - c : 就是服务器的community设置,必须要在服务器的配置文件中,否则无法连接。
- k : 客户端密码,不同edge的密码要一致才能通信,supernode没有配置该密码,所以也没办法截取数据包,确保不同edge间通信安全。
- a : 你edge的ip,两个edge配置在同一网段就可以。
- p : 你的edge进程监听的udp端口,不冲突即可。
- l : supernode的公网地址和端口。
-d=n2n0
-c=mynetwork
-k=mypassword
-a=192.168.1.1
-p=17777
-l=my_vps_ip:27777
- 启动
sudo systemctl start edge
- 设置开机启动
sudo systemctl enable edge
扩展配置
一台机器接入不同supernode
其中-t
参数是管理API(udp),两个配置不一样才可以查看两个的管理信息,可以继续往下看介绍。
- 配置一
# /etc/n2n/edge-1.conf
-d=n2n0
-c=mynetwork1
-k=mypassword1
-a=192.168.1.1
-p=17777
-t=56441
-l=my_vps_ip1:27777
- 配置二
/etc/n2n/edge-2.conf
-d=n2n2
-c=mynetwork2
-k=mypassword2
-a=192.168.2.1
-p=17778
-t=56442
-l=my_vps_ip2:27777
启动命令
sudo systemctl start edge@1
sudo systemctl start edge@2
管理api
- supernode : 默认是
127.0.0.1:5645
(udp) - edge : 默认是
127.0.0.1:5644
(udp)
比如在edge
,可以输入以下命令查看管理信息(包括哪些ip是直连,哪些是中心节点转发等),执行后需要按Enter
刷新信息。
nc -u 127.0.0.1:5644
路由
有时候,我们想要edge节点转发自己局域网的访问请求。比如下图,这个访问需求需要edge2转发请求到edge1。一般还有第二个需求,就是
访问路径如下:
需求1 - 局域网其他终端访问edge1 :192.168.2.2 --> 192.168.2.1 --> snat --> 192.168.1.10 --> 192.168.1.11
需求2 - edge1访问局域网其他终端 :192.168.1.11 --> 192.168.1.10 --> 192.168.2.1 --> 192.168.2.2
- 配置
局域网其他终端
,新增路由192.168.1.0/24
到192.168.2.1
- edge2配置服务器允许转发,并做好防火墙策略,如下:
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
永久生效方法
修改文件/etc/sysctl.conf
,取消注释#net.ipv4.ip_forward=1
- 在edge2节点的
edge.conf
文件增加-r
参数
这时候,需求1完成。下面是需求2:
- 在edge1节点的
edge.conf
文件增加以下内容,代表发往192.168.2.0/24
网段的数据包,发往192.168.1.10
:
-n=192.168.2.0/24:192.168.1.10
需求2完成。