zerotier 无公网 ip 搭建远程办公环境

因公司部分公共服务都搭建在内网服务器中,所以在非办公室网络环境下是无法使用这些服务的。本篇文章主要来记录一下基于 zerotier 来异地组网的过程。

注册账号

www.zerotier.com/,可以直接使用 google 或者 github 账号登录。

创建 network

在 settings 中配置 Access Control 为 Private 表示需要授权后才能接入。

内网服务器配置(centos7)

安装 zerotier

bash 复制代码
curl -s https://install.zerotier.com | sudo bash

启动 zerotier 服务

bash 复制代码
sudo systemctl start zerotier-one

加入 zerotier 网络

bash 复制代码
sudo zerotier-cli join <your_network_id>

在 zerotier 中进行授权

然后检查网络状态

bash 复制代码
sudo zerotier-cli listnetworks

配置转发规则,意思就是将通过 zerotier 网卡的请求转发到服务器的网卡上

bash 复制代码
vim /etc/sysctl.conf

在最后一行增加如下内容,表示启用 ipv4 转发

bash 复制代码
net.ipv4.ip_forward = 1

应用更改

bash 复制代码
sudo sysctl -p

配置网卡相关环境变量,可以通过 ifconfig 命令查看,根据服务器 ip 和 zerotier ip 找到对应的网卡名称

bash 复制代码
PHY_IFACE=连接内网的网卡的名字
ZT_IFACE=zerotier的虚拟网卡名字

更新路由表

bash 复制代码
sudo iptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE
sudo iptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT
sudo iptables-save

持久化路由表

bash 复制代码
sudo mkdir -p /etc/sysconfig/
sudo sh -c "iptables-save > /etc/sysconfig/iptables"

zerotier 静态路由配置

Destination 为服务器的实际网段,Via 为 zerotier 的 ip 地址。这条规则表示当你在访问 172.168.20.X 的服务时会转发给 172.27.116.15 。

客户端连接(以 mac 为例)

到这里 www.zerotier.com/download/ 下载 mac pkg 安装包,安装后点击 "join new network",输入 <your_network_id>,然后点击 "join"。查看网络连接状态 Status 是否显示 OK,如果不是,可以尝试勾选下图红框中的两项。

待连接成功后,可以尝试 ping 一下内网服务器的 ip,发现可以 ping 通了。

但是不难发现延迟很高......如果没有公网 ip 的话,到这里也能将就着用一下了。有公网 ip 的话,可以自建 moon 节点来提升网络访问速度。

自建 moon 节点步骤

我这里使用的是一台阿里云的 ecs 服务器,系统也是 centos7 的,首先安装好 zerotier,然后 join 到组网中。

生成 moon 配置文件步骤如下:

bash 复制代码
cd /var/lib/zerotier-one/
zerotier-idtool initmoon identity.public > moon.json

执行完成后会在当前目录下生成一个 moon.json 的文件,然后使用 vim 来编辑 json 中的 stableEndpoints 字段,值为 ip/9993,ip 为该服务器对应的公网 ip。

配置完成后记得在阿里云的安全组中放开 udp 9993 端口。

创建签名文件

bash 复制代码
zerotier-idtool genmoon moon.json
mkdir moons.d
sudo mv 000000xxxxxxxx.moon moons.d/
systemctl restart zerotier-one # 重启中转服务

客户端和内网服务器配置

加入 moon 节点命令,注意:内网服务器和 client 的机器都需要增加 moon 节点。

bash 复制代码
zerotier-cli orbit id id # moon.json 文件中的 id

通过 zerotier-cli listpeers 命令可以查看已连接的节点,发现多了一个 moon 节点,就表示连接成功了。

然后我们再尝试来 ping 一下内网服务器的 ip

发现延迟明显降低了,正常使用 ssh 啥的基本没问题了。

踩坑

内网服务器中有基于 docker 部署的 gitlab,配置后非 docker 的服务可以正常访问,docker 部署的服务无法访问,经过一番排查,最终是通过清理了 iptables 的规则后解决了。

清理步骤如下:

bash 复制代码
iptables -X
iptables -F
iptables -Z

如果提示,docker is busy 的话,需要先执行 systemctl stop docker,停止 docker 服务。

参考文章

相关推荐
Patrick_Wilson2 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
Suroy2 天前
DockerView-Go:用 Go 写一个终端 Docker 监控工具,顺便做了个 Web 仪表盘
docker
云恒要逆袭2 天前
运行你的第一个Docker容器
后端·docker·容器
宋均浩3 天前
# Docker 镜像瘦身实战:从 1.2G 到 80MB 的五个优化步骤
ci/cd·docker
程序员老赵4 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
WangMingHua1114 天前
LM Studio Docker 部署——本地大模型一键启动
docker
曲幽5 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
Jackson__6 天前
AI 时代,CLI 正在迎来第二春
ai编程·命令行
武子康7 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
Alsn8610 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker