要让外网访问内网设备,核心做法是把内网服务的地址通过内网穿透工具映射到一个公网入口,再用域名解析把这个入口绑定成好记的域名,访问流程就变成了用户输入域名、解析到穿透节点、节点把请求转交给内网服务。
做内网穿透需要域名解析吗?先搞清楚两者的分工
很多人刚开始接触内网穿透时,分不清域名解析和穿透工具各自负责什么事,把两者混为一谈,会在写配置文件时思路混乱,我的理解是,穿透工具解决的是链路问题,把外网能访问的公网端口和内网服务的私有ip之间搭一条路,域名解析解决的是入口问题,让访问者不用记ip和端口号,用一个稳定的名字找到这条链路。
如果你只是临时测试,直接用公网ip加一串随机端口号也能访问,但实际情况是,大多数家庭宽带没有固定公网ip,运营商分配的地址经常变动,穿透工具给你的转发地址本身也可能随着节点变化而更换,这时候域名解析的价值就体现出来了,它能把你常用的访问域名始终指向当前可用的穿透入口,底层地址怎么变,用户无感知。
对于自建frp服务的用户,功能基本上也是这个逻辑,穿透服务器提供一个公网端口,客户端建立隧道,然后域名解析把自定义域名指向这台服务器的ip,如果是使用服务商提供的免搭建方案,服务商已经帮你处理了节点地址的关联,你只需要在自己的域名后台加一条解析记录或者直接在平台上做绑定。
外网访问内网服务器域名,frp加DNS全流程拆解
这里用最常见的frp方案演示完整链路,你跟着操作就能跑通。
准备三样东西:一台有公网ip的服务器,把它当作穿透跳板机;一台内网设备,比如办公室的nas或者家里的开发机;一个域名,按自己的需求决定是在国内服务商还是国外服务商注册。
先在穿透服务端操作,下载对应系统的frp压缩包,解压后编辑核心配置:
[common] bind_port = 7000 token = 自定义验证口令
保持服务端运行后,接着处理客户端,客户端内网设备是nas、路由器或者普通电脑都可以,Linux和Windows均有对应版本,编辑客户端配置:
[common] server_addr = 你的服务器公网ip server_port = 7000 token = 自定义验证口令 [web] type = tcp local_ip = 192.168.1.10 local_port = 5000 remote_port = 8000
这句配置的意思是,内网设备监听在局域网ip 192.168.1.10的5000端口,穿透服务器对外提供8000端口作为跳转口。
现在外部用户访问服务器ip加上8000端口,就能看到内网服务,但你的目标是用域名访问,所以需要把域名解析到这台服务器ip上。
登录域名服务商的后台,找到解析设置,添加一张A记录指向穿透服务器ip,比如访问入口是remote.example.com,解析生效后,浏览器输入remote.example.com:8000就能访问。

刚才说到的方案还有一处不完美,每次访问还要加端口号,显得不专业,处理办法是在穿透服务器上配一层Nginx反向代理,省略端口,安装Nginx,新增配置:
server {
listen 80;
server_name remote.example.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
这样访问者只需输入remote.example.com,Nginx监听在80端口,按域名匹配规则把请求转发到frp的对外端口,frp再把流量送回内网的5000端口。
数据库类的穿透配置有个重要提醒,比如暴露PostgreSQL或MySQL,客户端类型改为tcp之外再加限制:
[nas-db]
type = tcp
local_ip = 192.168.1.20
local_port = 5432
remote_port = 0
remote_port = 0表示不对外暴露固定端口,只在穿透服务器内网分配一个临时入口,通过服务端配置的vhost_http_port统一接入域名,这类写法能降低被公网扫描到的概率。
自建frp和免费服务商怎么选?穿透价格和稳定性对比
穿透工具的选型取决于你的具体使用环境,以下是几种常见路线的对比:
- 自建frp,需要额外购买服务器,按月费用在几十元左右,胜在链路自主可控,数据处理在自家服务器上。
- 内网穿透免费服务商,如ngrok的免费档,适合短期联调开发,能省下服务器开销,但免费线路通常带宽较小,部分服务商在访问页插入广告。
- 付费穿透平台,提供固定节点和更完整的访问日志,按流量计费居多,多数情况下家庭监控和远程桌面这类轻量使用,月付十几元左右即可满足需求。
行业共识认为,端口映射和隧道转发在多数场景下性能差异不如带宽影响大,穿透链路中的中转服务器带宽决定了实际传输速度,如果要远程传输大体积媒体文件,最优先应该关注穿透服务器的入站和出站带宽,只有百兆共享带宽的机器实际能跑到的速度可能会让你失望。
对于跨地域访问场景,比如身在外地连接家中设备,延迟提升明显,节点位置就近才靠谱,选服务商时留意节点覆盖情况,优先选离你常住地近的机房,否则远程操作会出现明显的鼠标漂移感。
如果你的内网设备数量多,且都分散在不同局域网中,还有一种思路:在每台设备上各自部署穿透客户端,统一连接同一个frp服务端,服务端按客户端配置中的[名称]区分路由,实现一条通道接多台家中的设备。
内网穿透域名解析失败的排查顺序
域名解析配置完成后页面打不开,多数原因出在三个地方,按顺序排查效率最高。
先验证域名是否生效,在命令行敲ping remote.example.com,看到的ip必须和穿透服务器公网ip一致,如果不一致,说明解析记录没保存,或者在公共dns服务器上有缓存残留,国内域名服务商对解析生效时间的承诺通常是一个小时之内,实际上大部分记录在几分钟内就能完成全球同步。

接着检查穿透链路,在内网设备上执行telnet 服务器公网ip 7000,确认客户端能连上服务端,还要确认服务的启动日志里没有token错误和端口占用提示,服务端和客户端的版本号不一致在不少情况下会导致握手失败,去官网把两边同步成一致。
第三处是防火墙规则,云服务商的安全组策略和穿透服务器自身的iptables都要放行对应端口,缺一漏一连接就断,许多云厂商默认的安全组策略只放行常用端口,你自定义的8000、7000端口会一直撞墙,添加规则后耐心等一两分钟再测,安全组的规则生效需要几秒到几十秒的时间。
还有一个高频踩坑点:配置了域名但穿透客户端绑定的是0.0.1,外部流量被服务端转发到内网时指向了客户端机器自身的回环地址,检查配置是否遗漏了对外提供服务的网卡ip,内网服务的监听地址用0.0.0才能被frp客户端捕获。
内网穿透域名解析的安全加固要点
服务暴露到公网,就会有被扫描的风险,排查这些只要做几件事就能挡住大部分攻击。
第一,更换默认端口,frp默认的7000和常见备用端口都在自动化扫描工具的字典里,换成不规则的端口如53021,能降低被扫描命中的概率。
第二,验证token长度,内网穿透服务商后台的安装文档建议生成的token至少16位以上,但大量用户在实际配置中使用短口令方便记忆,现在扫描器对内网穿透协议特征的识别已经相当成熟,在寄存器中写入随机字符串代替固定口令更稳妥。
第三,访问鉴权不可省略,内网服务本身要做登录认证,proxy_pass反向代理末尾不要轻易去掉认证插件,基础认证加在Nginx这层能减少对业务代码的侵入,用htpasswd生成一个账号密码文件,Nginx启用auth_basic "Restricted";配合auth_basic_user_file即可。
第四,注意HTTP和HTTPS的证书配置,用Let's Encrypt的免费证书配合域名签发容易实现,但证书续期脚本要确保穿透链路存活,有人因为长期不开电脑导致内网穿透链路不通,证书续期也因此失败,这类场景适合在穿透服务器上做定时检测,发现隧道断开就尝试重连并发出告警。
外网访问内网服务器的典型应用场景
内网穿透域名解析最常见的用途是远程管理家中或办公室的Synology群晖设备,群晖自带的QuickConnect服务在部分网络环境下连接速度不理想,自建frp并绑定自己的域名后,传输速度往往会有明显提升。
设置时注意群晖的HTTP端口一般是5000或5001,只需映射这几个端口即可,不需要把群晖的全部服务都暴露出来。
另一个高频场景是远程桌面管理内网计算机,Windows

自带的远程桌面是3389端口,穿透配置相对简单,macOS用户则一般用VNC协议,映射5900端口即可,对远程桌面体验影响最大的因素是线路质量,建议优先确保穿透服务商的线路稳定性,再来谈画质设置,远程桌面需要的带宽与帧率要求较高,在2Mbps以下的上行链路中操作会出现卡顿与延迟。
开发调试和联调也经常用到内网穿透,比如本地起了个微信小程序开发者工具,需要验证回调地址,把本地端口通过穿透公网地址映射出去,再用域名解析绑定自定义域名即可快速完成验证,公司内网的CI/CD流水线控制台如果需要出差在外访问,同样可以用穿透方案实现临时入口。
解析记录类型与ttl值调优
公网ip不固定的场景下,动态域名解析配合脚本,会定期检测本机出口ip是否有变化并将其更新到DNS记录,市面上多数云服务商的API都提供了Uptime功能,但轮询间隔不宜设置过密,每五分钟检查一次对DNS服务商和脚本负载都没有影响。
配合动态域名解析使用时,ttl值设置很关键,一般外网访问域名默认设置600秒,即10分钟缓存刷新周期,但是动态ip切换时,用户访问会在至少10分钟内无法连接,把ttl调到60秒能兼顾DNS解析速度和缓存压力,代价是解析服务器上的请求量会增加,这一点在频繁切换网络的环境中非常实用,例如经常在没有固定线路的办公地和家里切换使用同一套穿透服务。
如果访问量不大,不需要为性能优化操心,只有在穿透链路较慢时才需要调整这些参数,国内的大型dns厂商解析效率目前并不存在明显的性能瓶颈,选择最大的厂商并不总是对业务访问速度影响最大,测试平台实测的数据显示,各家云解析的全国平均响应时间仅有微小差距,真正影响体验的是目标主机的负载和带宽,而不是解析认证的毫秒级差异。
关于内网穿透域名解析的常见疑问
为什么我加了域名解析,外网还是访问不了?
先确认穿透服务是否正常运行,本地执行frpc status或者查看日志看隧道是否在线,再用telnet 服务器ip 7000测试端口连通性,最后检查云服务商的安全组,三处都通了域名才能用。
没有自己的服务器,能实现内网穿透加域名访问吗?
可以,使用带自定义域名功能的穿透服务商,在服务商后台绑定你的域名,根据提示在域名商处添加一条CNAME记录指向服务商指定地址,服务商会自行处理后续链路调度。
内网穿透的域名解析到底放在哪个环节生效?
访问端的浏览器发起请求时先询问DNS服务器获得域名对应的公网ip,然后连接该ip上的穿透服务端,服务端根据域名匹配规则把请求分发给对应内网隧道,完成整个链路,配置项参考顺序从请求流向来看是:DNS记录 > 防火墙放行 > 穿透服务端 > frps配置的域名路由 > frpc客户端转发。