前言
如果你已经用Headscale组了个"私人专属网络",把公司服务器、家里电脑甚至云主机都连成了一个大局域网,接下来八成会遇到这个头疼问题——同一个网址,怎么让连了VPN的设备直接访问内网IP,没连VPN的走公网?
举个真实场景:
你在家连着headscale或在单位,打开test.company.com,浏览器可以直接走内网,速度飞快
但回家用没连VPN的电脑访问同一个网址,得自动跳到公网地址进行访问
传统做法不出意外折腾两套DNS:一套对内,一套对外。就像同时用两个导航APP,一个告诉你公司内部怎么走地下室,另一个指挥外部访客怎么找停车场。不仅维护麻烦,还经常出现"导航打架"——内网测试时不小心连到线上数据库,远程办公死活打不开内部系统。这样大大增加了运维难度,而且还有部分不便于公开的dns记录,本文将采用自建headscale(tailscale的开源实现)的magic dns功能来实现连接vpn直接解析内网dns
配置过程
先决条件
首先需要确保你已经搭建了headscale服务器,如果你还没搭建,可以参考以下文章搭建
名词解释
Magic DNS:Tailscale/Headscale 网络中实现动态域名解析的核心功能,专为自建虚拟网络(如 Headscale 组网)设计。它通过自动分配域名(如
<设备名>.<网络域名>
)和自定义解析规则,允许用户通过易记的域名(而非 IP+端口)访问内网服务,同时支持内外网流量的智能分流。
设备拓扑图
配置文件修改
server config.yaml增加dns部分
使用Headscale自带的magic dns+ extra_records进行配置,这里先贴出headscale的dns
部分配置文件,请按实际添加到您的配置文件中,并重启server
dns:
magic_dns: true
override_local_dns: true
base_domain: bokro.network
nameservers:
global:
- 223.5.5.5
- 114.114.114.114
- 2400:3200::1
- 2400:3200:baba::1
extra_records_path: /var/lib/headscale/extra-records.json # 请按需修改位置
动态解析记录文件设置
上述配置文件中的/var/lib/headscale
目录笔者映射到了headscale/data
下,所以说编辑 headscale/data/extra-records.json文件
[
{
"name": "git.bokro.network",
"type": "A",
"value": "192.168.124.100"
},
{
"name": "dify.bokro.cn",
"type": "A",
"value": "192.168.124.246"
},
]
至此,你可以在任意连上headscale的tailscale客户端上使用设置的域名或headscale生成的magic dns直接访问对应设备,extra-records.json里的dns地址也可以在连上客户端后被正常解析
连通性测试
magic dns解析测试
在家庭客户端上进行ping测试可以看到,magic dns已经生效,按主机名+base_domain设置的域的dns记录可以正常解析
extra-records 自定义解析测试
使用nslookup查看通告的路由,可以看到在tailscale客户端运行的时候走的是内网dns,关闭客户端走的是公网dns
相关链接
headscale搭建:https://bokro.cn/archives/docker-headscale
headscale路由问题解决:https://bokro.cn/archives/headscale-router-not-working