内网服务对外访问:frp 内网穿透完整教程
本文详细讲解 frp 内网穿透方案,通过在公网服务器部署 frps 服务端、内网机器部署 frpc 客户端建立隧道,开放通信与业务端口,解决内网私有 IP 服务无法被外部访问的问题。
写在前面:
你在内网部署了一个服务(如 Dify),想给外部用户调用:
内网服务地址:http://你的内网IP:8080/v1
你想把这个地址发给外部用户,但对方无法访问。
本文介绍以上场景的解决方案。
一、问题说明
1、问题原因
| 原因 | 说明 |
|---|---|
| 私有 IP 地址 | 172.27.x.x (你的IP)属于私有内网,仅局域网内部互通,公网外部网络无法直接寻址连接 |
| NAT 网络隔离 | 内网设备通过 NAT 网络地址转换访问外网,路由单向通行,外网无法主动逆向访问内网主机 |
| 防火墙阻隔 | 即便拥有公网 IP,服务器系统防火墙、云平台安全组若未放行对应端口,仍会阻断外部访问请求 |
2、IP地址分类
| 类型 | 范围 | 说明 |
|---|---|---|
| A 类私有 IP | 10.0.0.0 ~ 10.255.255.255 | 适用于大型企业、园区内网 |
| B 类私有 IP | 172.16.0.0 ~ 172.31.255.255 | 适用于中型内网,172.27.x.x 归属此类 |
| C 类私有 IP | 192.168.0.0 ~ 192.168.255.255 | 家庭、小型路由最常用内网网段 |
| 公网 IP | 除上述私有网段外的其余 IP | 全球唯一路由可达,外网可直接访问 |
3、解决方案对比
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 端口映射 / NAT | 拥有路由器管理权限、具备公网 IP | 配置简单、零额外成本、速度稳定 | 必须运营商分配公网 IP,部分宽带无法获取 |
| 云服务器部署 | 项目正式上线、生产环境使用 | 稳定性强、带宽可控、运维方便 | 需要迁移本地服务到云端,有服务器费用成本 |
| frp 内网穿透 | 开发调试、临时对外提供服务 | 部署灵活、无需改动本地服务架构 | 需要自备一台带公网 IP 的服务器做中转 |
| ngrok | 本地快速临时测试、演示 | 开箱即用,无需自备公网服务器 | 免费版带宽有限、链接随机、稳定性一般 |
| Cloudflare Tunnel | 已有域名、长期稳定穿透 | 完全免费、高稳定性、自带 CDN | 需要域名配合配置,新手有一定配置门槛 |
4、本教程方案:frp 内网穿透
原理图:

工作流程:
-
frps(服务端)在公网服务器监听 7000 端口
-
frpc(客户端)在内网机器连接 frps,建立隧道
-
外部请求 → 公网服务器 8080 端口 → frp 隧道 → 内网服务 8080 端口
5、环境准备
本教程环境如下图所示:
| 资源 | 要求 | 示例 |
|---|---|---|
| 公网服务器 | 拥有公网 IP 地址,可被外网直接访问 | Ubuntu 22.04 |
| 内网机器 | 本地运行需要对外暴露的业务服务 | Windows 内网主机,服务地址:172.27.XX.XX:8080 |
端口规划:(业务端口根据实际需求修改,本文为8080)
| 端口 | 用途 | 开放位置 |
|---|---|---|
| 7000 | frp 服务端与客户端通信端口,用于建立隧道 | 公网服务器防火墙 / 安全组 |
| 8080 | 业务端口(Dify API),供外部用户访问 | 公网服务器防火墙 / 安全组 |
二、公网服务器操作步骤
注意:本教程以 Ubuntu 22.04为例,其他 Linux 发行版类似。
1、安装并启动frps
(1)下载frp
cd /opt/software
sudo wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz
如下图所示为下载进度,使用sudo能够防止权限不足。

tar -xzf frp_0.52.3_linux_amd64.tar.gz
cd frp_0.52.3_linux_amd64
![]()
(2)创建配置
修改目录所有权:
sudo chown -R $USER:$USER /opt/software/frp_0.52.3_linux_amd64
然后创建文件:
cat > frps.toml << 'EOF'
bindPort = 7000
EOF

(3)启动frps
输入以下指令启动frps(后台运行):
nohup ./frps -c frps.toml > frps.log 2>&1 &
查看是否启动成功:
ps aux | grep frps
tail -f frps.log
成功日志显示:[I] [service.go:XXX] frps tcp listen on 0.0.0.0:7000

2、开放防火墙端口
检查ufw状态:
sudo ufw status
![]()
当前不活动 → 端口默认开放,frp 可以直接用。
开放端口:
公网服务器需开放 7000(frp通信端口)和 8080(业务端口)
sudo ufw allow 7000/tcp
sudo ufw allow 8080/tcp
3、获取公网IP
curl ifconfig.me
记下这个 IP,例如:“123.45.67.89”。
注意:若没有返回,则证明该服务器没有公网IP,frp内网穿透的方法不适用。
三、内网Windows机器操作
1、下载frpc
下载地址:https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_windows_amd64.zip
解压到某个目录,例如:E:\frp

文件说明:
| 文件 | 说明 |
|---|---|
| frps | 服务端程序,仅在公网服务器上运行,负责接收外网请求并转发 |
| frps.toml | 服务端配置文件,用于设置通信端口、认证信息等参数 |
| frpc | 客户端程序,仅在内网机器上运行,负责连接公网服务器并打通隧道 |
| frpc.toml | 客户端配置文件,指定公网服务器地址、端口及本地服务转发规则 |
2、创建配置文件frpc.toml
注意:是frpc不是frps!!!
serverAddr = "服务器公网IP"
serverPort = 7000
[[proxies]]
name = "dify-api"
type = "tcp"
localIP = "Windows系统的IP"
localPort = 8080
remotePort = 8080
3、启动frpc
进入frp目录,在命令行中启动:
frpc.exe -c frpc.toml

4、验证测试
(1)公网服务器本地测试
curl http://localhost:8080/v1
(2)外部访问测试
任何外部及其都可以测试:
curl http://公网服务器IP:8080/v1
或在浏览器输入访问:http://公网服务器IP:8080/v1
欢迎交流!!🌹🌹
参考内容:
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)