frp tcp域名配置的本质,就是把公网流量通过一条加密隧道,转发到你家里或公司内网的某台设备上,让外网像访问普通网站一样访问你的内部服务。这条隧道由服务端(一台有公网IP的VPS)和客户端(内网机器)组成,域名只负责把请求带到服务端,真正干活的是tcp端口转发规则,下面按步骤拆开讲。
先搞清楚frp tcp和域名的关系
很多人一开始会混淆:既然tcp转发用的是端口,域名有什么意义?实际上frp的tcp模式本身不依赖域名,它靠的是remote_port,但当你需要通过域名访问内网服务时,域名的作用就体现在两个层面:
- 服务端通过
vhost_http_port或vhost_https_port监听来自域名的HTTP/HTTPS请求,按域名规则转发给内网。 - 你的域名解析到VPS的IP,用户的访问请求先到达VPS,再由frp服务端根据配置映射到内网对应端口。
如果你用的是纯TCP端口映射(比如远程SSH、远程桌面、游戏服务器),那么配置里不需要域名,直接frp tcp加remote_port就能通,但如果你的目标是通过http://你的域名访问内网的Web服务、NAS管理界面、GitLab这类应用,那就要走frp的虚拟主机功能,域名就成了入口的关键。
为什么你的场景需要域名绑定
简单说:端口够用,但记不住。 你会在浏览器里敲http://服务器IP:7000去访问家里的路由器吗?体验太差,用域名绑定后,你可以同时开多个Web服务,每个服务分配一个子域名,比如nas.example.com、git.example.com,理清内网服务的同时,外网访问体验也接近真实公网站点。
frp内网穿透域名解析配置:从服务端到客户端完整步骤
开始之前,做好准备工作:一台拥有公网IP的服务器(国内厂商的VPS需要备案域名,香港或海外服务器可以跳过备案),一个解析权限在手的域名,以及一台要暴露到外网的内网设备,服务端装frps,客户端装frpc,两者版本保持一致。
第一步:服务端frps.ini基础配置
服务端的配置核心是定义bindPort和虚拟主机监听端口,以下是一份实践验证过的配置示例:
[common] bindPort = 7000 # frp服务端通信端口 vhost_httpPort = 8080 # http虚拟主机端口 vhost_httpsPort = 443 # https虚拟主机端口 token = 你的连接密码 # 服务端与客户端校验的token
配置完成后启动frps,默认监听7000端口,把域名解析的A记录指向这台VPS的IP,TTL设短一些(比如600秒),方便测试生效。
第二步:客户端frpc.ini配置tcp域名转发
内网机器的frpc配置里,serverAddr填VPS的IP,serverPort填7000,Web服务的转发规则用type = http:
[common] serverAddr = 你的VPS_IP serverPort = 7000 token = 你的连接密码 [nas-web] type = http localIp = 192.168.1.10 localPort = 5000 customDomains = nas.example.com
customDomains就是你要绑定的域名,一行一行解释:
type = http表示走HTTP虚拟主机模式,frp根据请求中的Host头来匹配customDomains,把流量路由到对应的localIp和localPort。localIp填内网设备的地址,localPort是内网服务的真实端口。customDomains是你的完整子域名,必须已经解析到VPS的IP。
第三步:通过域名访问内网服务
启动frpc后,访问http://nas.example.com:8080就能到达你的内网NAS了,注意端口号是服务端vhost_httpPort暴露的端口,如果想让用户直接输http://nas.example.com不敲端口,就在Nginx或Caddy层面反向代理到http://VPS_IP:8080,或者在服务端直接改监听80端口。
纯TCP应用和Web服务有个关键差异:SSH、远程桌面这类协议不需要域名,直接用remote_port暴露。
[ssh] type = tcp localIp = 192.168.1.20 localPort = 22 remotePort = 6000
这样配置后,ssh -p 6000 用户@VPS_IP就能连回内网,但如果你希望用ssh.example.com来访问SSH,那就复杂许多,因为SSH协议不认Host头,只能连不同端口,行业共识认为,不写域名也能用才是tcp模式的优势,域名只用在http类型的服务上更顺手。
frp tcp和http端口冲突怎么规避
在实际配置时,一个高频故障场景是端口被占用,比如你VPS上已经跑了Nginx占用了80端口,这时frp服务端的vhost_httpPort再设置成80就起不来,业内专家指出,生产环境中多数Nginx都会劫持80/443端口,让frp服务端监听这些端口是不现实的做法。
- 方案A:让Nginx监听80/443,把符合特定域名的请求反向代理到
0.0.1:8080,frp管内部流量,Nginx管对外入口,这样你在浏览器里输的仍是标准网址,同时不必在frp里直接开特权端口。 - 方案B:frp服务端直接用
80端口,前提是这台VPS没跑其他Web服务,适合干净环境的独立机器。 - 方案C:如果你用的是
type = tcp模式,端口冲突就靠自己规划了。remotePort不要小于1024(除非用root启动),常见服务端口(22、80、443、3306)尽量避开。
HTTPS要怎么配
很多人的需求是https://域名访问内网,frp支持type = https和vhost_httpsPort = 443,但证书怎么处理是个绕不开的话题。
最简单的策略:frp客户端本地服务本身就是HTTPS(比如群晖NAS的443端口),那直接type = https并把customDomains绑上即可,但你需要让VPS的443端口不被占用,并且把证书放在内网设备上,另一种常见组合是在VPS上配置Caddy自动获取证书,反向代理到frp的vhost_httpPort,好处是证书自动续期,不用在内网设备上折腾证书文件。
多个域名、多个端口怎么管理
内网不止一台设备,你的frpc配置可能同时需要暴露多个服务,这时每个服务在frpc.ini里就是一个独立的模块,共用一个[common]段。
| 服务 | 模块名 | 类型 | localIp | localPort | 对外端口/域名 |
|---|---|---|---|---|---|
| 群晖NAS | nas-http | http | 168.1.10 | 5000 | nas.example.com |
| 内网GitLab | gitlab | http | 168.1.30 | 8929 | git.example.com |
| SSH | ssh-proxy | tcp | 168.1.20 | 22 | remotePort: 6000 |
注意几个细节:
- 每个模块名不能重复,否则frpc会报错。
- HTTP和HTTPS都可以共用同一个
customDomains下的不同端口,但如果你想用不同域名区分服务,就分配不同的子域名。 - TCP模式下每个服务必须有独一无二的
remotePort,VPS的防火墙和安全组要放行对应端口(如6000),否则流量到不了frp。
frp内网穿透域名绑定多个端口时怎么配置
一个域名对应多个内网端口是常见需求,实现方式有两种思路:
- 一个域名,多个路径:利用Nginx的
location分流,把nas.example.com/photo代理到内网的相册服务,把nas.example.com/video代理到视频服务,这种模式frp只需暴露一个customDomains即可,具体路由规则由Nginx完成。 - 多个子域名,各绑一个端口:如
files.example.com指向内网5000,sync.example.com指向内网8888,每增加一个服务,就在frpc.ini里加一个模块。
大多数场景下第二种更清晰,因为frp的customDomains是按域名精确匹配的,子域名越独立,管理越省心。
frp内网穿透vps推荐与速度优化
既然frp需要一台有公网IP的VPS做跳板,选择哪里的服务器直接决定你能跑多远,如果你是个人用户,追求性价比和免备案,香港和日本的小带宽VPS是主流选择,带宽尽量选择3Mbps~5Mbps以上,因为有相当一部分用户反映,frp的实际吞吐量瓶颈往往出现在VPS的入网带宽上,而不是frp本身。
- 地域选择:访问你服务的用户在哪,VPS就离哪近,你的用户群体主要在国内,选国内节点(备案要求高)或香港节点(延迟40-80ms)更合适;主要自己用、用户群在海外,新加坡和洛杉矶的线路表现更好。
- 带宽规格:传输大文件、看视频、跑数据库同步,对带宽消耗极大,建议VPS带宽不低于5Mbps,如果只是SSH管理、偶尔访问一下NAS页面,1~2Mbps的带宽也够用。
- 内存要求:frp本身就是轻量级工具,1GB内存的VPS随便跑,512MB的小鸡也能带得动,主要资源消耗还是取决于你VPS上还跑了多少其他服务。
配置正确但访问慢怎么办
排除VPS本身带宽不足的情况后,frp内网穿透速度快不快,还取决于以下几个环节:
- 内网上行带宽:你家里宽带的公网上传速度决定了frp的上限,一般家庭宽带上行也就20~30Mbps,跑满5Mbps的VPS链路绰绰有余。
- 加密开销:frp默认启用加密与压缩时,CPU会承担一部分加解密成本,老旧的软路由或树莓派上,开启
useCompression = true反而可能拖慢速度,建议低功耗设备上关闭压缩、保留加密即可。 - 路由绕行:VPS所在机房的线路质量直接影响延迟,晚高峰时期,部分国际线路会出现丢包和抖动,这是物理距离导致的,frp本身无法优化,换成CN2 GIA线路的VPS通常能明显改善。
frp内网穿透q&a:常见问题解答
frp的tcp域名配置必须使用域名吗?
不需要,纯TCP转发可以不使用域名,只需在frpc.ini中配置type = tcp和remotePort,通过VPS_IP:remotePort直接访问,域名仅在你配置HTTP/HTTPS虚拟主机(type = http或type = https)时作为路由依据发挥作用,一个容易混淆的点是:customDomains仅在HTTP/HTTPS类型中生效,TCP类型会忽略这个字段。
frp tcp和stcp有什么区别,我该选哪个?
frp的stcp模式(Secret TCP)是一种不直接暴露端口的点对点隧道模式,它的特点是不需要公网VPS转发大量数据流量,而是借助VPS做信令握手,然后由双方尝试P2P直连,相比type = tcp,stcp多一层secretKey访问密钥的保护,不监听公网端口,安全性更高,但stcp要求访问方也必须安装frpc并配置相同的secretKey,访问门槛更高。适合不想把端口暴露在公网、且访问方是你自己的设备这类场景,比如远程桌面、SSH管理,如果只是给同事发个链接让他用浏览器看内网网页,还是老老实实用type = tcp或type = http加域名的方式更方便。
frp内网穿透配置后外网还是无法访问域名,最常见的隐患有哪些?
排查方向按以下顺序逐一排查,多数情况下可以快速定位问题:
- 域名解析是否已生效:在命令提示符执行
ping 你的域名,看返回的IP是不是VPS的IP。 - VPS防火墙/安全组是否放行端口:国内云厂商默认安全组只放行22、80、443等常用端口,frp的服务端口(7000)和
remotePort(如6000)都需要手动放行。 - frpc和frps的token必须一致:两端token不一致,连接会在握手阶段被拒绝,日志里能看到
auth failed。 - frpc日志是否显示
login to server success:看到这行字样说明隧道已建立,问题基本出在域名或VPS入口侧。
这些步骤走完,绝大多数配置问题都能暴露出来,最后的建议是:先用最简单的SSH隧道模式(type = tcp)跑通链路,再加域名和HTTP模式。 这样每一步的变数都隔离了,定位起来也省事。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/641741.html




