前言

随着科技发展日新月异,我们越来越需要软件,越来越依赖互联网。但是全球IPv4地址池即将耗尽,各地运营商开始逐步收回IPv4地址。那么家庭宽带没有公网IP,同时又想发布本地服务到公网应该怎么办呢?本文就是为了解决这个问题,通过 内网穿透 技术,我们能够实现安全、稳定地发布本地服务到公网。不用担心,一切都很简单,请耐心一点继续往下看。

内网穿透简介

内网穿透(又称 NAT 穿透端口转发)是一种网络技术,用于解决处于内网(局域网)中的设备无法被公网直接访问的问题。
在传统网络架构中,内网设备通过路由器或防火墙连接到公网,这类设备通常只拥有私有 IP 地址(如 192.168.x.x、10.x.x.x),无法被公网直接识别和访问。
内网穿透的核心原理是通过一个具有公网 IP 的服务器(称为 穿透服务器中转服务器)作为中介,建立内网设备与公网之间的通信通道,使公网用户能够访问内网中的服务或设备。

适用场景:

  • 远程办公与设备访问

    • 场景:在家访问公司内网的文件服务器、OA 系统或开发环境。
    • 示例:程序员在家调试公司内网的代码服务器,或员工远程访问公司打印机。
    • 优势:无需部署复杂的 VPN,通过轻量级工具即可实现安全访问。
  • 开发与测试环境搭建

    • 场景:本地开发的 Web 应用、API 接口需要公网测试(如微信小程序开发、支付接口调试)。
    • 示例:开发者在本地运行网站,通过内网穿透生成临时公网 URL,供测试人员或客户直接访问。
    • 优势:避免频繁部署到公网服务器,提升开发效率。
  • 智能家居与物联网设备管理

    • 场景:远程控制家中的智能设备(如摄像头、路由器、智能家电)。
    • 示例:在外地通过手机查看家里的监控摄像头,或控制智能门锁。
    • 挑战:部分物联网设备仅支持内网通信,需通过穿透实现远程管理。
  • 游戏与联机应用

    • 场景:搭建本地游戏服务器(如我的世界、饥荒)并邀请公网玩家加入。
    • 问题:传统局域网游戏无法直接被公网访问,需通过穿透转发游戏端口。
    • 工具:常用的蛤蟆吃(Hamachi)、NPS 等工具可实现游戏联机。
  • 服务器资源复用与低成本部署

    • 场景:使用家庭宽带搭建个人服务器(如博客、NAS),替代高成本的公网服务器。
    • 限制:家庭宽带通常无公网 IP 且运营商限制端口,内网穿透可突破此限制。
    • 示例:通过穿透将本地 NAS 存储映射到公网,实现远程文件存取。
  • 工业与企业内网服务暴露

    • 场景:工厂设备监控系统、企业内部管理系统需要对外提供部分服务。
    • 安全考虑:通过穿透服务器设置访问权限,避免直接暴露内网 IP,提升安全性。

常用的内网穿透工具:

  • FRP
  • NPS
  • Zerotier
  • EasyTier

以上工具各有优缺点,本人目前已经写了 ZerotierFrp 的配置教程,后续会把其他的内网穿透工具教程一个个全部补充上去。

内网穿透 通过 “中转” 机制打破了内网与公网的隔离,在开发、运维、物联网等场景中具有广泛应用。选择工具时需根据需求(如带宽、协议、安全性)权衡开源与商业方案,同时重视网络安全,避免因穿透导致内网暴露风险。

本文使用Zerotier,这个软件官方也提供免费通道,但是很不稳定,所以本文是自建Planet实现稳定的内网穿透。

力求小白看了也能直接配好,每行要执行的代码前面会标注执行原因。但是你如果连怎么连接云服务器都不清楚的话,你需要先搜一下怎么SSH连接云服务器。

首先我们得有一台拥有公网IP的云服务器,推荐雨云

雨云优惠注册地址:https://www.rainyun.com/

优惠码:xiaotie

使用优惠码注册后绑定微信可获得5折券。

其他云服务器推荐:

配置前提:

  • 一台拥有公网IP的云服务器,最好是干净的,刚装完系统的,可以是NAT型云服务器,但是你得做好NAT设置。
  • 如果有云服务器提供商开了默认的防火墙或者安全组,请把所有端口全部开放,我们在服务器内部做防火墙。
  • 本地客户端能正常上网,本教程以正常家用宽带为例,有些校园网可能也能通,但要视情况而定。

云服务器的推荐配置:

  • 系统:Ubuntu 22.0 版本以上/Debian 12.0 版本以上
  • CPU:1核
  • 内存:1G

1:ZeroTier 介绍

ZeroTier 是一款强大的 内网穿透 工具,它能让你在互联网上搭建属于自己的虚拟局域网。通过它,你可以轻松实现远程访问家中设备的需求 - 比如在公司用手机直接访问家里的 NAS。最重要的是,设备之间是点对点直连的,无需经过中转服务器,既保证了速度,又提升了安全性。

它的工作原理是这样的:通过 ZeroTier One 客户端,在不同设备(如笔记本、手机、服务器等)之间建立 内网 连接,即使这些设备都在 NAT 后面也没问题。它使用了 STUN 等技术,可以穿透大多数类型的 NAT,实现设备间的直接通信。如果实在无法直连,才会通过中转服务器进行通信。

简单来说,ZeroTier 就像是一个跨越互联网的"虚拟交换机",让分布在世界各地的设备,都能像在同一个局域网内一样方便地相互访问。

image

ZeroTier 网络中的关键概念

PLANET(行星服务器):ZeroTier 网络的核心根服务器,负责网络发现和初始连接。相当于整个网络的"中枢"。

MOON(卫星服务器):用户可以自建的私有根服务器。它可以作为区域性的代理节点,帮助就近的设备更快地建立连接,提升网络性能。

LEAF(叶子节点):所有接入 ZeroTier 网络的终端设备,如电脑、手机、服务器等。这些设备通过 PLANET 和 MOON 的协调来相互发现和通信。

本教程将指导您搭建一个私有的 PLANET 服务器,让您完全掌控自己的 ZeroTier 网络。


2:服务器端配置

2.1:准备条件

2.1.1:切换国内软件源

首先SSH连接到云服务器,记住要使用root用户。连上去以后不要切换目录。

Ubantu/Debian的默认软件源很多是国外的,下载可能会中断或者速度很慢,所以切换软件源为国内清华源(如果你的VPS是海外线路,那么这块不执行也可以):

cat > /etc/apt/sources.list << EOF
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
EOF

修改软件源配置文件以后,我们更新一下软件包索引,否则白改了:

apt update

2.1.2:安装curl

安装curl工具,用来下载特定软件。

apt install curl -y

2.1.3:安装1Panel和Docker

安装Docker和1Panel面板,用这个就图个配置方便,用命令也是能同样实现的。
这是docker的安装命令,默认选第一个一直回车就行。

curl -sSL https://linuxmirrors.cn/docker.sh -o docker.sh && bash docker.sh

这是1Panel面板的安装命令,用这个就图个配置方便,用命令也是能同样实现的。可以全部采用默认配置,也可以自己修改一下,安装完成后会输出访问地址和用户名密码,记得保存下来。

curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && bash quick_start.sh

配置docker加速镜像,更修改软件源一样,用来加速下载docker镜像。

tee /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": [
        "https://docker.mirrors.aster.edu.pl",
        "https://docker.mirrors.imoyuapp.win"
    ]
}
EOF

应用docker配置。

systemctl daemon-reload

重启docker,使配置生效。

systemctl restart docker

2.1.4:安装git

安装git,后面下载docker-zerotier-planet存储库要用到。

apt install git -y

2.1.5:安装ufw防火墙(用于配置端口转发)

执行命令安装ufw防火墙,用来端口转发,下面的命令一行一行执行,井号后面的可别执行嗷,那是注释!

apt install ufw -y

2.2:下载项目源码

下载docker-zerotier-planet存储库,该项目用于自建Zerotier Planet。

git clone https://ghproxy.imoyuapp.win/https://github.com/xubiaolin/docker-zerotier-planet.git

2.3:执行安装脚本

执行docker-zerotier-planet的安装脚本,按照默认指示就行,安装完成后会打印访问信息,记录下来。

./docker-zerotier-planet/deploy.sh

2.4:配置网络

浏览器访问<云服务器ip>:3443,输入默认的用户名和密码(admin/password),进去后先改一下密码,默认的不安全。

2.4.1:新建网络

进入以后,先点击Add network按钮,然后输入Network name,这个随便输,最后点击Create Network按钮。
image


2.4.2:分配网络IP

点击Easy setup按钮。
image

Network address in CIDR notation 输入11.11.11.0/24,下面两个输入框的内容应该会自动生成,然后点击Submit按钮,看到xxx Successful的字样,点击上方Networks按钮,这个页面先放着,不要关掉。
image


2.5:配置ufw防火墙

2.5.1:通过命令开放ssh以及1Panel端口
# 开放ssh端口,如果你用NAT型云服务器,那你得把22改成自己连接ssh的端口号
ufw allow 22/tcp

# 开放1Panel访问端口,这个每个人不一样,如果你忘了那么你得去看一下刚刚安装完1Panel以后打印的内容。把下main命令里的尖括号内容改成1Panel访问端口。
ufw allow <1Panel端口>/tcp

# 启用ufw防火墙
ufw --force enable

2.5.2:通过1Panel开放所有端口(可仅开放Zerotier需要的端口)

打开1Panel页面,开放防火墙所有端口,也可以只开发特定的,按自己的需求来,我这个只是演示用。
image
image


2.6:配置Zerotier

2.6.1:安装Zerotier

在服务器中安装zerotier,用来与客户端取得联系,以便后续把请求转发到客户端。

curl -s https://install.zerotier.com | bash

2.6.2:替换planet文件

转移自建的planet文件至zerotier-one目录。

cp /root/docker-zerotier-planet/data/zerotier/dist/planet /var/lib/zerotier-one/

重启zerotier-one服务,使配置生效。

service zerotier-one restart

2.6.3:加入网络

Zerotier加入服务器的Network ID,这个Network ID可以在刚刚保留的页面获取到,看下图红框的位置,每个人的Network ID不一样,别把我图里的给放上去了。
image

执行命令,把<Network ID>替换成自己的。

zerotier-cli join <Network ID>

看到200 join OK字样,我们再次返回之前保留的zerotier页面,等个十几秒刷新一下。


2.6.4:授权并分配服务器IP

看到列表中多一行,Member name输入本机,然后点击IP assignment
image

输入11.11.11.99,点左边的➕,然后点右上角的Back按钮。
image

勾选AuthorizedActive bridge两个复选框,然后点击左下角Refresh按钮。
image


至此,服务器端配置完成。

3:客户端配置

3.1:Windows 配置

3.1.1:安装zerotier-one

下载zerotier-one并安装,下载地址:https://download.zerotier.com/dist/ZeroTier%20One.msi


3.1.2:替换planet文件

planet 文件覆盖粘贴到C:\ProgramData\ZeroTier\One中。

  • 这个目录是个隐藏目录,需要设置允许查看隐藏目录,不会的话百度下。
  • planet文件在云服务器的/root/docker-zerotier-planet/data/zerotier/dist/planet

3.1.3:使新的planet生效

按Win+S键,输入service,打开服务。
image

找到ZeroTier One,并且重启服务。
image


3.1.4:加入网络

使用管理员身份打开PowerShell。
执行如下命令,看到join OK字样就成功了。

PS C:\Windows\system32> zerotier-cli.bat join <Network ID>(刚服务器端那边用的Network ID)
200 join OK
PS C:\Windows\system32

3.1.5:授权并分配客户端IP

去zerotier管理端网页做刚刚服务器端一样的设置,只不过IP换成11.11.11.11,记得勾选AuthorizedActive bridge两个复选框并刷新页面。
image


3.1.6:验证网络连通性

等个十几秒之后,试着在客户端的cmd里ping一下11.11.11.99,能ping通就可以了。


3.2:Linux 配置

3.2.1:安装zerotier-one

下载zerotier-one并安装

curl -s https://install.zerotier.com | sudo bash

3.2.2:替换planet文件

planet 文件上传到linux客户端。

planet 文件所在目录执行以下命令,覆盖客户端安装的zerotier-one自带的planet。

cp planet /var/lib/zerotier-one/

3.2.3:使新的planet生效

重启zerotier-one服务。

service zerotier-one restart

3.2.4:加入网络

执行如下命令,看到200 join OK字样就成功了。

zerotier-cli join join <Network ID>(刚服务器端那边用的Network ID)

3.2.5:授权并分配客户端IP

去zerotier管理端网页做刚刚服务器端一样的设置,只不过IP换成11.11.11.11,记得勾选AuthorizedActive bridge两个复选框并刷新页面。
image


3.2.6:验证网络连通性

等个十几秒之后,试着在客户端ping一下11.11.11.99,能ping通就可以了。


3.3:安卓 配置

Zerotier 非官方安卓客户端


3.4:MacOS 配置

3.4.1:安装zerotier-one

下载地址:https://download.zerotier.com/dist/ZeroTier%20One.pkg


3.4.2:替换planet文件

进入 /Library/Application\ Support/ZeroTier/One/ 目录,并替换目录下的 planet 文件


3.4.3:使新的planet生效

重启 ZeroTier-One

cat /Library/Application\ Support/ZeroTier/One/zerotier-one.pid | sudo xargs kill

3.4.4:加入网络
zerotier-cli join 网络 id

3.4.5:授权并分配客户端IP

去zerotier管理端网页做刚刚服务器端一样的设置,只不过IP换成11.11.11.11,记得勾选AuthorizedActive bridge两个复选框并刷新页面。
image


3.4.6:验证网络连通性

等个十几秒之后,试着在客户端的cmd里ping一下11.11.11.99,能ping通就可以了。


3.5:OpenWRT 配置

3.5.1:安装zerotier-one

这个在openwrt商店里可以下载到。


3.5.2:替换planet文件

进入 /etc/config/zero/planet 目录,并替换目录下的 planet 文件。


3.5.3:使新的planet生效

在openwrt网页后台先关闭zerotier服务,再开启zerotier服务。


3.5.4:加入网络

在openwrt网页后台输入服务器端生成的网络ID,然后加入。


3.5.5:授权并分配客户端IP

去zerotier管理端网页做刚刚服务器端一样的设置,只不过IP换成11.11.11.11,记得勾选AuthorizedActive bridge两个复选框并刷新页面。
image


3.5.6:验证网络连通性

等个十几秒之后,试着在客户端的cmd里ping一下11.11.11.99,能ping通就可以了。


3.6:iOS 配置

方案一: 越狱后安装ZeroTie,然后替换planet文件

方案二: 使用Wireguard接入到ZeroTier网络


4:端口转发配置

打开服务器端1Panel,切换到系统——防火墙——端口转发页面。
image

协议选tcp/udp,源端口就是服务器这边对应的端口,目标IP填zerotier为客户端分配的IP,目标端口填写客户端的被转发的端口,最后点击确认。
image

最后用云服务器IP:源端口访问一下,此时应该可以访问了。

最后修改:2025 年 06 月 24 日
如果觉得我的文章对你有用,请随意赞赏