内网穿透

本文最后更新于:2025年4月29日 下午

Zerotier

Zerotier 是一款开源工具,可以用来构建基于点对点(P2P)连接的虚拟专用网(VPN)。把各种设备加入相同的虚拟网络,就可以在任何有网络的地方实现网络内的设备互访。官网:https://www.zerotier.com/

首先通过访问:ZeroTier Central,创建一个自己的网络,并记录自己的Network ID

安装应用

访问页面:Download - ZeroTier,进行下载

Windows:

https://download.zerotier.com/dist/ZeroTier%20One.msi

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

在服务管理中重启

配置完成后,更改路由:

image-20240807174501747

说明 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,保存好文件

image-20240808120630699

加入根节点

这里主要以WindowsLinux演示加入,分别设备下载好 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.购买免费隧道

image-20241017102816408

3.修改隧道

image-20241017103053348

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.ininatapp.exe放在同一个目录下,双击natapp.exe启动即可

image-20241017103911386


内网穿透
https://junyyds.top/2024/07/22/内网穿透/
作者
Phils
发布于
2024年7月22日
更新于
2025年4月29日
许可协议