内网穿透
本文最后更新于:2025年4月29日 下午
Zerotier
Zerotier 是一款开源工具,可以用来构建基于点对点(P2P)连接的虚拟专用网(VPN)。把各种设备加入相同的虚拟网络,就可以在任何有网络的地方实现网络内的设备互访。官网:https://www.zerotier.com/
首先通过访问:ZeroTier Central,创建一个自己的网络,并记录自己的Network ID
安装应用
访问页面:Download - ZeroTier,进行下载
Windows:
Linux:
curl -s https://install.zerotier.com | sudo bash
安装成功后,通过一下命令检验:
root@jd ~$ zerotier-cli info
200 info b35ec77777 1.14.0 ONLINE
卸载应用
# 通过dpkg删除zerotier-one服务
sudo dpkg -P zerotier-one
# 删除zerotier-one文件夹,该文件夹存储了address地址,删除后再次安装会获得新的address地址
sudo rm -rf /var/lib/zerotier-one/
加入网络节点
Windows:在状态栏对应用右键,选择加入网络,输入我们的Network ID,在页面ZeroTier Central中进行授权同意->Auth
Linux:sudo zerotier-cli join Network ID
,显示200 join OK
则在页面进行授权同意
配置 Moon,加速网络
zerotier 默认使用全球的服务节点,高峰时刻不稳定,官方也有说明,可以搭建自己的 moon 服务器作为跳板,加速网络。
当有云服务器时,将服务器加入网络,进入服务器程序所在目录,默认为:/var/lib/zerotier-one
cd /var/lib/zerotier-one
生成moon.json配置文件
sudo zerotier-idtool initmoon identity.public >>moon.json
编辑moon.json配置文件
sudo vim moon.json
将配置文件中的"stableEndpoints": []
修改成"stableEndpoints": ["ServerIp/9993"]
,将ServerIp
替换成公网 Ip
生成.moon 文件
sudo zerotier-idtool genmoon moon.json
将生成的 000000xxxxxxxxxx.moon
移动到 moons.d
目录
sudo mkdir moods.d
sudo cp 000000xxxxxxxxxx.moon moods.d/
.moon 配置文件名一般为
10个前导零
+本机节点ID
重启 zerotier-one 服务
sudo systemctl restart zerotier-one.service
使用 Moon
在其他设备上
# 查看设备网络
sudo zerotier-cli listnetworks
# 查看设备节点连接情况
sudo zerotier-cli listpeers
可以通过查看设备节点连接情况,看到节点中有我们配置的 Moon 服务器的节点 ID,但是角色还是LEAF
200 listpeers <ztaddr> <path> <latency> <version> <role>
200 listpeers 61777fcf53 - -1 - LEAF
我们以 Moon 的形式将 Moon 服务器节点添加到我们的设备中
先复制 Moon 服务器的 id,通过 zerotier-cli info
查看
复制 Moon 服务器的 /var/lib/zerotier-one/moons.d/
到其余服务器相同位置,
如 Windows 系统的 c:\programdata\zerotier\one\moons.d
或 Linux 系统的 /var/lib/zerotier-one/moons.d/
Linux:
sudo zerotier-cli orbit 服务器id 服务器id
# 例如:sudo zerotier-cli orbit b35ec77777 b35ec77777
#返回结果
200 orbit OK
// 重启
systemctl restart zerotier-one
**Windows:**通过管理员运行 cmd
zerotier-cli.bat orbit 服务器id 服务器id
在服务管理中重启
配置完成后,更改路由:
说明 1: 192.168.196.0/24,局域网网段
说明 2: 把所有主机的局域网 IP 都加上去,例如我有 3 个
说明 3: 路由生效存在延迟,多 ping 几次
说明 4: ping 技巧: 主机优先 ping 公网的内网 IP,然后逐个 ping 其他主机的 IP;每个主机都执行一次,速度就上来了
说明 5: 把默认的删除掉,不然还会走默认的路由
创建根节点 Planet
创建根节点 Planet 需要有一个云服务器,并且拥有公网 Ip
安装
我们使用 docker 安装:ZTNet - Zerotier Web UI Documentation、postgres(数据库)、zerotier
安装 Docker,Docker Compose 后,创建一个 docker-compose.yml 文件
services:
postgres:
image: postgres:15.2-alpine
container_name: postgres
restart: unless-stopped
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: ztnet
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- app-network
zerotier:
image: zyclonite/zerotier:1.14.0
hostname: zerotier
container_name: zerotier
restart: unless-stopped
volumes:
- zerotier:/var/lib/zerotier-one
cap_add:
- NET_ADMIN
- SYS_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
networks:
- app-network
ports:
- "9993:9993/udp"
environment:
- ZT_OVERRIDE_LOCAL_CONF=true
- ZT_ALLOW_MANAGEMENT_FROM=172.31.255.0/29
ztnet:
image: sinamics/ztnet:latest
container_name: ztnet
working_dir: /app
volumes:
- zerotier:/var/lib/zerotier-one
restart: unless-stopped
ports:
- 3000:3000
# - 127.0.0.1:3000:3000 <--- Use / Uncomment this line to restrict access to localhost only
environment:
POSTGRES_HOST: postgres
POSTGRES_PORT: 5432
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: ztnet
NEXTAUTH_URL: "http://localhost:3000" # !! Important !! Set the NEXTAUTH_URL environment variable to the canonical URL or IP of your site with port 3000
NEXTAUTH_SECRET: "random_secret"
NEXTAUTH_URL_INTERNAL: "http://ztnet:3000" # Internal NextAuth URL for 'ztnet' container on port 3000. Do not change unless modifying container name.
networks:
- app-network
links:
- postgres
depends_on:
- postgres
- zerotier
############################################################################
# #
# Uncomment the section below to enable HTTPS reverse proxy with Caddy. #
# #
# Steps: #
# 1. Replace <YOUR-PUBLIC-HOST-NAME> with your actual public domain name. #
# 2. Uncomment the caddy_data volume definition in the volumes section. #
# #
############################################################################
# https-proxy:
# image: caddy:latest
# container_name: ztnet-https-proxy
# restart: unless-stopped
# depends_on:
# - ztnet
# command: caddy reverse-proxy --from <YOUR-PUBLIC-HOST-NAME> --to ztnet:3000
# volumes:
# - caddy_data:/data
# networks:
# - app-network
# links:
# - ztnet
# ports:
# - "80:80"
# - "443:443"
volumes:
zerotier:
postgres-data:
# caddy_data:
networks:
app-network:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.31.255.0/29
或者直接下载:
wget -O docker-compose.yml https://raw.githubusercontent.com/sinamics/ztnet/main/docker-compose.yml
更改docker-compose.yml
,设置默认服务器 IP
services:
...
ztnet:
...
environment:
...
NEXTAUTH_URL: "http://公网Ip:3000"
启动 docker:
docker compose up -d
放开服务器3000
端口,访问 http://公网ip:3000
,进行注册,注册的一个用户为管理员
然后点击设置
-》控制器
,在最下面创建自定义星球,输入公网 ip,点击创建,点击下载 api/planet
,保存好文件
加入根节点
这里主要以Windows
和Linux
演示加入,分别设备下载好 zerotier 客户端,Download - ZeroTier
将刚才保存的planet
文件,分别覆盖到:
- Windows:
C:\ProgramData\ZeroTier\One
路径下 - Linux:
/var/lib/zerotier-one
路径下
重启服务:
- windows:
win + R
,输入services.msc
,找到ZeroTier One
-》重启动 - Linux:
systemctl restart zerotier-one
使用命令查看根节点是否只有自己的一个:zerotier-cli peers
,可以看到只有一个PLANET
$ zerotier-cli peers
200 peers
<ztaddr> <ver> <role> <lat> <link> <lastTX> <lastRX> <path>
b740eaaaee 1.14.0 PLANET 21 DIRECT 942 15 公网Ip/9993
然后我们加入网络节点,在 Web 管理页面,选择本地控制器
-> 创建网络
->复制网络ID
在设备中加入网络:zerotier-cli join 网络ID
Natapp
将自己开发的机器上的应用提供到公网上进行访问,但是并不想通过注册域名、搭建服务器;由此可以使用 natapp(内网穿透)
1.注册用户
进入官网后进行注册:https://natapp.cn
2.购买免费隧道
3.修改隧道
4.下载 natapp 应用
下载对应机型应用:https://natapp.cn/#download,下载好后解压,得到natapp.exe
5.配置应用
进行内网穿透还需要配置本地配置文件config.ini,参考网址:https://natapp.cn/article/config_ini
#将本文件放置于natapp同级目录 程序将读取 [default] 段
#在命令行参数模式如 natapp -authtoken=xxx 等相同参数将会覆盖掉此配置
#命令行参数 -config= 可以指定任意config.ini文件
[default]
authtoken=取得authtoken(刚刚才购买的隧道) #对应一条隧道的authtoken
clienttoken= #对应客户端的clienttoken,将会忽略authtoken,若无请留空,
log=none #log 日志文件,可指定本地文件, none=不做记录,stdout=直接屏幕输出 ,默认为none
loglevel=ERROR #日志等级 DEBUG, INFO, WARNING, ERROR 默认为 DEBUG
http_proxy= #代理设置 如 http://10.123.10.10:3128 非代理上网用户请务必留空
6.运行应用
将配置文件config.ini与natapp.exe放在同一个目录下,双击natapp.exe启动即可