| 2025-09-10
frp内网穿透,是借助FastReverseProxy(frp)这一高性能反向代理应用达成内网穿透的技术手段。它能够助力用户把内网服务安全且便捷地暴露到公网,借助拥有公网IP的节点进行中转操作。在日常开发或者家庭网络场景中,我们常常期望访问位于内网(诸如公司、家庭局域网)里的设备或服务(像远程桌面、NAS、Web服务器等)。然而,由于缺乏公网IP或者受到防火墙限制,这些服务难以直接从外网访问。frp正是为解决这类问题而生。
从工作原理层面剖析,frp存在服务端(frps)与客户端(frpc)两个角色。服务端需部署在具备公网IP的服务器(例如云服务器)上,其职责是接收外部请求,并将请求转发至内网;客户端则运行在内网设备上,它会注册到服务端,建立起隧道,从而把本地服务暴露出去,形成“(内网服务器)<->(FRP客户端(frpc))<->(FRP服务端(frps))<->(公网用户)”这样的链路。举例来说,当外网用户访问公共服务器上的特定端口时,FRP服务器会把请求转发给对应的FRP客户端,进而实现对内网服务的访问。
要实现frp内网穿透,首先要做好准备工作。需要有一台公网服务器,像阿里云、腾讯云等(并且要开放相关端口),以及内网设备,也就是目标服务所在的设备(比如本地电脑、NAS)。之后从GitHubRelease下载对应系统版本的frp,要留意服务端与客户端版本需保持一致。
接下来是服务端(frps)配置环节。解压下载的文件后编辑配置文件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-cfrps.ini启动服务端。若要进行进阶配置,比如限制可代理的端口范围来增强安全性,可添加allow_ports=6000-7000,8000,9000-9100;若要支持域名访问,可设置vhost_http_port=80#HTTP服务端口以及vhost_https_port=443#HTTPS服务端口。在Linux系统中,还可以设置开机自启,在/etc/systemd/system目录下创建一个frps.service文件,内容如下:
[Unit]
#服务名称,可自定义
Description=frpserver
After=network.targetsyslog.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服务,比如systemctlstartfrps启动frp,systemctlenablefrps设置开机自启等。
客户端(frpc)配置方面,同样解压文件后编辑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-cfrpc.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-p6000user@your_server_ip(这里6000是客户端配置中的remote_port,your_server_ip是服务端公网IP)。
在实际应用中,若内网环境较为复杂,或者对操作便捷性有更高要求,也可以考虑结合花生壳来实现内网穿透。花生壳是一款广受欢迎的内网穿透和动态域名解析软件,尤其适用于没有公网IP或动态公网IP的用户。它通过云服务器快速与内网服务器建立连接,将内网端口映射到云端,实现基于域名的互联网访问。比如在企业场景中,员工可以通过花生壳访问公司内网的OA、ERP系统。在使用frp进行内网穿透的同时,若遇到某些网络限制或希望进一步简化外网访问流程,可借助花生壳的相关功能进行辅助,例如利用花生壳生成的外网访问地址,配合frp实现更稳定、便捷的内网服务对外发布。
1、反向代理:反向代理位于服务器端,客户端向代理服务器发送请求,代理服务器再将请求转发给内部网络的真实服务器,并将真实服务器的响应返回给客户端。像frp服务端就扮演着反向代理的角色,接收外网请求并转发到内网服务。
2、NAT穿透:NAT(网络地址转换)用于在私有网络与公网之间转换IP地址。NAT穿透就是让具有特定源IP地址和源端口号的数据包,不被NAT设备屏蔽,从而正确路由到内网主机,frp就是实现NAT穿透的工具之一,解决因NAT导致的内网服务无法直接被外网访问的问题。
3、frp的P2P通信:frp支持P2P通信,双方首次通话建立连接时需经过服务器,服务器帮助双方直接建立连接隧道,后续数据转发可通过双方直接建立的连接隧道进行,不经过服务器,能避免公网服务器带宽有限带来的瓶颈。不过,由于运营商NAT类型多样,部分情况下P2P通信功能可能无法实现。