本文目录导读:

FRP(Fast Reverse Proxy)是目前最流行的内网穿透工具之一,它通过将内网服务的端口映射到公网服务器上的某个端口,使得外部可以直接访问内网资源。
下面详细介绍 FRP 实现内网穿透的完整步骤(以最常见的 TCP 穿透为例,比如访问内网的 SSH、远程桌面或 Web 服务)。
核心原理
- 公网服务器运行 frp 的服务端 (frps)。
- 内网设备运行 frp 的客户端 (frpc)。
- 客户端主动连接服务端,并注册一个“隧道”。
- 当用户访问公网IP:端口时,服务端将流量通过这个隧道转发给内网客户端,客户端再转发给实际的内网服务。
安装与配置步骤
第一步:准备环境
- 一台有公网 IP 的服务器(例如阿里云/腾讯云/华为云 ECS,或海外 VPS)。
- 操作系统:Linux (CentOS/Ubuntu/Debian) 或 Windows 均可。
- 内网设备(需要被访问的设备)。
- 操作系统:任意能运行 FRP 客户端(frpc)的系统(Windows、Linux、Mac、群晖NAS等)。
- 下载 FRP。
- 前往 FRP GitHub Releases 页面下载与操作系统匹配的最新版本。
- 注意:服务端和客户端最好使用同一个版本。
- 通常下载
frp_xxx_linux_amd64.tar.gz(适用于Linux 64位)。
第二步:配置服务端 (frps)
操作位置:在公网服务器上操作。
-
上传并解压。
# 假设下载到 /opt 目录 tar -zxvf frp_0.59.0_linux_amd64.tar.gz cd frp_0.59.0_linux_amd64
-
编辑配置文件
frps.toml(注意新版本使用toml格式,旧版是ini格式,推荐使用新版)。# frps.toml [common] # 服务端监听的端口,用于客户端连接 bind_port = 7000 # (可选)配置一个访问 Dashboard 的端口,用于查看连接状态 # dashboard_port = 7500 # dashboard_user = admin # dashboard_pwd = admin123 # (可选)启用TLS加密,推荐开启 # tls_enable = true
-
启动服务端。
# 前台运行(测试用) ./frps -c frps.toml # 后台运行(推荐生产环境) nohup ./frps -c frps.toml &> /dev/null &
-
防火墙设置。
- 在云服务器控制台的安全组中开放端口:
7000(服务端监听端口,必须打开)6000(下面示例中的 Web 端口,按需打开)7500(Dashboard端口,如启用需打开)
- 在云服务器控制台的安全组中开放端口:
第三步:配置客户端 (frpc)
操作位置:在内网设备上操作。
-
上传并解压,将下载的 FRP 包上传到内网设备(Windows直接解压,Linux同服务端)。
-
编辑配置文件
frpc.toml。# frpc.toml [common] # 你的公网服务器IP或域名 server_addr = 你的公网服务器IP # 服务端监听端口,必须与 frps.toml 中的 bind_port 一致 server_port = 7000 # 如果服务端启用了TLS,客户端也需要开启 # tls_enable = true # ---- 配置第一个隧道: 访问内网 SSH (22端口) ---- [ssh] type = tcp # 本地实际服务的IP (通常是 127.0.0.1 自己)和端口 local_ip = 127.0.0.1 local_port = 22 # 这个服务将映射到服务端的哪个端口 remote_port = 6000 # ---- 配置第二个隧道: 访问内网 Web 服务 (例如群晖/路由器后台/开发环境) ---- [web] type = tcp local_ip = 127.0.0.1 local_port = 80 # 假设你的内网Web跑在80端口 remote_port = 6001
-
启动客户端(Windows)。
- 打开命令行(CMD)进入解压目录,运行:
frpc.exe -c frpc.toml
- 打开命令行(CMD)进入解压目录,运行:
-
启动客户端(Linux)。
# 前台运行 ./frpc -c frpc.toml # 后台运行 nohup ./frpc -c frpc.toml &> /dev/null &
第四步:测试访问
-
访问内网 SSH。
- 在任何可以联网的设备(手机4G、公司电脑等)执行:
ssh -oPort=6000 用户名@你的公网服务器IP
- 输入内网设备的账号密码,即可成功连接。
- 在任何可以联网的设备(手机4G、公司电脑等)执行:
-
访问内网 Web 服务。
- 在浏览器中输入:
http://你的公网服务器IP:6001 - 即可看到内网那台设备的网页内容。
- 在浏览器中输入:
高级功能与优化
使用域名而不是 IP(HTTP/HTTPS 穿透)
如果你有域名并想直接通过子域名访问内网服务,可以使用 HTTP 代理模式。
-
服务端
frps.toml增加:vhost_http_port = 8080 # 用于接收 HTTP 请求的端口 vhost_https_port = 8443 subdomain_host = example.com # 你的域名
-
客户端
frpc.toml配置:[web-http] type = http local_port = 80 custom_domains = blog.example.com # 你希望使用的域名 # 或者如果配置了 subdomain_host,可以使用 subdomain = blog subdomain = blog
-
DNS 解析:将
*.example.com或blog.example.com解析到你的公网服务器 IP。 -
访问:直接访问
http://blog.example.com:8080。
安全加固
- 使用 Token 认证:防止他人随意连接你的 frps。
- 服务端
frps.toml:token = "your_strong_password" - 客户端
frpc.toml[common]下:token = "your_strong_password"
- 服务端
- 启用 TLS 加密:防止流量被嗅探。
- 只开放必要端口:在服务器防火墙中只放行 frps 的监听端口(7000)以及你实际映射的端口(如6000、6001)。
系统服务管理(Linux 开机自启)
创建 systemd 服务(服务端):
sudo nano /etc/systemd/system/frps.service
[Unit] Description=Frp Server After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/opt/frp_0.59.0_linux_amd64/frps -c /opt/frp_0.59.0_linux_amd64/frps.toml [Install] WantedBy=multi-user.target
然后启用并启动:
sudo systemctl enable frps sudo systemctl start frps
客户端同理,只需将 frps 改为 frpc。
访问内网远程桌面(Windows RDP)
- 内网 Windows 的 RDP 默认端口是
3389。 - 在
frpc.toml中添加:[rdp] type = tcp local_ip = 127.0.0.1 local_port = 3389 remote_port = 3389 # 或使用其他端口如 5000
- 访问时:
mstsc(远程桌面连接),输入公网IP:3389即可。
常见问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 客户端无法连接服务端 | 防火墙未放行服务端端口 | 检查云服务器安全组、本地防火墙,放行 7000 端口 |
| 能连接但无法访问服务 | 客户端 local_ip 写错或服务未启动 |
确保 local_ip 正确(通常是 0.0.1 或 localhost),并且内网服务正常运行 |
| 连接被拒绝 | remote_port 被占用或未开放 |
尝试更换 remote_port,并在防火墙放行该端口 |
| 域名访问不生效 | DNS未解析、custom_domains写错、HTTP端口未开放 |
检查DNS记录、配置文件、服务端 vhost_http_port 是否开放 |
| 速度慢或频繁断开 | 网络不稳定、服务端带宽不足 | 检查服务器带宽;或启用 keepalive 参数保持连接 |
FRP 的核心就是“你连我,我帮你连他”,只要拥有一个公网 IP 的服务器,按照上述步骤配置好服务端和客户端,就可以将任何内网服务(SSH、Web、RDP、数据库、文件服务等)暴露到公网,记得注意安全,日常使用建议开启 Token 认证并仅开放必要的端口。
如果你需要访问的是 HTTP(S) 服务并且希望直接通过域名访问(不携带端口),FRP 的 HTTP 代理模式配合 Nginx 反向代理是一个更优雅的方案,但基础原理是一样的。