一、内网穿透是什么?
"内网穿透"是一种让外网设备可以访问内网服务的技术。
一句话解释:
内网穿透 = 让"家里/公司里的电脑"被"外面的网络"访问到。
举个例子:
你在家里的电脑上搭了一个网站(比如运行在 http://192.168.1.100:8080),但这个地址是内网IP,外面的人根本访问不到。
这时候你可以用内网穿透工具(如 frp、Ngrok、花生壳、ZeroTier 等),把内网端口"映射"到一个公网(云服务器)地址,比如:
https://abc123.ngrok.io → 你家里的电脑:8080
云服务器地址 ---> 你家里的电脑:8080
别人访问这个公网地址,就能看到你家里的网站了
技术原理(简化版):
- 内网客户端主动连接一个公网服务器(云服务端)。
- 公网服务器建立一个"隧道"。
- 外网用户访问公网服务器的某个端口 → 数据通过隧道 → 转发到你内网的服务。
二、怎么部署内网穿透 frp ?
云服务器和客户端都需要部署
1、云服务器部署(frps)
准备好docker-compose.yml文件
JAVA
// 可以从这里拉取
https://gitcode.com/weixin_47555380/fpr.git

docker-compose.yml:
JAVA
# 命令执行 docker-compose -f docker-compose.yml up -d
version: '3.9'
services:
frps:
image: fatedier/frps:v0.60.0
hostname: frps
container_name: frps
volumes:
- "./config/frps.toml:/frps.toml"
command:
- "-c"
- "/frps.toml"
network_mode: "host"
frps.toml:
JAVA
# https://github.com/fatedier/frp/blob/dev/conf/frps_full_example.toml
[common]
# 监听端口
# 与本行监听端口配置要一致
bind_port = 7000
# 面板端口
dashboard_port = 7500
# 登录面板的账号密码(修改成自己的)
dashboard_user = admin
dashboard_pwd = admin
# token =
启动docke docker-compose -f docker-compose.yml up -d
2、windows本机部署(frpc)
2.1、如果本机有安装docker,可以直接拉取,docker部署
JAVA
// frpc目录
https://gitcode.com/weixin_47555380/fpr.git
// 执行 docker-compose -f docker-compose.yml up -d 即可
2.2、如果本机没有安装docker,则下载压缩包
JAVA
https://gitcode.com/weixin_47555380/fpr.git

解压后修改frpc.toml文件
frpc.toml:
JAVA
serverAddr = "XXXXX" // 云服务器地址(公网ip)
serverPort = 7000 // 与frps配置bind_port 一致
[[proxies]]
name = "xxl-job" // 服务名称
type = "tcp"
localIP = "127.0.0.1"
localPort = 9999 // 需要访问的本机服务端口
remotePort = 9999
// 可以配置多个服务
[[proxies]]
name = "myApp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 8080
启动
JAVA
// exe文件 目录下 cmd执行
.\frpc.exe -c frpc.toml
注意1:云服务器防火墙需要放行以下端口
端口与角色对照
| 端口 | 方向 | 机器 | 作用 | 必须 |
|---|---|---|---|---|
| 7000 | 入站 | 云服务器 | frps 与 frpc 握手 | ✅ |
| 7500 | 入站 | 云服务器 | Web 面板(可选) | ➖ |
| 9999 | 入站 | 云服务器 | 转发到本机执行器 | ✅ |
| 8080 | 入站 | 云服务器 | 转发到本机执行器 | ✅ |
注意2:本机安装frpc时,可能会被windows杀毒系统拦截,注意放行
三、使用场景 :
当我们云服务器部署了xxl-job,本地想要使用xxl-job 定时功能时,因为XXL-JOB 调度中心在"触发时机"到达时,自己作为 HTTP 客户端去 POST 请求我们本机 执行器 接口时,是公网 ---> 内网,访问不通,执行器不会执行定时任务
当我们配置frp 内网穿透后,本机执行器 run方法能被访问,能够执行:
JAVA
调度中心(Leader) ──HTTP POST──▶ 公网IP:9999 ──frp隧道──▶ 本机9999/run
注意任务调度中心 --> 执行器管理界面需要手动录入 云服务器ip(公网ip):端口(9999)
xxl-job配置文件:
JAVA
xxl:
job:
# 验证信息 官网Bug https://github.com/xuxueli/xxl-job/issues/1951
accessToken: default_token
# 注册地址
admin:
addresses: http://云服务器ip:9090/xxl-job-admin
# 注册执行器
executor:
# 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 "IP:PORT" 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
address:
appname: job
# 执行器IP 配置为本机IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
ip:
# 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
port: 9999
# 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
logpath: ./data/applogs/xxl-job/jobhandler
# 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
logretentiondays: 30