📌 FRP – Linux & Win 内网穿透教程
📖 目录
- 🌍 什么是 FRP?
- ⚡ 安装与配置
- 🎯 服务器端配置
- 🏠 客户端配置
- 📝 测试与验证
- 📌 结语
🌍 什么是 FRP?
FRP(Fast Reverse Proxy)是一款可以用于内网穿透的开源工具,支持 TCP/UDP/HTTP/HTTPS 协议,可以将内网服务暴露到公网,实现从任意网络环境访问到你的服务器或电脑。
内网穿透用于解决局域网设备对外提供服务的问题。当我们在局域网中部署了web服务或其他服务,但只有局域网IP而没有公网IP时,外部设备无法直接访问这些服务。通过内网穿透技术,可以让公网上的用户访问到局域网内的服务。
🔗 Frp官网:https://github.com/fatedier/frp
⚡ 安装与配置
❗ 前置要求
- 一台有公网IP的服务器
- 你需要实现内网穿透的服务器或电脑
🔹 1. 下载 FRP
前往 GitHub FRP Releases 下载适合你系统的版本:
💡 提示:
- 文件格式是 frp_0.61.1_xxx(适用系统)_yyy(系统架构).tar.gz
- Windows系统下载 frp_0.61.1_windows_amd64.zip
- Linux系统amd架构下载 frp_0.61.1_linux_amd64.tar.gz
- Linux系统arm架构下载 frp_0.61.1_linux_arm64.tar.gz
Linux查看系统架构的指令:
uname -m
输出示例:
- x86_64: 表示 64 位 x86 架构(也称为 AMD64)
- i686 或 i386: 表示 32 位 x86 架构
- aarch64: 表示 64 位 ARM 架构
- mips: 表示 MIPS 架构
Windows下载方式:
直接点击链接下载,下载完把zip解压出来
Linux下载方式:
# AMD架构下载
wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz
# ARM架构下载 树莓派 香橙派 用这个下载
wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_arm64.tar.gz
Linux解压文件:
# AMD架构是这个
tar -xvzf frp_0.61.1_linux_amd64.tar.gz
# ARM架构是这个
tar -xvzf frp_0.61.1_linux_arm64.tar.gz
> tar命令参数详解:
> – `-x`: 解压模式(extract)
> – `-v`: 显示详细过程(verbose)
> – `-z`: 使用gzip解压缩(gunzip)
> – `-f`: 指定文件名(file)
>
> 所以 `tar -xvzf` 的含义是:
> 1. `-x`: 告诉tar要解压文件
> 2. `-v`: 在解压过程中显示正在解压的文件名
> 3. `-z`: 因为这是.gz格式,需要用gzip解压
> 4. `-f`: 后面接要解压的文件名
>
> 💡 Tips: 这些参数的顺序可以调整,但是`-f`参数后面必须紧跟文件名
#### 进入文件夹
```bash
cd frp_0.61.1_linux_amd64 # AMD架构
# 或
cd frp_0.61.1_linux_arm64 # ARM架构
💡 提示:根据你的系统架构,只需执行相应的命令。
🎯 服务器端配置
服务器端通常称为 frps,即 FRP 服务端,指的是有公网IP的服务器。
🔹 1. 服务器端 frps.toml 配置
在解压后的文件夹中,我们需要配置 frps.toml 文件:
# Linux查看文件
ls
# 通常会看到: frpc frpc.toml frps frps.toml LICENSE
# 编辑配置文件
nano frps.toml # 或者使用vim: vim frps.toml
将以下配置复制到frps.toml中(删除原有内容):
# ==============================
# FRP 服务器端(frps.toml)配置
# ==============================
# 绑定监听地址(默认 `0.0.0.0` 代表监听所有 IP)
bindAddr = "0.0.0.0"
# 服务器监听端口(客户端需要通过该端口连接 FRP 服务器)
bindPort = 7000
# HTTP 端口(用于内网 HTTP 代理穿透)
vhostHTTPPort = 80
# HTTPS 端口(用于内网 HTTPS 代理穿透)
vhostHTTPSPort = 443
# 子域名支持
# 可以通过 `subDomainHost` 解析动态子域名
# 例如:如果 `subDomainHost` 配置为 "example.com"
# 那么客户端可以使用 `test.example.com` 访问内网服务
# 如果你没有域名或不使用此功能,请删除此行!
# 如果你要用IP直连例如:168.0.0.1:8848,就把这行删掉,不要配置!
subDomainHost = "xxxx.com" # 请替换为你的真实域名
# =============================================
# Web 控制台(Dashboard)配置
# =============================================
# 监控界面监听地址(`0.0.0.0` 代表所有 IP 可访问)
webServer.addr = "0.0.0.0"
# Web 管理面板端口(可在浏览器访问,默认 7500)
# 你可以通过 `http://你的公网IP:7500` 访问 FRP 管理面板
webServer.port = 7500
# Web 控制台管理账号(可自定义)
webServer.user = "admin"
# Web 控制台密码(请自行修改)
webServer.password = "xxxx"
# =============================================
# 身份验证(Authentication)配置
# =============================================
# 认证方式(防止未经授权的客户端连接)
# 目前 FRP 支持 `token` 和 `oidc` 方式,我们选用token
auth.method = "token"
# Token 认证(客户端需要匹配相同 token 才能连接)
# 通俗来说就是密码,写一个你能记住的,尽量长一点
# 示例: 123-abc-123abc
auth.token = "123-abc-123abc" # 请自行修改,不要用示例中的值
💡 提示:以上只是基本配置,查看完整配置参数可访问官方配置示例:frps_full_example.toml
🔹 2. 启动服务端frps
❗ 注意:启动指令必须在frp文件目录下执行!
Linux 启动指令
screen -S frps ./frps -c frps.toml
命令参数解析:
– `screen`: Linux下的终端复用工具,可以让程序在后台运行
– `-S frps`: 创建一个名为"frps"的新screen会话
– `./frps`: 运行当前目录下的frps程序
– `-c`: 指定配置文件参数
– `frps.toml`: 配置文件名称,使用TOML格式
这个命令的作用是:
1. 创建一个新的screen会话,命名为"frps"
2. 在这个会话中运行frps程序
3. 使用frps.toml作为配置文件
4. 让frps在后台持续运行,即使关闭终端也不会停止
Windows启动指令
在文件目录里,点击上方的路径栏输入cmd后按回车打开命令窗口,然后输入:
frps.exe -c frps.toml
启动后不要关闭窗口!否则程序会终止运行。
成功启动后会出现类似以下信息:
[frps/root.go:105] frps uses config file: frps.toml
[server/service.go:237] frps tcp listen on 0.0.0.0:7000
[server/service.go:305] http service listen on 0.0.0.0:80
[server/service.go:319] https service listen on 0.0.0.0:443
[frps/root.go:114] frps started successfully
[server/service.go:351] dashboard listen on 0.0.0.0:7500
💡 常见问题 & 注意事项
端口冲突问题
如果服务器80或443端口已被占用,可更换vhostHTTPPort和vhostHTTPSPort端口:
vhostHTTPPort = 8080
vhostHTTPSPort = 8443
HTTP和HTTPS端口的作用
- vhostHTTPPort(默认80端口):用于HTTP协议的内网穿透,当你使用"http"类型的代理时,所有HTTP请求会通过这个端口转发
- vhostHTTPSPort(默认443端口):用于HTTPS协议的内网穿透,当你使用"https"类型的代理时,所有HTTPS请求会通过这个端口转发
这两个端口只有在你需要转发HTTP/HTTPS服务时才需要配置:
使用HTTP/HTTPS穿透和子域名功能时:
- 需要保证这两个端口未被占用,或者修改为其他未被占用的端口
- 例如,当你配置了type = "http"和subdomain = "test"时,用户可以通过http://test.example.com访问你的内网服务
仅使用TCP端口转发时:
- 如果你只使用TCP协议(例如type = "tcp"),无需关心这两个端口
- 使用TCP协议时,用户通过服务器IP:远程端口访问,不经过HTTP/HTTPS端口
端口占用情况:
- 如果服务器上已有Web服务占用了80/443端口,可以修改为其他端口(例如8080/8443)
- 修改后,通过http://yourdomain.com:8080或使用URL重写访问
只有使用HTTP/HTTPS类型代理时才需要关注这两个端口,纯TCP转发模式不受这两个端口的影响。
不同协议的访问方式
根据不同的协议类型和配置,访问方式会有所不同:
TCP协议转发(例如SSH服务):
[[proxies]]
name = "ssh_service"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
访问方式:ssh -p 6000 username@server_ip
这种方式不使用vhostHTTPPort和vhostHTTPSPort,直接通过remotePort指定的端口访问
HTTP协议转发(默认80端口):
[[proxies]]
name = "web_service"
type = "http"
localIP = "127.0.0.1"
localPort = 80
subdomain = "test" # 假设域名为example.com
访问方式:http://test.example.com
HTTP协议转发(修改为8080端口):
# 服务端配置
vhostHTTPPort = 8080
# 客户端配置
[[proxies]]
name = "web_service"
type = "http"
localIP = "127.0.0.1"
localPort = 80
subdomain = "test" # 假设域名为example.com
访问方式:http://test.example.com:8080
同时使用域名和TCP端口转发:
如果你需要同时使用域名模式和TCP端口转发,这是两个独立的配置,访问方式也不同:
# 客户端配置
[[proxies]]
name = "web_http"
type = "http"
localIP = "127.0.0.1"
localPort = 80
subdomain = "test" # 通过test.example.com访问
[[proxies]]
name = "ssh_tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000 # 通过server_ip:6000访问
- Web服务访问:http://test.example.com:8080(如果vhostHTTPPort=8080)
- SSH服务访问:ssh -p 6000 username@server_ip
注意:域名后面的端口8080是HTTP服务的端口,而不是SSH端口。SSH服务使用专门的TCP转发,通过remotePort指定的端口访问。
关于域名+端口转发
很多用户对域名、端口和协议类型之间的关系存在疑惑,这里进行详细说明:
使用域名+端口访问HTTP服务
如果您在服务端修改了vhostHTTPPort (例如从80改为8080),那么通过域名访问时需要指定这个端口:
# 服务端配置
vhostHTTPPort = 8080
# 客户端配置
[[proxies]]
name = "web"
type = "http"
localIP = "127.0.0.1"
localPort = 80 # 本地网站端口
subdomain = "www" # 子域名
访问方式:http://www.yourdomain.com:8080
解释::8080是因为服务端的vhostHTTPPort设置为8080,不是本地端口。
使用域名直接转发TCP服务(不支持)
FRP不支持直接通过domain:port的方式访问TCP服务。例如,不能通过www.yourdomain.com:22来访问SSH服务。
原因:域名解析是基于HTTP/HTTPS协议工作的,而TCP服务需要通过IP+端口直接访问。
正确的做法是使用TCP类型的代理:
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22 # 本地SSH端口
remotePort = 6000 # 远程访问端口
访问方式:ssh -p 6000 username@server_ip
将域名+端口转发到本地不同端口
如果要将域名的不同端口转发到本地不同服务,需要为每个端口配置单独的TCP代理:
# 将server_ip:6000转发到本地22端口
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
# 将server_ip:8080转发到本地80端口
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 8080
# 将server_ip:1433转发到本地SQL Server
[[proxies]]
name = "sql"
type = "tcp"
localIP = "127.0.0.1"
localPort = 1433
remotePort = 1433
这种情况下,vhostHTTPPort和vhostHTTPSPort的设置不会影响TCP代理的访问。
使用HTTP类型代理转发不同的本地Web服务
如果您有多个本地Web服务,想要通过不同的子域名访问:
# 服务端配置
vhostHTTPPort = 8080
# 客户端配置 – 转发本地80端口
[[proxies]]
name = "main_web"
type = "http"
localIP = "127.0.0.1"
localPort = 80
subdomain = "www"
# 客户端配置 – 转发本地8081端口的其他Web应用
[[proxies]]
name = "blog_web"
type = "http"
localIP = "127.0.0.1"
localPort = 8081
subdomain = "blog"
访问方式:
- http://www.yourdomain.com:8080 → 本地80端口服务
- http://blog.yourdomain.com:8080 → 本地8081端口服务
注意:访问时端口8080是vhostHTTPPort的设置,与本地端口无关。
总结:使用域名+端口访问时,需要区分HTTP/HTTPS协议和TCP/UDP协议的不同配置方式。对于HTTP/HTTPS协议,域名后的端口是指vhostHTTPPort;对于TCP/UDP协议,不能使用域名直接访问,需要使用IP+remotePort访问。
访问Web监控面板
通过 http://你的服务器IP:7500 可以访问FRP管理面板,查看连接状态。
Linux退出程序窗口
- 按下Ctrl+A松开,再按一下D可以退出程序窗口(程序仍在后台运行)
- 使用screen -r frps可以回到程序窗口
- 使用pkill frps可以结束程序进程
使用systemd管理frps服务(推荐)
systemd是现代Linux系统中的主要初始化系统和服务管理器,使用systemd管理frps服务有以下重要优势:
相比直接使用screen或nohup运行frps,systemd提供了更加完善、标准和可靠的服务管理方式。
配置步骤:
创建systemd服务文件
sudo vim /etc/systemd/system/frps.service
写入以下内容:
[Unit]
Description=frps service
Documentation=https://github.com/fatedier/frp
After=network.target
Wants=network.target
[Service]
Type=simple
# 替换为你的实际路径
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.toml
Restart=on-failure
# 重启前等待的时间
RestartSec=5s
# 使用专门的用户运行(可选,增强安全性)
# User=frp
# Group=frp
# 设置合理的资源限制(可选)
# LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
重新加载systemd配置
sudo systemctl daemon-reload
此命令让systemd重新加载所有配置文件,识别新创建的服务文件。
启动frps服务
sudo systemctl start frps
此命令启动frps服务,systemd会执行ExecStart中指定的命令。
设置开机自启
sudo systemctl enable frps
此命令将frps服务设置为系统启动时自动启动。
查看服务状态
sudo systemctl status frps
输出示例:
● frps.service – frps service
Loaded: loaded (/etc/systemd/system/frps.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2025-03-25 15:32:45 CST; 3h 24min ago
Main PID: 1234 (frps)
Tasks: 12 (limit: 4915)
Memory: 22.4M
CGroup: /system.slice/frps.service
└─1234 /usr/local/frp/frps -c /usr/local/frp/frps.toml
常用的systemd管理命令:
# 启动服务
sudo systemctl start frps
# 停止服务
sudo systemctl stop frps
# 重启服务
sudo systemctl restart frps
# 重新加载配置(不中断服务)
sudo systemctl reload frps
# 查看详细日志
sudo journalctl -u frps
# 查看实时日志
sudo journalctl -u frps -f
# 检查服务是否开机启动
sudo systemctl is-enabled frps
# 禁用开机自启
sudo systemctl disable frps
为什么推荐使用systemd管理frps:
注意事项:
🏠 客户端配置
客户端用于连接服务器,一般是内网服务器或个人电脑(如树莓派、香橙派或NAS)。
🔹 1. 配置 frpc.toml
客户端也需要下载相同版本的frp压缩包并解压,然后配置frpc.toml文件:
# 服务端地址(填你有公网IP的服务器的IP或域名)
serverAddr = "192.xxx.x.x"
# 服务器端口(Frp服务端监听的端口)
serverPort = 7000
# 连接协议
transport.protocol = "tcp"
# 认证方式
auth.method = "token"
# 认证所使用的Token(要和服务端token完全一样!)
auth.token = "123-abc-123abc"
# 代理配置
[[proxies]]
# 代理名称(标识该代理的名称,根据你的喜好填写)
name = "rocketcat"
# 代理类型(http、https、tcp等)
# 如果你有域名,就用http
# 如果你没有域名,那就用IP直连,用tcp协议
# 如果你用tcp协议就必须把服务端上subDomainHost配置删除!
# type = "tcp" # IP+端口直连用这个
type = "http"
# 本地IP(Frp客户端需要将流量转发到的本地地址)
localIP = "127.0.0.1"
# 本地端口(Frp客户端需要将流量转发到的本地端口,根据你要穿透的端口来填写)
localPort = 8848
# 访问此代理的子域名
# 如果你没有域名要用IP直连,请把这句删除掉,否则会导致无法连接!
subdomain = "rocket" # 子域名请根据你拥有的域名配置,配置后通过rocket.xxx.com格式访问
# 如果你不用域名,要用ip+端口直连,请必须加上这句!
# 并且删除 subdomain = "rocket"
# remotePort = 8848 # 这个端口和localPort配置的一模一样,这样才能正常访问!
💡 提示:以上只是基本配置,查看完整配置参数可访问官方配置示例:frpc_full_example.toml
🔹 2. 启动客户端frpc
❗ 注意:启动指令必须在frp文件目录下执行!
Linux 启动指令:
screen -S frpc ./frpc -c frpc.toml
Windows启动指令:
在文件目录里,点击上方的路径栏输入cmd后按回车打开命令窗口,然后输入:
frpc.exe -c frpc.toml
启动后不要关闭窗口!否则程序会终止运行。
成功启动后会出现类似以下信息:
[I] [sub/root.go:142] start frpc service for config file [frpc.toml]
[I] [client/service.go:295] try to connect to server…
[I] [client/service.go:287] [7c9de41e30e15c46] login to server success, get run id [7c9de41e30e15c46]
[I] [proxy/proxy_manager.go:173] [7c9de41e30e15c46] proxy added: [rocketcat]
[I] [client/control.go:168] [7c9de41e30e15c46] [rocketcat] start proxy success
💡 常见问题 & 注意事项
文件配置错误
一定要注意客户端配置的是frpc.toml文件,不要配置错了。
IP+端口访问模式配置
- 配置的时候必须删除服务端的subDomainHost
- 配置type为TCP模式type = "tcp"
- 配置remotePort监听你的端口remotePort = 8848
localIP设置说明
localIP 参数可以设置为任何您内网中可以访问到的IP地址,不一定要是127.0.0.1:
- 127.0.0.1:当您要转发的服务运行在与frpc相同的机器上时使用
- 局域网IP地址(如192.168.1.x):当您想转发局域网中其他设备上的服务时使用
- 具体设备IP:如果您有多网卡或复杂网络环境,可以指向特定网卡IP
例如,如果您在设备A上运行frpc,但想转发设备B (192.168.1.100)上的Web服务:
[[proxies]]
name = "remote_web"
type = "tcp"
localIP = "192.168.1.100" # 设备B的IP
localPort = 80
remotePort = 8080
确保从运行frpc的设备可以访问到localIP:localPort上的服务,否则转发将无法工作。
Linux退出程序窗口
- 按下Ctrl+A松开,再按一下D可以退出程序窗口(程序仍在后台运行)
- 使用screen -r frpc可以回到程序窗口
- 使用pkill frpc可以结束程序进程
📝 测试与验证
🔹 1. 检查端口
在服务器端检查 FRPS 是否监听:
ss -tunlp | grep 7000
ss -tunlp | grep 7500
🔹 2. 访问 HTTP 服务
在浏览器访问你的网站:
- 使用域名:http://subdomain.your-domain.com
- 使用IP+端口:http://your-server-ip:port
📌 实用配置示例
IP直连+多端口转发配置示例
以下是使用IP直连模式(无需域名)并转发多个端口的配置示例。假设服务器公网IP为59.110.160.18。
服务器端配置 (frps.toml)
# ==============================
# FRP 服务器端配置 – IP直连示例
# ==============================
# 基础配置
bindAddr = "0.0.0.0"
bindPort = 7000
# 注意:使用IP直连时,不要配置subDomainHost
# Web控制台配置
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "strong_password" # 请修改为强密码
# 身份验证
auth.method = "token"
auth.token = "your_secure_token_123" # 请使用安全的token
# 日志设置
log.level = "info"
log.maxDays = 3
客户端配置 (frpc.toml)
# ==============================
# FRP 客户端配置 – IP直连+多端口示例
# ==============================
# 服务器连接信息
serverAddr = "59.110.160.18"
serverPort = 7000
# 认证方式
auth.method = "token"
auth.token = "your_secure_token_123" # 必须与服务端相同
# 连接协议
transport.protocol = "tcp"
# SSH服务转发示例 (通过59.110.160.18:2222访问内网SSH)
[[proxies]]
name = "ssh_service"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 2222 # 外网访问端口
# Web服务转发示例 (通过59.110.160.18:8080访问内网Web服务)
[[proxies]]
name = "web_service"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 8080 # 外网访问端口
# 远程桌面转发示例 (通过59.110.160.18:3389访问内网RDP)
[[proxies]]
name = "rdp_service"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = 3389 # 外网访问端口
# 数据库服务转发示例 (通过59.110.160.18:3306访问内网MySQL)
[[proxies]]
name = "mysql_service"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3306
remotePort = 13306 # 外网访问端口,修改为13306避免与服务器本身的MySQL冲突
使用方法
在服务器上运行frps:
./frps -c frps.toml
在内网设备上运行frpc:
./frpc -c frpc.toml
通过以下方式访问内网服务:
- SSH服务: ssh -p 2222 username@59.110.160.18
- Web服务: 浏览器访问 http://59.110.160.18:8080
- 远程桌面: 使用RDP客户端连接 59.110.160.18:3389
- MySQL数据库: 使用数据库客户端连接 59.110.160.18:13306
安全提示
常见问题解决
1. JSON解析错误问题
问题现象:
执行 ./frps -c frps.ini 命令时出现以下错误:
error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string into Go value of type v1.ServerConfig
原因分析:
这个错误通常是由于以下原因导致的:
解决方案:
使用TOML格式配置文件 根据官方文档,现在推荐使用TOML格式,按照本文档上述示例创建frps.toml配置文件
使用正确的配置文件版本
- 查看当前frp版本: ./frps -v
- 确保配置文件格式与当前版本兼容
端口作用总结
在FRP配置中,不同的端口有不同的用途:
bindPort | 7000 | 客户端和服务端通信的端口 | 必需 |
webServer.port | 7500 | 管理面板访问端口 | 可选 |
vhostHTTPPort | 80 | HTTP协议穿透端口 | 仅HTTP类型必需 |
vhostHTTPSPort | 443 | HTTPS协议穿透端口 | 仅HTTPS类型必需 |
remotePort | 自定义 | TCP/UDP协议穿透的公网访问端口 | 仅TCP/UDP类型必需 |
评论前必须登录!
注册