简易使用局域网Local域名

习惯了在公网服务器上用多个子域名访问不同应用,在局域网环境中我们也常常希望这么做。

对于自带DNS服务器并维护了.lan域名的路由器来说,一切非常简单,不需要额外配置就能直接使用主机名.lan解析其他主机地址。当然,也仅限于此,增加子域名解析或泛域名解析还需要额外配置。

在局域网里增设一个DNS服务器,直接解析内网主机的地址,或许这是最为强大的方法,但也或许是最麻烦的方法。

Windows的NetBIOS,以及Linux的Avahi,是操作系统附带的主机地址广播方案,在我看来似乎是更加灵活的选择。

且Windows 10自较为近期的版本开始,就自带解析 .local mDNS的组件,Windows和Linux之间的地址广播方案实现了互通。

接下来就以在Linux服务器上配置.local域名作为例子。

基本组件

在Debian系统上直接安装:

1
sudo apt install avahi-daemon avahi-utils

现在起,<主机名>.local将指向这台主机。

添加额外域名

在一些服务,尤其是HTTP服务中,通过不同域名指向不同服务是非常便利的方法,如blog.<主机名>.local指向博客,nextcloud.<主机名>.local指向Nextcloud实例等等。

甚至,有些HTTP应用必须运行在/下,无法通过绑定子目录方式访问,此时必须为其分配独立的域名/子域名。

Avahi的确可以添加泛域名或子域名记录,但大部分操作系统并不能正确解析mDNS的泛域名或子域名记录,或是依赖客户端系统的复杂配置,并不简单易行。

但是,在局域网环境中,域名空间常常充足,退而求其次,我们完全可以为同一台主机分配多个.local记录,只要不与网内其他主机冲突即可。

avahi-utils软件包提供了avahi-publish工具,该工具可以广播用户指定的mDNS记录到内网。例如:

1
avahi-publish -a -R another.local 192.168.1.123

这可以将another.local域名指向IP地址192.168.1.123-R选项代表不要广播反向(IP到主机名)解析记录,由于IP地址到主机名的唯一性,这一选项应当被保留。

也可以将其编写成一个Systemd服务单元,例如,可以将以下内容填入/etc/systemd/system/avahi-alias@.service

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Publish %I as alias for %H.local via mdns
Requires=avahi-daemon.service
After=avahi-daemon.service

[Service]
Type=simple
ExecStart=/bin/bash -c "/usr/bin/avahi-publish -a -R %I $(avahi-resolve -4 -n %H.local > /dev/null && ip route get 1 | awk '{print $7;exit}')"
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

之后执行:

1
2
sudo systemctl daemon-reload
sudo systemctl enable --now avahi-alias@another.local

即可对外发布mDNS记录。