使用局域网ip访问局域网,支持P2P和流量转发。

1. 需求与调研

作为学生党,在教研室使用GPU服务器办公很方便,特别是采用Docker虚拟化方案后,虚拟机一样的使用体验,自己的电脑只用来敲代码,实验就在服务器上运行,十分方便。

gezp:基于Docker的GPU服务器桌面虚拟化33 赞同 · 32 评论文章

在教研室时使用体验还好,但如果在宿舍中想访问服务器,比如,看一下实验进度,那就没办法了,因为教研室属于内网(某些教研室可能具有固定的公网IP,那就无需考虑这些东西),由于NAT的存在,无法直接访问。那么有什么技术可以在访问内网呢?答案是有的,那就是内网穿透技术。在没有公网IP的情况下,目前主流的内网穿透方案有如下两种:

  • 端口流量转发:Frp转发,花生壳等

  • 虚拟局域网:Zerotier,N2N等

Frp是一款非常好用的内网穿透软件,非常稳定,但是Frp的有两个问题,(1)只能提供端口级别的内网穿透,如果只需要服务固定端口,比如22端口的SSH,还是很好用了,但是如果需要访问其它端口,需要独立映射。(2)需要云服务器来实现流量转发,而高带宽的云服务器价格较贵,花生壳提供类似的商业服务,不过对于学生党,白嫖才是王道,怎么便宜怎么来。

Zerotier采用另一种策略,每台机器上安装一个虚拟网卡,实现虚拟局域网,这样处于公网中的机器也能够像在局域网中一样访问服务器,十分方便,并且它支持P2P,即便没有私有云服务器,也能够进行内网穿透,Zerotier是由一款商业公司维护的软件,技术方面的可靠性还是不错的。当然,Zerotier也有它的问题(1)某些网络环境无法实现P2P穿透,这种情况,Zerotier就会采用流量转发,但是Zerotier的服务器在国外,且有带宽限制,会导致连接速度慢,甚至无法连接。(2)每台主机需要安装额外的客户端。这样扩展不方便,如果多台服务器,每一台服务器都需要安装一遍。

Zerotier具有一定局限性,并不是任何网络环境下都能进行P2P,比如我使用宿舍Wifi就能P2P访问教研室主机,但是使用手机4G网络就不行。

Frp和Zerotier有各自适用情况

  • Frp适合有云服务器,低带宽需求,只需要固定端口服务(如SSH,FTP等)的用户。

  • Zerotier适合高带宽(如远程桌面,需要支持P2P)需求,需要灵活访问(端口服务较多,或者不固定)的用户。

目前看来,Zerotier更符合我的需求,只是能不能通过一些技术手段,解决Zerotier的局限性呢?这样就能完美符合需求了。

  • 如何在Zerotier不支持P2P时,采用自己的私有服务器,进行流量转发?保证Zerotier在任何情况可用(至少可以采用私有云服务进行流量转发),以此保证Zerotier的网络稳定性。

  • 如何避免为每一台主机安装Zerotier?否则,每增加一台主机,就需要安装Zerotier。(如果路由器能安装Zerotier就好了,不过我们教研室的普通路由器,不支持扩展)

Zerotier 优先使用P2P,当无法进行P2P时,Zerotier控制器会进行流量转发,但由于Zerotier 服务器在国外,流量转发速率慢,可使用moon加速转发,但是moon配置繁琐,不方便使用,而且moon将会被官方弃用,正在开发的zerotier2.0版本将会迎来更好的流量转发功能(可以期待zerotier后续开发)

2. 基本网路架构

如何避免为每一台主机安装Zerotier?

  • 虽然我的路由器不支持安装Zerotier,但是我可以在一台主机上安装Zerotier,然后把这台主机当作路由器,实现路由转发,不就行了。

Zerotier支持设置静态路由表,这个是解决问题的关键。

利用zerotier内网穿透能力及静态路由,可以方便建立起虚拟局域网,方便客户机访问局域网中的主机。路由示意图如下:

图示解释:
(1)绿色区域代表局域网,工作主机都位于局域网内。
(2)局域网中只有一个主机安装zerotier,并加入zerotier虚拟局域网中,作为LAN中心主机(主机3,充当路由器作用)。
(3)客户机都安装了zerotier,并加入zerotier虚拟局域网中。
(4)箭头代表一条路由示例(详见路由案例)

该网络的5个网段(各个网段需要保证不同):

  • 1个局域网段:主机所在网段。

  • 1个zerotier网段:在zerotier控制器界面设置静态路由表,该路由表会自动下发到每一个zerotier终端机器。

  • 3个docker网段:本机可以路由到docker网段。

主机3的作用:

  • 将主机3作为局域网路由主机,通过开启路由转发以及设置静态路由表,提供路由功能,这样zerotier网段中的机器就能路由到局域网中的机器了。

  • 也就是说客户机将主机3作为跳板访问到其所在的局域网LAN Net.

该方案的优点:

  • 扩展方便:避免了每一台主机都需要安装zerotier的麻烦,只需要一台主机安装zerotier即可(主机3),也就是说局域网新增加一台主机,只需要在zerotier管理器中增加静态路由表即可。

  • IP一致性:无论在局域网内外,都使用局域网的ip访问主机。

局限性:
(1)对网段有要求,要求所有网段不能相同(如果客户机在外网,网段不能和主机局域网网段相同)。
(2)当前方案只提供单向访问能力。比如客户机2可以访问主机1和主机2,但是主机1和主机2不能访问到客户机2。(不过,从另一个角度来说,我们也只需要这种单向访问能力)

客户机1案例

这是最简单的案例,如果客户机位于局域网LAN Net内,可直接通过局域网IP访问主机。客户机1访问主机1,使用192.168.0.105访问主机1,路由路径如下:

  • 192.168.0.118(客户机1) -> 192.168.0.105(主机1)

客户机2案例

将主机3作为跳板,访问局域网LAN中的机器。客户机2访问主机1,使用192.168.0.105访问主机1,路由路径如下:

  • 192.168.192.11(客户机2) -> 192.168.192.7 / 192.168.0.107(主机3) -> 192.168.0.105(主机1)

192.168.192.11(客户机2)-> 192.168.192.7 这段路由是根据zerotier静态路由表确定的。这段的路由为P2P模式,实际上会更加复杂一些。

3. 扩展网路架构

如何在Zerotier不支持P2P时,采用自己的私有服务器,进行流量转发?

  • 还是上面的思路,采用路由转发,首先本机添加静态路由表,访问局域网IP时,转发到VPS上,然后由VPS转发到局域网中的主机上。

扩展的网络路由图如下:

VPS的作用

  • VPS安装zerotier,并加入zerotier虚拟局域网中,用于流量中继。采用路由转发方案,即使用VPS作为跳板访问到主机3,进而使用主机3作为跳板访问到局域网LAN Net.

  • 由于VPS是公共主机,VPS几乎可以与zerotier网段中的任意机器进行P2P通信。

Tip: 这里使用路由转发,实现中继功能。

客户机3案例

如果客户机与主机3在zerotier网络中不支持P2P,利用VPS主机作为跳板,访问局域网LAN中的机器。客户机3访问主机1,使用192.168.0.105访问主机1,路由路径如下:

  • 192.168.192.11(客户机3) -> 192.168.192.3(VPS)-> 192.168.192.7 / 192.168.0.107(主机3) -> 192.168.0.105(主机1)

(1)192.168.192.11(客户机3) -> 192.168.192.3(VPS)这段路由是根据客户机3中的静态路由表确定的。
(2)192.168.192.3(VPS)-> 192.168.192.7 这段路由是根据zerotier静态路由表确定的。

客户机3案例2

如果对于客户机3,设置了静态路由表之后,移动到客户机2的网络环境中去,那么此时,就会存在两个到192.168.0.0/24的路由,移动到客户机1的网络环境中,甚至会有3个路由。

  • 192.168.0.0/24 -> 192.168.192.7 : 由zerotier自动生成 (根据zerotier控制器中的静态路由设置)。

  • 192.168.0.0/24 -> 192.168.192.3 : 客户机3静态路由表。

这时候存在选择路由的问题,理论上应该优先选择192.168.0.0/24 -> 192.168.192.7这条P2P的路由,只有不能进行P2P时,才选择 192.168.0.0/24 -> 192.168.192.3这条路由进行VPS转发。

  • 使用跃点数实现,设置静态路由表时,将 192.168.0.0/24 -> 192.168.192.3的跃点数设置非常大(例如9000),这样优先级最低。

访问方式优先级

综上,通过zerotier+静态路由表,实现了客户机可以在任意地方访问到主机1

  • 优先选择局域网直连

  • 次优先选择P2P zerotier连接

  • 最后选择VPS中转连接

除此之外,访问docker网段类似,不再详述,需要注意的一点,需要保证各个网段不同。

4. zerotier虚拟局域网配置

zerotier配置

安装zerotier(linux)

  • 客户机,路由主机(主机3),VPS(可选),需要安装zerotier,并加入网络

curl -s https://install.zerotier.com | sudo -E bash
sudo zerotier-cli join xxxxxxxxxxxxxxx

zerotier控制器静态路由配置

  • 登录my.zerotier.com/

  • 局域网路由和docker网络路由,目的ip都为路由主机(主机3)的zerotier ip

路由主机(主机3)配置

开启路由转发

#临时生效echo "1" > /proc/sys/net/ipv4/ip_forward#永久生效,需要修改sysctl.conf,然后执行sysctl -pnet.ipv4.ip_forward = 1

防火墙设置

sudo iptables -A FORWARD -i zt3jn72ets -j ACCEPT
sudo iptables -A FORWARD -o zt3jn72ets -j ACCEPT
sudo iptables -t nat -A POSTROUTING  ! -o lo -j MASQUERADE#这里zt3jn72ets为zerotier虚拟网卡#保存iptable规则#sudo apt-get install iptables-persistent#sudo sh -c "iptables-save > /etc/iptables/rules.v4"

docker网络路由

#添加静态路由表,docker网络ip段需要不同,指向docker宿主机ip.#临时方法sudo ip route add 172.21.0.0/16 via 192.168.0.106
sudo ip route add 172.22.0.0/16 via 192.168.0.105#sudo ip route del 172.17.0.0/16 #删除路由

不同主机docker配置

为每一台主机修改默认docker桥接网(或创建新的网络),子网不能重复,避免路由冲突

#修改默认docker0的ip,不同主机需要不一样vim /etc/docker/daemon.json#"bip": "172.21.0.1/16"sudo systemctl daemon-reload
sudo systemctl restart docker#或者使用新的网桥#docker network create --driver bridge --subnet=172.20.1.0/24 dockerlan1

此时,在客户机上就可以访问每一台主机和docker了。

ping 192.168.0.106#可以观察TTL的值,就可以知道是哪一种方式了,TTL=64表示直连,每减小1,表示经过一层路由。

5. 扩展操作

VPS路由转发配置(可选)

云服务器配置(防火墙设置)

sudo iptables -A FORWARD -i zt3jn72ets -j ACCEPT
sudo iptables -A FORWARD -o zt3jn72ets -j ACCEPT
sudo iptables -t nat -A POSTROUTING  ! -o lo -j MASQUERADE#这里zt3jn72ets为zerotier虚拟网卡#保存iptable规则#sudo apt-get install iptables-persistent#sudo sh -c "iptables-save > /etc/iptables/rules.v4"
对于云主机,如果zerotier网络较慢,可能需要手动设置服务商提供的防火墙,打开所有UDP端口。

客户机路由配置(win10)

#win10 powershell(管理员),目标ip为VPS的zerotier ip.route add 192.168.0.0 mask 255.255.255.0 -p 192.168.192.3 METRIC 9000#route delete 192.168.0.0 #route PRINT

Frp端口转发(可选)

为中心主机增加frp路由转发功能,确保即使在zerotier完全失效的情况下,也可以外网访问中心主机的ssh等服务。 配置文件 frpc.ini

# frpc.ini[common]server_addr = xx.xx.xx.xxserver_port = 7700token = xxxxxxxxxxx[ssh]type = tcplocal_ip = 127.0.0.1local_port = 22remote_port = 13022[nomachine]type = tcplocal_ip = 127.0.0.1local_port = 4000remote_port = 13040

启动容器

docker run --restart=always --name gezp-frpc \       --network host -d \       -v ~/gezp/frp/frpc.ini:/etc/frp/frpc.ini \       snowdreamtech/frpc

6.写在最后

该方案其实并不复杂,仅仅是在使用zerotier的基础上,增加了几行路由,但使得内网穿透访问更加便利,特别是IP一致性的体验非常好,在局域网和在外网访问主机的IP都无需改变。

需要注意的是,必须保证在外网时,自己所处的IP网段与服务器的局域网IP网段不能一样


2021.11.15 更新:如果需要VPS中继功能,建议采用下一篇文章中的双zerotier网络方案

gezp:基于Zerotier的虚拟局域网(VPS中继优化)20 赞同 · 7 评论文章


编辑于 2021-11-15 20:39

穿透内网

VLAN

软路由

赞同 10130 条评论

分享

喜欢收藏申请转载

写下你的评论...


30 条评论

默认

最新

IT科技南

IT科技南

Zerotier这个到你这里有点被吹爆还不如国内的easynet, ,它本身致命缺点:无法跨运营商使用;就这一点注定就无法进行商业化的!

2021-06-25

回复1

gezp

gezp

作者

首先,这不是商业解决方案,学生党,所以要白嫖(狗头保命)。目前Zerotier P2P做的还可以,反正教研室和宿舍之间是支持P2P的(能跑满带宽,我宿舍50M带宽),然后使用VPS(阿里的,学生10块一个月,2M带宽),用来不支持P2P时(比如校外)用来作为流量转发(Zerotier免费的流量转发在国内完全不通),这基本上是最廉价的,并且保证稳定性的方案了。

2021-06-25

回复5

gezp

gezp

作者

纸鸢

目前是可以的(我教研室移动网,我学校电信网),和运营商无关,和NAT环境有关系,其实我感觉P2P,大家的技术差不多,难点在于NAT的限制,而且我认为zerotier技术算优秀的了,如果它不支持P2P的情况,大概率其他P2P软件也不支持,这时候只能走流量转发了,流量转发也就意味着按流量或带宽收费(个人观点)

2021-11-29

回复3

展开其他 2 条回复

东半岛的王德发

东半岛的王德发

别的都好说。。就是iptables那边不太会设置。。centos7应该怎么搞?

2022-05-15

回复1

gezp

gezp

作者

不是写了命令吗?[飙泪笑]

2022-05-16

回复喜欢

st1ll

st1ll

文章是好文章,就是对于非专业人士需要一点时间理解。[赞]

2022-03-22

回复喜欢

乌贼

乌贼

请问一下有没有主机1和2访问客户机2的方案呢?路由器是可以支持添加静态路由的。但我尝试把主机3添加到路由器的静态路由表,目标是Zerotier的网段,但并不成功

08-25

回复喜欢

乌贼

乌贼

gezp

太感谢作者给回复了[爱]我继续努力看看能不能解决这个问题

08-27

回复喜欢

gezp

gezp

作者

看样子好像没问题,用zerotier网段访问,可以用ping检查一下链路,看哪里断了[飙泪笑]

08-25

回复喜欢

txj

txj

sudo iptables -t nat -A POSTROUTING ! -o lo -j MASQUERADE

07-12

回复喜欢

萧鼓入梦

萧鼓入梦

请教下如果主机1.2.3都没有docker的情况下,在主机3使用虚拟网卡,去静态路由跳转应该也行吧?

06-26

回复喜欢

gezp

gezp

作者

应该是可以的,本质上就是静态路由的配置。

06-26

回复喜欢

祝麒麟

祝麒麟

我才发现,你说的是一种不存在的网站不存在的软件。。。

06-25

回复喜欢

biubiubiu

biubiubiu

打开所有UDP会不会有什么问题?

04-06

回复喜欢

biubiubiu

biubiubiu

怎么看云服务器有没有工作[爱]

03-29

回复喜欢

biubiubiu

biubiubiu

gezp

谢谢

03-30

回复喜欢

gezp

gezp

作者

ping的时候看ttl,每经过一次路由减一。

03-29

回复喜欢

月儿弯弯

月儿弯弯

你好 按你这个方案 主机3是win7转发不了啊 客户机2访问不了主机1和主机2

03-24

回复喜欢

gezp

gezp

作者

需要开启ipv4路由转发功能,win7不是很清楚怎么开启[思考]

03-24

回复喜欢

wenxin667

wenxin667

关于
2. 基本网路架构
如何避免为每一台主机安装Zerotier?
【客户机2案例】
客户机2经过主机3访问主机1的时候,主机3是如何做到转发数据的。
我看着 主机3并没有写啥规则啊~


难道是---》主机3的 zerotier ip 192.168.192.7 网卡接收到数据之后,会自动转发给 本机的物理ip 192.168.0.107 ?
就算是这样,那么 192.168.0.107 是如何做到转发给 192.168.0.105 的呢?



02-24

回复喜欢

gezp

gezp

作者

192.168.192.7/192.168.0.107是同一个物理主机的不同网卡而已,在这台主机上ping 192.168.0.105,肯定可以ping通,这条路径是通过路由器到192.168.105的。

02-24

回复1

zurica

zurica

难的的教程,把原理也讲了一遍。确定moon现在不好用了吗?

2021-08-06

回复喜欢

gezp

gezp

作者

moon可以用,但是用起来很麻烦,在下一代zerotier2.0, 官方都已经放弃了moon概念,不过zerotier2.0的发布估计还需要等很长一段时间。

2021-08-07

回复2

gezp

gezp

作者

Ampere King

官网blog,最早2019年就提出了,不过开发进度缓慢,近期有加快开发节奏,最新相关blog:zerotier.com/2021/08/04

2021-08-30

回复喜欢

展开其他 2 条回复

李DF

李DF

客户机2案例中 我能Ping通主机3的LAN IP ,但是Ping不通主机1的LAN IP 不知怎么回事?

2022-10-13

回复喜欢

gezp

gezp

作者

zerotier的静态路由配置了吗?

2022-10-13


标签: none

添加新评论