前言
随着科技发展日新月异,我们越来越需要软件,越来越依赖互联网。但是全球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 的配置教程,后续会把其他的内网穿透工具教程一个个全部补充上去。
内网穿透
通过 “中转” 机制打破了内网与公网的隔离,在开发、运维、物联网等场景中具有广泛应用。选择工具时需根据需求(如带宽、协议、安全性)权衡开源与商业方案,同时重视网络安全,避免因穿透导致内网暴露风险。
本文使用 FRP
,下面有对该软件的介绍,这个软件原生是需要配置conf文件的,比较麻烦,本文面向小白,所以采用 Frp-Panel
的方式。
力求零运维基础的小白看了也能直接配好,每行要执行的代码前面会标注执行原因。但是你如果连怎么连接云服务器都不清楚的话,你需要先搜一下怎么SSH连接云服务器。
首先我们得有一台拥有公网IP的云服务器,推荐雨云。
雨云优惠注册地址:https://www.rainyun.com/
优惠码:xiaotie
使用优惠码注册后绑定微信可获得5折券。
其他云服务器推荐:
配置前提:
- 一台拥有公网IP的云服务器,最好是干净的,刚装完系统的,可以是NAT型云服务器,但是你得做好NAT设置。
- 如果有云服务器提供商开了默认的防火墙或者安全组,请把所有端口全部开放,我们在服务器内部做防火墙。
- 本地客户端能正常上网,本教程以正常家用宽带为例,有些校园网可能也能通,但要视情况而定。
云服务器的推荐配置:
- 系统:Ubuntu 22.0 版本以上/Debian 12.0 版本以上
- CPU:1核
- 内存:1G
本文以 Ubuntu 22.04 LTS 为例。
1:FRP 介绍
Frp
是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。
为什么选择 Frp?
通过在具有公网 IP 的节点上部署 Frp
服务端,您可以轻松地将内网服务穿透到公网,并享受以下专业特性:
- 多种协议支持:客户端服务端通信支持 TCP、QUIC、KCP 和 Websocket 等多种协议。
- TCP 连接流式复用:在单个连接上承载多个请求,减少连接建立时间,降低请求延迟。
- 代理组间的负载均衡。
- 端口复用:多个服务可以通过同一个服务端端口暴露。
- P2P 通信:流量不必经过服务器中转,充分利用带宽资源。
- 客户端插件:提供多个原生支持的客户端插件,如静态文件查看、HTTPS/HTTP 协议转换、HTTP、SOCKS5代理等,以便满足各种需求。
- 服务端插件系统:高度可扩展的服务端插件系统,便于根据自身需求进行功能扩展。
- 用户友好的 UI 页面:提供服务端和客户端的用户界面,使配置和监控变得更加方便。
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 将 Frp 服务隔离出来,更安全也更简洁。
这是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:创建 Frp-Panel 容器
2.2.1:创建 frp 文件夹并切换到 frp 目录
mkdir frp && cd frp
2.2.2:编辑 docker-compose.yml 文件(我习惯用 vim ,你也可以用 nano)
vim docker-compose.yml
将以下内容修改后粘贴到文本中(可使用快捷键:SHIFT
+ INSERT
),需要修改的部分加了注释( # 之后的内容),注释放进去不影响 docker 容器的编译和运行。
services:
frpp-master:
image: vaalacat/frp-panel:latest
network_mode: host
environment:
APP_GLOBAL_SECRET: your_secret
MASTER_RPC_HOST: 1.2.3.4 # 修改为服务器的外部IP或域名
MASTER_RPC_PORT: 9001
MASTER_API_HOST: 1.2.3.4 # 修改为服务器的外部IP或域名
MASTER_API_PORT: 9000
MASTER_API_SCHEME: http
volumes:
- ./data:/data
restart: unless-stopped
command: master
保存文件:手动打出:wq
,然后按回车键。
2.2.3:编译并运行 Docker 容器
docker compose up -d
2.3:配置阶段
2.3.1:访问 Frp-Panel 管理后台
- 打开浏览器,地址栏输入 云服务器的公网IP:9000。
如果访问不到,你需要检查云服务器的外部和内部防火墙是否打开了指定端口(9000 和 9001)。 - 点击注册按钮,用户名、邮箱和密码随便填写,但是自己要记住。
- 输入刚刚注册的用户名和密码,点击登录按钮。
2.3.2:配置服务端
- 点击左侧菜单中
服务端
,然后点击第一条信息中最右侧的···
,最后点击修改配置
。
- 下图中所有红框标记的是必须要填的,你可以填写和我一样的,也可以自己修改。红框中打码的内容是云服务器的公网IP地址。
最后点击提交按钮。 - 刷新下页面,再次点击左侧
服务端
菜单,看到配置状态
变为 已配置 即可。
3:客户端端配置
3.1:创建客户端(云服务器)
3.1.1:访问 Frp-Panel
网页端。
如果你忘了怎么访问和登录,请点击这里。
3.1.2:配置客户端(云服务器)
- 点击左侧菜单
客户端
,单击新建
按钮,输入1
,单击创建
按钮。
点击刚刚创建的客户端信息最右侧的
···
,然后单击修改配置
。
...我的废话有点多了,后面简单说。
按下图红框部分从上到下去配置和点击。
注意:
- 隧道类型:如果转发网站服务,建议选择TCP。如果是游戏服务,建议选择UDP。其他类型如果你不懂的可以百度查一下。
- 本地端口:即客户端的被转发端口。
- 本地IP:填写
127.0.0.1
表示客户端本机中的服务,也可以填写局域网IP(例如192.168.1.2
),这样就会转发到局域网内其他客户端的服务。 - 远程端口:即服务器端的接收端口。
回到主页,点击左侧菜单
客户端
,然后进行以下操作。- 点击
xxxxxx.c.1
。 - 勾选
使用 GitHub 代理
。 - 在
GitHub 代理 URL
右侧输入https://ghfast.top/
。 - 复制
Windows
或者Linux
右侧文本框中的内容。(根据你的本地客户端的系统决定)
- 点击
3.2:配置客户端(本地)
3.2.1:配置客户端(Windows)
- 管理员模式打开
PowerShell
。 - 把 刚刚 最后复制的内容粘贴上去,然后回车。
- 等待执行结束,刷新管理页面,看到
客户端
第一条信息的配置状态
变为 已配置 即可。
3.2.2:配置客户端(Linux)
- 使用
root
用户登录SSH。 - 把 刚刚 最后复制的内容粘贴上去,然后回车。
- 等待执行结束,刷新管理页面,看到
客户端
第一条信息的配置状态
变为 已配置 即可。