写在前面:

你在内网部署了一个服务(如 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

欢迎交流!!🌹🌹


参考内容:

Frp内网穿透搭建教学 - Micky233 - 博客园

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐