使用 frp 实现内网穿透:从零到一的完整指南
🎁 DeepSeek满血版免费领啦!字节跳动火山引擎官方,免费抵扣3625万tokens,畅享R1与V3模型!参与入口:点击进入
为什么需要内网穿透?
在日常开发或家庭网络中,我们常常需要访问位于内网(如公司、家庭局域网)的设备或服务(如远程桌面、NAS、Web服务器)。然而,由于缺乏公网IP或防火墙限制,这些服务无法直接从外网访问。
内网穿透(NAT穿透) 技术应运而生,它能将内网服务暴露到公网。而 frp (Fast Reverse Proxy) 是一款开源、高效的内网穿透工具,支持 TCP/UDP/HTTP/HTTPS 等多种协议,配置简单且社区活跃。
本文将从原理到实践,手把手教你如何使用 frp 实现内网穿透。
一、frp 的核心概念
1.1 工作原理
frp 分为两个角色:
-
服务端(frps):部署在具有公网 IP 的服务器(如云服务器),负责接收外部请求并转发到内网。
-
客户端(frpc):运行在内网设备上,注册到服务端并建立隧道,将本地服务暴露出去。
[内网服务器] <-> [FRP客户端(frpc)] <-> [FRP服务端(frps)] <-> [公网用户]
1.2 适用场景
- 远程访问内网 SSH/RDP 服务
- 对外发布内网 Web 应用(如个人博客、测试环境)
- 穿透 NAT 访问 IoT 设备(如树莓派、摄像头)
1.3 主要特性
- 多协议支持:TCP、UDP、HTTP、HTTPS等
- 安全性:支持TLS加密传输
- 高性能:TCP连接复用
- 负载均衡:支持多个代理的负载均衡
- 端口复用:多个服务可以复用同一个端口
- P2P通信:支持点对点直接通信
- 插件系统:提供丰富的插件扩展功能
二、准备工作
- 公网服务器:如阿里云、腾讯云(需开放相关端口)。
- 内网设备:目标服务所在设备(如本地电脑、NAS)。
- 下载 frp:从 GitHub Release 下载对应系统的版本(服务端与客户端版本需一致)。
三、服务端(frps)配置
基础配置
-
解压并编辑配置文件:
tar -zxvf frp_*.tar.gz cd frp_* vi frps.ini
-
配置示例(frps.ini):
[common] bind_port = 7000 # 客户端连接的端口 token = your_secure_token # 认证令牌(客户端需一致) dashboard_port = 7500 # 服务端仪表盘的端口, 可以用浏览器访问查看 dashboard_user = admin # 服务端仪表盘的用户密码 dashboard_pwd = your_password# 日志保存设定, 保存位置、保存时长 log_file = ./frps.log log_level = info log_max_days = 7
-
启动服务端
./frps -c frps.ini
进阶配置
-
限制可代理的端口范围(增强安全性):
allow_ports = 6000-7000,8000,9000-9100
-
域名访问支持:
vhost_http_port = 80 # HTTP 服务端口 vhost_https_port = 443 # HTTPS 服务端口
设置开机自启(Linux)
-
使用文本编辑器 (如 vim) 在 /etc/systemd/system 目录下创建一个 frps.service 文件,用于配置 frps 服务。
[Unit] # 服务名称,可自定义 Description = frp server After = network.target syslog.target Wants = network.target[Service] Type = simple # 启动frps的命令,需修改为您的frps的安装路径 ExecStart = /path/to/frps -c /path/to/frps.toml[Install] WantedBy = multi-user.target
-
使用 systemd 命令管理 frps 服务
# 启动frp sudo systemctl start frps # 停止frp sudo systemctl stop frps # 重启frp sudo systemctl restart frps # 查看frp状态 sudo systemctl status frps
-
启动并启用服务:
systemctl start frps systemctl enable frps
四、客户端(frpc)配置
基础配置
-
解压并编辑配置文件:
tar -zxvf frp_*.tar.gz cd frp_* vi frpc.ini
-
配置(frpc.ini)
[common] # 服务端公网IP server_addr = [服务端公网IP] # 客户端访问服务端的密码 token = abcdefg # 客户端与服务端通信端口 server_port = 7000[range:ssh] # 指定TCP连接类型 type = tcp # 客户端IP, 这里填本地IP就可以 local_ip = 127.0.0.1 # 当前设备开放的远程连接端口, 默认为22 local_port = 22 # 表示服务端的代理端口号 remote_port = 33022 # 是否加密 use_encryption = true # 是否压缩 use_compression = false# 示例1:暴露 SSH 服务(通过公网IP:6000访问内网22端口) [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000# 示例2:通过域名访问内网 Web 服务 [web] type = http local_port = 8080 custom_domains = www.yourdomain.com# 数据库访问 [mysql] type = tcp local_ip = 127.0.0.1 local_port = 3306 remote_port = 3306
-
启动客户端
./frpc -c frpc.ini
多服务配置
# 远程桌面(RDP)
[rdp]
type = tcp
local_port = 3389
remote_port = 7001# 内网 NAS 的 HTTP 服务
[nas]
type = http
local_port = 5000
subdomain = nas # 需服务端配置 subdomain_host
五、测试与验证
访问穿透的服务
-
SSH 连接:
ssh -p 6000 user@your_server_ip
-
Web 服务:
浏览器访问 http://www.yourdomain.com(需域名解析到服务端IP)。
监控 frp 状态
访问 http://your_server_ip:7500,输入仪表盘账号密码,查看流量统计和连接状态。
六、安全加固与优化
安全建议
-
使用强 Token:避免使用默认或简单 token。
-
限制端口范围:通过 allow_ports 减少攻击面。
-
启用 TLS 加密(客户端配置):
[common] tls_enable = true
性能优化
-
启用压缩(减少带宽占用):
use_compression = true
七、常见问题解决
- 无法连接服务端
- 检查服务端防火墙是否放行 bind_port(如7000)。
- 确认客户端配置的 server_addr 和 token 正确。
- 域名访问提示 404
- 确保域名已解析到服务端 IP。
- 检查客户端配置的 custom_domains 或 subdomain。
- 仪表盘无法访问
- 检查 dashboard_port 是否开放,或尝试关闭服务端防火墙测试。
声明:本文为技术分享,请确保在使用内网穿透时遵守当地法律法规,勿用于非法用途。
frp官网传送门 点击地址 FRP
🎁 DeepSeek满血版免费领啦!字节跳动火山引擎官方,免费抵扣3625万tokens,畅享R1与V3模型!参与入口:点击进入