前言
随着科技发展日新月异,我们越来越需要软件,越来越依赖互联网。但是全球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
以上工具各有优缺点,本人目前已经写了 Zerotier 和 Frp 的配置教程,后续会把其他的内网穿透工具教程一个个全部补充上去。
内网穿透
通过 “中转” 机制打破了内网与公网的隔离,在开发、运维、物联网等场景中具有广泛应用。选择工具时需根据需求(如带宽、协议、安全性)权衡开源与商业方案,同时重视网络安全,避免因穿透导致内网暴露风险。
本人写这篇文章的目的就是力求零运维基础的小白看了也能直接配好,每行要执行的代码前面会标注执行原因。
首先我们得有一台拥有公网IP的云服务器,推荐雨云。
雨云优惠注册地址:https://www.rainyun.com/
优惠码:xiaotie
使用优惠码注册后绑定微信可获得5折券。
其他云服务器推荐:
配置前提:
- 一台拥有公网IP的云服务器,最好是干净的,刚装完系统的,可以是NAT型云服务器,但是你得做好NAT设置。
- 如果有云服务器提供商开了默认的防火墙或者安全组,请把所有端口全部开放,我们在服务器内部做防火墙。
- 本地客户端能正常上网,本教程以正常家用宽带为例,有些校园网可能也能通,但要视情况而定。
云服务器的推荐配置:
- 系统:Ubuntu 22.0 版本以上/Debian 12.0 版本以上
- CPU:1核
- 内存:1G
本文以 Ubuntu 22.04 LTS 为例。
1:NPS 介绍
NPS
是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp
、udp
流量转发,可支持任何tcp
、udp
上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端。
为什么选择NPS?
- 协议支持全面,兼容几乎所有常用协议,例如tcp、udp、http(s)、socks5、p2p、http代理。
- 全平台兼容(linux、windows、macos、群辉等),支持一键安装为系统服务。
- 控制全面,同时支持服务端和客户端控制。
- https集成,支持将后端代理和web服务转成https,同时支持多证书。
- 操作简单,只需简单的配置即可在web ui上完成其余操作。
- 展示信息全面,流量、系统信息、即时带宽、客户端版本等。
- 扩展功能强大,该有的都有了(缓存、压缩、加密、流量限制、带宽限制、端口复用等等)。
- 域名解析具备自定义header、404页面配置、host修改、站点保护、URL路由、泛解析等功能。
- 服务端支持多用户和用户注册功能。
2:服务器端配置
2.1:准备阶段
2.1.1:切换国内软件源
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:安装 Docker
我们使用 Docker
将 NPS
服务隔离出来,更安全也更简洁。
这是docker的安装命令,默认选第一个一直回车就行。
curl -sSL https://linuxmirrors.cn/docker.sh -o docker.sh && bash docker.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.2:创建 NPS 容器
2.2.1:创建挂载目录
首先在当前目录创建nps文件夹并切换到nps目录。
mkdir nps && cd nps
创建conf文件夹并切换到conf目录。
mkdir conf && cd conf
下载conf文件。
wget https://cdn.jsdelivr.net/gh/xiaotiewinner/static-resources@main/files/2025/06/nps-conf.tar.gz
解压conf文件。
tar -zxvf nps-conf.tar.gz
此时您可以修改 nps.conf
中的某些配置以保证安全性,但是本教程中我们使用默认的用户名密码以及端口。
点击这里查看每个配置项的作用。
然后我们返回到 nps
目录。
cd ..
2.2.2:编辑 docker-compose.yml 文件(我习惯用 vim ,你也可以用 nano)
vim docker-compose.yml
将以下内容修改后粘贴到文本中(可使用快捷键:SHIFT
+ INSERT
),需要修改的部分加了注释( # 之后的内容),注释放进去不影响 docker
容器的编译和运行。
services:
nps:
restart: always
container_name: nps
network_mode: host
volumes:
- ./conf:/conf
- /etc/localtime:/etc/localtime:ro
image: yisier1/nps
保存文件:手动打出:wq
,然后按回车键。
2.2.3:编译并运行 Docker 容器
docker compose up -d
2.3:配置阶段
2.3.1:访问 NPS 管理后台
- 打开浏览器,地址栏输入 云服务器的公网IP:8081(如果您修改过
nps.conf
中的web_port
,这里的端口号也需要对应修改)。
如果访问不到,你需要检查云服务器的外部和内部防火墙是否打开了 8081 端口。 - 用户名输入
admin
,密码输入123
,点击登录
按钮(如果您修改过nps.conf
中的web_username
和web_password
,这里的用户名密码也需要对应修改)。
2.3.2:配置服务端
- 点击左侧菜单中
服务端
,然后点击第一条信息中最右侧的隧道
按钮。
- 点击
新增
按钮,进入隧道新增页面。
服务端端口
输入33000
,目标
输入127.0.0.1:3000
,点击新增
按钮。
注:- 我的本地客户端电脑在3000端口发布了一个服务,所以这样写。你的本地有什么端口需要发布到公网就写什么端口,例如如果希望发布windows远程桌面服务,就写
127.0.0.1:3389
,如果想发布linux的ssh服务,就写127.0.0.1:22
。 127.0.0.1
表示客户端本机,如果你想发布局域网下的其他设备的服务,那么就把127.0.0.1
改为对应设备的局域网IP。服务端端口
,顾名思义,就是公网IP后面跟着的端口,这样就形成了IP+端口的映射,以教程中的设定为例,对公网IP + 33000端口访问最终会被转发到本地的3000端口。
- 我的本地客户端电脑在3000端口发布了一个服务,所以这样写。你的本地有什么端口需要发布到公网就写什么端口,例如如果希望发布windows远程桌面服务,就写
- 最后返回客户端页面,点
+
,将快捷启动命令复制下来。
3:客户端端配置
3.1:配置客户端(本地)
3.1.1:配置客户端(Windows)
- 下载
npc
文件,点这里下载。 - 解压出来,右键——管理员模式运行。
- 把 刚刚 最后复制的内容粘贴上去,然后回车(如果希望以后开机自启,先输入1,然后粘贴快捷启动命令)。
- 看到命令行中有 Successful 字样并且管理页面客户端页面刷新以后
连接
一栏显示 在线 说明网络通了,试着访问公网IP+服务端端口试试看吧。
3.1.2:配置客户端(Linux)
下载
npc
文件,如果不知道自己的系统要下载哪种,就下载amd
版本。amd:
wget https://cdn.jsdelivr.net/gh/xiaotiewinner/static-resources@main/files/2025/06/npc-linux-amd.tar.gz
amd:
wget https://cdn.jsdelivr.net/gh/xiaotiewinner/static-resources@main/files/2025/06/npc-linux-arm.tar.gz
解压
npc
。tar -zxvf npc-linux-amd.tar.gz
赋予执行权限。
sudo chmod +x npc
执行
npc
。sudo ./npc
- 把 刚刚 最后复制的内容粘贴上去,然后回车(如果希望以后开机自启,先输入1,然后粘贴快捷启动命令)。
- 看到命令行中有 Successful 字样并且管理页面客户端页面刷新以后
连接
一栏显示 在线 说明网络通了,试着访问公网IP+服务端端口试试看吧。