自定义域名访问服务器内网ip,最直接的办法是用内网穿透工具(frp、ngrok)或Cloudflare Tunnel,把公网请求安全转发到内网服务器。 家里的NAS、开发机、监控服务一旦没有公网IPv4,域名直连就无从谈起,别急着改DNS记录,先搞懂流量怎么“绕”进去。
内网穿透与自定义域名:流量先主动走出去
服务器在内网,没有公网IP,域名A记录只能指向某个公网IP,想让自定义域名访问内网ip,必须有一台公网机器做中转,让内网主机主动连上去,建立一条“隧道”,外部请求先到中转服务器,再由它沿着隧道转发给内网服务。
- 隧道模式:frp、ngrok、Cloudflare Tunnel 都属于这一类。
- 反向代理模式:如果内网有公网IP,可用Nginx结合端口映射实现,但家庭宽带极少有这个条件。
大于九成家庭网络没有独立公网IPv4地址,这是内网穿透成为主流玩法的根本原因,隧道工具解决了“没有公网IP”这个先决条件,剩下的事就是把你自己的域名映射到这条隧道上。
内网穿透 自定义域名怎么配置:以frp为例
frp是目前用得最多的开源内网穿透方案,支持自定义域名转发HTTP和TCP流量,整套系统分两端:跑在云服务器上的服务端frps,和跑在内网机器上的客户端frpc。
准备一台有公网IP的云服务器
不需要高配,1核1G的主机足够,系统选Ubuntu或CentOS,记得在云厂商安全组放行端口:
- 7000:frp通信端口
- 8080:HTTP虚拟端口,用于承载自定义域名
- 后续需要映射的内网服务端口
服务端frps配置
在云服务器上新建 frps.ini:
[common] bind_port = 7000 vhost_http_port = 8080 token = 你的密码
运行:frps -c frps.ini,看到连接成功日志,说明服务端已经就绪。
客户端frpc配置
假设内网机器有一个Web服务监听80端口,需要让你自己的域名 www.example.com 访问它,客户端配置如下:
[common] server_addr = 云服务器公网IP server_port = 7000 token = 你的密码 [web] type = http local_ip = 127.0.0.1 local_port = 80 custom_domains = www.example.com
custom_domains 是关键字段,frp收到访问 www.example.com 的请求,会匹配 custom_domains,然后把流量转发到内网IP的80端口,记得把域名解析到云服务器公网IP上,一条A记录即可。
systemd托管,开机自启
手动启动容易挂,用systemd守护进程:
- 写
/etc/systemd/system/frpc.service文件,ExecStart指向frpc和配置路径。 - 执行
systemctl enable frpc,实现开机自动建立隧道。
这套流程跑通后,你拥有的就是一个完全自主可控的“内网+自定义域名”访问链路。
不想买云服务器?用Cloudflare Tunnel或ngrok
自建frp需要一台云服务器,每年要多花一笔钱,如果你手里已经有一个域名,并且托管在Cloudflare上,可以完全绕过云服务器。
Cloudflare Tunnel让你免费自定义域名
Tunnel的精髓在于:内网主机直接与Cloudflare边缘节点建立出站连接,不需要公网IP,也不需要在路由器上做任何端口映射,操作路径如下:
- 安装cloudflared客户端。
- 执行
cloudflared tunnel login授权域名。 - 执行
cloudflared tunnel create home创建隧道,会生成一个隧道ID。 - 写配置文件
config.yml,把内网服务与域名关联。 - 执行
cloudflared tunnel route dns home www.example.com,自动在DNS中创建CNAME记录指向隧道。 - 运行
cloudflared tunnel run home。
一条命令就能把自定义域名绑定到内网ip上的服务,这套方案对HTTPS证书处理也很优雅,Cloudflare自动颁发并续期,不占用你的精力。
ngrok方案:临时测试方便
ngrok更多用于开发调试,免费版提供随机域名,要绑定自定义域名需要付费。
- 临时暴露本地服务:
ngrok http 80 - 指定自定义域名:
ngrok http 80 --domain=yourdomain.ngrok-free.app
ngrok的免费套餐带宽受限,付费之后才稳定,适合演示或联调,不适合长期生产使用。
frp和Cloudflare Tunnel怎么选?
| 对比项 | frp自建 | Cloudflare Tunnel | ngrok |
|---|---|---|---|
| 公网IP要求 | 需要一台云服务器 | 不需要 | 不需要 |
| 自定义域名 | 完全支持 | 完全支持 | 付费支持 |
| 速度 | 取决于云服务器带宽 | 国际链路波动大 | 依赖ngrok线路 |
| 成本 | 云服务器费用 | 免费 | 付费才稳定 |
| 难度 | 中等 | 低 | 低 |
如果你对延迟敏感,frp自建在国内云服务器上更可控;如果追求零成本、零维护,Cloudflare Tunnel是首选。
群晖NAS与家庭服务器:自定义域名访问内网服务的实战细节
很多人搞这个是为了群晖NAS,出门在外想用域名访问DSM、下载工具、影音库,省去记IP和端口号的烦恼。
在群晖上跑frpc
群晖支持Docker套件,直接跑一个frpc容器:
- 在Docker注册表搜索frpc镜像。
- 挂载你的
frpc.ini配置。 - 将容器端口与本地端口对应,把群晖管理界面5000端口映射成一个子域名,
nas.example.com。
frpc跑起来后,浏览器输入 nas.example.com 就能打开DSM登录页。
用Cloudflare Tunnel保护NAS入口
如果不想把5000端口暴露出去,用Cloudflare Tunnel更安全,在群晖Docker中部署cloudflared,使用token方式启动,外部流量经过Cloudflare边缘层过滤,内网服务不直接暴露在公网。
域名解析到内网ip时,局域网内打不开怎么办
这属于NAT回流问题,路由器不支持loopback,你从局域网内访问自己的公网域名会超时,解决思路很简单:让内网设备访问域名时直接解析到内网IP,而不是公网IP。
- 在群晖控制面板的“HOSTS文件”里加入一行:
168.1.5 nas.example.com。 - 或者在路由器DHCP设置中,指定DNS服务器为内网自建的dnsmasq,把域名解析到
168.1.5。
这样内网访问走局域网,外网访问走frp隧道,各自都不冲突。
自定义域名访问内网ip不生效?从这5个地方排查
域名A记录明明指向了服务器,可就是打不开,多数情况是下面某一个环节出了问题:
- 域名解析:
ping www.example.com看看返回的IP是不是云服务器公网IP,如果用Cloudflare Tunnel,检查CNAME记录状态是否为“已生效”。 - 安全组和防火墙:云厂商安全组、服务器ufw、iptables三层都要放行端口,frp场景下,vhost_http_port是最大嫌疑,漏放就永远无法访问。
- 客户端是否连上:登录frpc机器,看日志是否输出
login to server success,没连上检查token和服务端地址。 - 证书问题:用HTTPS访问时,如果frp没有配置证书,浏览器会报不安全提示,解决方式是在frps端配置
subdomain配合通配符证书,或为域名单独申请Let’s Encrypt证书。 - 本地HOSTS缓存:系统DNS缓存可能残留旧记录,Windows执行
ipconfig /flushdns,macOS执行killall -HUP mDNSResponder后再试。
多数情况下,前三个原因就能覆盖80%的故障。
自定义域名访问服务器内网ip,核心思路是把公网流量“搬”进内网,要么用frp自建一条专属隧道,要么用Cloudflare Tunnel零成本接入,先用一个免费方案跑通,再按需调整,别一上来就追求复杂架构。
关于自定义域名访问服务器内网ip的常见问题
Q:没有云服务器,能用自定义域名访问内网ip吗?
可以,把域名托管到Cloudflare,用Cloudflare Tunnel即可,它不需要任何公网服务器,只要求域名使用Cloudflare DNS解析,Tunnel客户端会主动建立出站连接,Cloudflare边缘节点接收外部请求并转发给内网服务。
Q:frp自定义域名访问内网服务,速度会很慢吗?
速度取决于云服务器带宽和与用户的线路距离,使用同地域的国内云服务器,延迟通常能稳定在20ms以内;如果云服务器在境外,延迟会明显升高,观看高清视频或传输大文件时,还要考虑带宽上限,frp的吞吐量等于云服务器带宽减掉协议开销。
Q:自定义域名访问内网服务,域名备案有影响吗?
只要你的云服务器或网站部署在中国大陆境内,并且使用80/443端口对外提供服务,域名就必须完成ICP备案,使用Cloudflare Tunnel且域名接入香港或境外节点时,可以避开备案限制,但延迟会上升,这是使用自定义域名访问内网服务时常见的合规处理方式。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/685158.html





