LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

把内网服务都配上域名:Tailscale DNS + Nginx 反代


2026年10月16日 14:42 本文热度 61

之前写过一篇 Tailscale 的推荐:几台机器连成一个内网,随时随地互访,省了不少事。用久了之后,一个新问题冒出来——服务越来越多,访问全靠记 IP 和端口,自己都快记不清哪个是哪个;而且每个服务各占一个端口,到处暴露。

后来我把“域名”这套搬了进来:找一台常开的机器当入口,域名解析和 Nginx 反代都放在它上面。现在访问任何服务,都是一个好记的域名,比如 nas.intra.example.com、git.intra.example.com——不用记 IP,不用记端口。

这篇把配置过程写下来。下面拿我自己那台入口机器举例,就叫它 entry。

1、思路:所有域名都指到“入口机器”

整套东西三块:

(1)一台常开的机器(entry),已经加进 tailnet;

(2)DNS:entry 上跑一个 dnsmasq,把我们自己的域名和它所有子域名,统统解析到 entry 的 tailnet 地址;

(3)Nginx:也在 entry 上,按访问的域名把请求转发给对应的服务。

最后在 Tailscale 后台做一个“指向”:让 intra.example.com 及其子域名的解析请求都发给 entry。这个玩法官方叫 Split DNS——只影响我们自己的域名,其他域名照常走原来的 DNS,互不打扰。

整套链路:域名解析先到 entry,再由 Nginx 按域名转发给各个服务

顺带说下为什么把 DNS 放在 Tailscale 做:解析规则由控制面统一下发,改一处、所有设备生效——不用挨个改 hosts,加新设备也零配置。

2、准备

一台常开的机器,虚拟机、小主机都行,Tailscale 装好、在线。然后装两个软件:

apt install -y nginx dnsmasq

再记一下它的 tailnet 地址,后面几处都要用:

tailscale ip -4 # 输出形如 100.94.0.1

3、第一步:配 dnsmasq,把域名通配指向 entry

新建 /etc/dnsmasq.d/entry.conf:

# 只在 tailnet 网卡上监听,不暴露给其他网络 interface=tailscale0 listen-address=100.94.0.1 bind-interfaces  # intra.example.com 及其所有子域名,都解析到 entry address=/intra.example.com/100.94.0.1  # 这个域不再向公网 DNS 转发 local=/intra.example.com/

关键就是 address 那行:这个域名和它下面所有子域名,统一返回 entry 的地址。加完这一个文件,重启生效:

systemctl restart dnsmasq

4、第二步:在 Tailscale 后台把域名指给 entry

打开管理后台的 DNS 页面:

(1)Nameservers 里点 Add nameserver,选 Custom,填 entry 的 tailnet 地址(100.94.0.1);

(2)打开 “Restrict to search domain”,填 intra.example.com——意思是“只有这个域的查询去问它”;

(3)保存。(后台文案可能略有出入,认准“限制到某个域”这个开关就行。)

验证:在任一台设备上跑 tailscale dns status,能在 Split DNS Routes 里看到一行 intra.example.com -> 100.94.0.1,这步就成了。

5、第三步:Nginx 反代

入口有了、域名通了,剩下就是把请求分发到各个服务。以 NAS 为例,新建 /etc/nginx/conf.d/nas.conf:

server {     listen 100.94.0.1:443 ssl;     server_name nas.intra.example.com;      ssl_certificate     /etc/nginx/ssl/intra.example.com.crt;     ssl_certificate_key /etc/nginx/ssl/intra.example.com.key;      location / {         proxy_pass http://100.94.0.2:5000;         proxy_set_header Host $host;         proxy_set_header Upgrade $http_upgrade;         proxy_set_header Connection "upgrade";     } }

几个点:

(1)listen 只绑 entry 的 tailnet 地址,不开到公网;

(2)证书用一张泛域名证书(*.intra.example.com),自签或者用 Let's Encrypt 的 DNS 方式都行——流量本来就走在加密隧道里,用 HTTPS 主要是让浏览器不报“不安全”;

(3)带上 Upgrade / Connection 两行,是为了支持用 WebSocket 的后台页面。

检查、重载:

nginx -t && systemctl reload nginx

入口上的两段关键配置:dnsmasq(左)与 Nginx(右)

以后上线新服务就是复制一段、改两行——server_name 和 proxy_pass,一两分钟的事。

6、验证

跑起来之后:DNS 路由就位,请求返回 200

三步:解析对(域名指到 entry)、访问通(浏览器打开 https://nas.intra.example.com 秒开)、证书正常(没有警告)。终端里可以快速看一眼:

curl -sI https://nas.intra.example.com | head -n 1 # HTTP/2 200

有个小坑提一下:测 Split DNS 别用 nslookup,它在部分平台上不经过系统解析器,会给出误导结果(官方文档专门说过这事);直接访问看结果最实在。macOS 上想看解析可以用 dscacheutil -q host -a name nas.intra.example.com。

7、几点体会

(1)省心在“后续为零”:DNS 通配解析、后台按域下发,新服务只需要加一段 Nginx,其他什么都不用动;

(2)安全做减法:所有服务从公网看都是“不存在”的——入口只在 tailnet 内可达,dnsmasq 和 Nginx 也都只绑 tailnet 网卡;

(3)证书收拢:一张泛域名证书管所有服务,续期也只续一张;

(4)注意事项:entry 尽量选常开的机器,它要是关机,域名解析会停(不过直接用 IP 访问不受影响);域名用自己域名下的专属子域,别和公网业务混用;另外如果哪台设备之前关过“接受 DNS”,记得开回来,不然 Split DNS 对它不生效。

就这些。整套配置第一次大概半小时,之后加服务一两分钟——机器多的,值得试一下。

​

阅读原文:https://mp.weixin.qq.com/s/SkwAIiB-b5WJwt7N86M2VA


该文章在 2026/10/17 11:53:51 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-2  粤公网安备44030602007207号