使用headscale分别解析内外网dns

前言 如果你已经用Headscale组了个"私人专属网络",把公司服务器、家里电脑甚至云主机都连成了一个大局域网,接下来八成会遇到这个头疼问题——同一个网址,怎么让连了VPN的设备直接访问内网IP,没连VPN的走公网? 举个真实场景: 你在家连着headscale或在单位,打开test.compan

前言

如果你已经用Headscale组了个"私人专属网络",把公司服务器、家里电脑甚至云主机都连成了一个大局域网,接下来八成会遇到这个头疼问题——同一个网址,怎么让连了VPN的设备直接访问内网IP,没连VPN的走公网?

举个真实场景:

  • 你在家连着headscale或在单位,打开test.company.com,浏览器可以直接走内网,速度飞快

  • 但回家用没连VPN的电脑访问同一个网址,得自动跳到公网地址进行访问

传统做法不出意外折腾两套DNS:一套对内,一套对外。就像同时用两个导航APP,一个告诉你公司内部怎么走地下室,另一个指挥外部访客怎么找停车场。不仅维护麻烦,还经常出现"导航打架"——内网测试时不小心连到线上数据库,远程办公死活打不开内部系统。这样大大增加了运维难度,而且还有部分不便于公开的dns记录,本文将采用自建headscale(tailscale的开源实现)的magic dns功能来实现连接vpn直接解析内网dns

配置过程

先决条件

首先需要确保你已经搭建了headscale服务器,如果你还没搭建,可以参考以下文章搭建

https://bokro.cn/archives/docker-headscale

名词解释

  • Magic DNS:Tailscale/Headscale 网络中实现动态域名解析的核心功能,专为自建虚拟网络(如 Headscale 组网)设计。它通过自动分配域名(如 <设备名>.<网络域名>)和自定义解析规则,允许用户通过易记的域名(而非 IP+端口)访问内网服务,同时支持内外网流量的智能分流

设备拓扑图

graph TD subgraph 家庭网络[家庭网络] Family_Client[[家庭tailscale客户端]] end subgraph 公网服务器[公网服务器IP:1.1.1.1] Public_Nginx[[公网Nginx]] Headscale_Server[[Headscale服务端]] end subgraph 单位内网[单位内网] Office_Nginx[[单位Nginx]] Office_Client[[单位tailscale客户端]] end Office_Client -->|注册/认证| Headscale_Server Family_Client -->|注册/认证| Headscale_Server Family_Client <-->|P2P 隧道| Office_Client Office_Nginx -->|对外服务| Public_Nginx

配置文件修改

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

Comment