- 1. 一、什么是 frp?
- 2. 二、frp 适合哪些场景?
- 3. 三、准备工作
- 4. 四、安装 frp
- 5. 五、配置 frps 服务端
- 6. 六、配置 frpc 客户端
- 7. 七、配置 SSH 内网穿透
- 8. 八、配置 frp 身份认证
- 9. 九、使用 systemd 后台运行 frps
- 10. 十、常见问题排查
- 10.1. 2. 公网端口无法访问
- 10.2. 3. 启动提示端口占用
在日常开发、远程办公或家庭服务器搭建过程中,我们经常会遇到这样一个问题:服务部署在内网环境中,外网无法直接访问。
比如:
- 家里的 NAS 想在外面访问
- 本地开发的 Web 项目想给同事演示
- 实验室内网机器需要远程 SSH
- 摄像头、面板、管理后台只在局域网可用
如果没有公网 IP,传统方式往往比较麻烦。而 frp 就是一个非常实用的内网穿透工具,可以帮助我们把内网服务暴露到公网,实现公网轻松访问。
一、什么是 frp?
frp 全称是 Fast Reverse Proxy,是一个高性能的反向代理应用,主要用于内网穿透。
它采用客户端和服务端的架构:
- frps:服务端,部署在拥有公网 IP 的服务器上
- frpc:客户端,部署在内网机器上
简单来说,frpc 会主动连接公网服务器上的 frps,然后通过这条连接把内网服务映射到公网端口。
这样,即使内网机器没有公网 IP,也可以通过公网服务器访问到它。
二、frp 适合哪些场景?
frp 的使用场景非常广,常见的有以下几种:
1. 远程访问内网 Web 服务
本地启动了一个 Web 项目,例如:
1 | http://127.0.0.1:8080 |
通过 frp 映射后,可以在公网通过类似下面的地址访问:
1 | http://服务器IP:公网端口 |
非常适合临时演示、接口联调和远程测试。
2. 远程 SSH 登录内网服务器
家里或公司的 Linux 机器没有公网 IP,但想在外面远程登录,可以使用 frp 映射 SSH 端口。
映射后,就可以通过公网服务器连接内网机器:
1 | ssh -p 6000 user@公网服务器IP |
当然也可以用于游戏服务器映射到公网,比如Minecraft等。
3. 访问家庭 NAS 或软路由面板
很多人会在家里部署 NAS、OpenWrt、Home Assistant 等服务。
借助 frp,可以在外网访问这些管理页面,无需运营商提供公网 IP。
4. TCP、UDP 服务转发
除了 HTTP 和 HTTPS,frp 也支持 TCP、UDP、STCP、XTCP 等多种代理方式,灵活性很高。
三、准备工作
在开始之前,需要准备以下环境:
| 角色 | 要求 |
|---|---|
| 公网服务器 | 一台拥有公网 IP 的云服务器 |
| 内网机器 | 需要被访问的本地电脑、服务器或 NAS |
| frp 程序 | 下载对应系统版本的 frp |
| 防火墙端口 | 放行 frps 监听端口和映射端口 |
这里使用的演示环境如下(公网服务器已做脱敏处理):
| 项目 | 示例 |
|---|---|
| 公网服务器 IP | 1.2.3.4 |
| frps 监听端口 | 7000 |
| 内网 Web 服务 | 127.0.0.1:8080 |
| 映射公网端口 | 8088 |
四、安装 frp
前往 frp 的github release页面,下载对应系统版本的压缩包。
Linux 服务器一般可以使用类似下面的命令:
1 | wget https://github.com/fatedier/frp/releases/download/v0.XX.X/frp_0.XX.X_linux_amd64.tar.gz |
目录中通常会包含以下文件:
1 | frps |
其中:
frps是服务端程序frps.toml是服务端配置文件frpc是客户端程序frpc.toml是客户端配置文件
五、配置 frps 服务端
在公网服务器上编辑 frps.toml:
1 | bindPort = 7000 |
这表示 frps 服务端监听 7000 端口,等待 frpc 客户端连接。
启动 frps:
1 | ./frps -c ./frps.toml |
如果看到服务正常启动,就说明服务端已经运行。
为了保证外网可以连接,还需要在云服务器安全组和系统防火墙中放行端口:
1 | 7000 |
其中:
7000用于 frpc 连接 frps8088用于公网访问内网 Web 服务
六、配置 frpc 客户端
在内网机器上编辑 frpc.toml:
1 | serverAddr = "1.2.3.4" |
配置说明:
| 配置项 | 含义 |
|---|---|
serverAddr |
公网服务器 IP |
serverPort |
frps 服务端端口 |
name |
代理名称,自定义即可 |
type |
代理类型,这里使用 TCP |
localIP |
内网服务地址 |
localPort |
内网服务端口 |
remotePort |
映射到公网服务器的端口 |
启动 frpc:
1 | ./frpc -c ./frpc.toml |
启动成功后,访问:
1 | http://1.2.3.4:8088 |
就可以访问到内网机器上的 127.0.0.1:8080 服务。
七、配置 SSH 内网穿透
如果想远程登录内网 Linux 服务器,也可以配置 SSH 转发。
假设内网机器 SSH 端口是 22,希望映射到公网服务器的 6000 端口,可以在 frpc.toml 中增加:
1 | [[proxies]] |
然后重启 frpc。
在外网环境中执行:
1 | ssh -p 6000 user@1.2.3.4 |
即可连接到内网机器。
八、配置 frp 身份认证
为了安全,不建议直接裸奔使用 frp。可以为 frps 和 frpc 配置认证 token。
服务端 frps.toml:
1 | bindPort = 7000 |
客户端 frpc.toml:
1 | serverAddr = "1.2.3.4" |
这样只有 token 一致的客户端才能连接到 frps。
也可以在客户端配置的每一项中添加下面的配置来实现加密信道传输,保护数据安全:
1 | transport.useEncryption = true |
九、使用 systemd 后台运行 frps
在 Linux 服务器上,为了让 frps 开机自启,可以配置 systemd 服务。
创建服务文件:
1 | sudo vim /etc/systemd/system/frps.service |
写入以下内容:
1 | [Unit] |
然后执行:
1 | sudo systemctl daemon-reload |
同理,内网客户端也可以配置 frpc.service,实现开机自动连接。
注:也可以手动启动加上 nohope 和 & 使frps在后台运行。
十、常见问题排查
1. frpc 连接不上 frps
可以检查以下几点:
- 公网服务器 IP 是否正确
serverPort是否和bindPort一致- 云服务器安全组是否放行端口
- Linux 防火墙是否放行端口
- token 是否一致
2. 公网端口无法访问
重点检查:
remotePort是否被占用- 云服务器安全组是否开放该端口
- frpc 是否正常运行
- 内网服务本身是否正常启动
可以在内网机器上先测试:
1 | curl http://127.0.0.1:8080 |
如果本地都访问不了,说明问题不在 frp,而在内网服务本身。
3. 启动提示端口占用
可以使用以下命令查看端口占用:
1 | sudo lsof -i:8088 |
或者:
1 | sudo netstat -tunlp | grep 8088 |
换一个未被占用的 remotePort 即可。
十一、安全建议
frp 很方便,但公网暴露服务也意味着风险增加。建议注意以下几点:
- 不要随意暴露敏感管理后台
- 使用强 token 进行认证
- SSH 禁用密码登录,优先使用密钥登录
- 给 Web 服务增加登录认证
- 只开放必要端口
- 定期更新 frp 版本
- 配合防火墙限制访问来源 IP
尤其是 SSH、NAS、数据库、管理面板这类服务,不建议直接暴露在公网,最好额外加一层认证或访问控制。
十二、总结
frp 是一个非常实用的内网穿透工具。通过在公网服务器上部署 frps,在内网机器上部署 frpc,我们就可以轻松把内网服务映射到公网。
它的核心优势包括:
- 配置简单
- 支持 TCP、UDP、HTTP、HTTPS 等多种协议
- 性能较好
- 适合开发调试、远程访问和家庭服务暴露
- 可配合 systemd 实现长期稳定运行
对于没有公网 IP 的用户来说,frp 是一种成本低、灵活性高的解决方案。
只要合理配置权限和安全策略,就可以实现“内网服务,公网轻松访问”。