手把手教你实现一个支持无限层级泛域名解析的 DNS 服务器 Xip

Posted by Mike on 2021-05-17

什么是

xip.io 是一个提供通配符 DNS 解析的魔法域名。你可以无需配置,将自定义的任何域名解析到指定的 IP 地址。假设你的 IP 地址是 10.0.0.1,你只需使用 前缀域名+IP地址+xip.io 即可完成相应自定义域名解析。

1
2
3
4
10.0.0.1.xip.io         # 解析到 10.0.0.1
www.10.0.0.2.xip.io # www 子域解析到 10.0.0.2
mysite.10.0.0.3.xip.io # mysite 子域解析到 10.0.0.3
foo.bar.10.0.0.4.xip.io # foo.bar 子域解析到 10.0.0.4

xip.io 使用上已经很简单了,如果你想使用自己的域名来实现一个类似 xip.io 同样功能也是很容易的。你只需部署一个 xip.name 的开源软件就可以简单实现了!

什么是

xip.name 是受 xip.io 启发,使用 Golang 开发的一个支持通配符的 DNS 服务器。

项目地址:https://github.com/peterhellberg/xip.name

xip.name 也同样提供了一个和 xip.io 类似的公共 DNS 服务,它的使用上和 xip.io 无异。你同样可以直接使用:

1
2
3
4
10.0.0.1.xip.name         # 解析到 10.0.0.1
www.10.0.0.2.xip.name # www 子域解析到 10.0.0.2
mysite.10.0.0.3.xip.name # mysite 子域解析到 10.0.0.3
foo.bar.10.0.0.4.xip.name # foo.bar 子域解析到 10.0.0.4

部署教程

前置条件:

  • 一台有公网 IP 并开放 53 端口的服务器
  • 一个有管理权限的域名
  • 一个提供支持通配 NS 记录的 DNS 解析服务的帐号

安装

xip.name 使用 Go 语言开发,通常情况下,安装是很容易的,你只需直接下载并放到相应路径即可使用它。

由于 xip.name 项目没有直接提供二进制包下载,所以这里我们使用 go 命令进行源码下载后,进行编译安装。

1
2
3
4
5
6
# 安装 GO 环境
$ yum install -y golang
# 获取、编译代码
$ go get github.com/peterhellberg/xip.name
# 将编译好的二进制文件放到系统 PATH 路径下
$ cp go/bin/xip.name /usr/local/bin/xip

安装完成后,我们给 xip.name 增加一个 Systemd 配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ cat << EOF > /usr/lib/systemd/system/xip.service
[Unit]
Description=xip
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/xip -ip 0.0.0.0 -fqdn ywzm.org.
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

注: ExecStart 配置的启动命令的 -fqdn 是用来定义 DNS 服务器要支持的域名,这里设置的是 ywzm.org.。你可以根据实际情况进行调整。

一些常规的 xip 服务管理操作

1
2
3
4
5
6
7
8
# 启动 xip
$ systemctl start xip
# 关闭 xip
$ systemctl stop xip
# 重启 xip
$ systemctl restart xip
# 配置开机自启 xip
$ systemctl enable xip

配置 DNS

要成功实现 xip.name 提供的服务,只部署相关程序是不够的。还需要配置你自定义域名的 NS 解析记录,目前国内支持通配 NS 记录的免费 DNS 服务商不多,这里我使用的是阿里云 DNS 解析。

配置其实也很简单,主要需要配置一个通配的 NS 记录和一个指向 DNS 服务器的 A 记录。

以我的域名 ywzm.org 为例,假设部署 xip.name 服务器的公网 IP 是 11.22.33.44。DNS 就应该增加以下两条解析记录:

1
*  ns ns1.ywzm.org

  • 增加一条 A 记录解析到 11.22.33.44
1
ns1.ywzm.org  A  11.22.33.44

以上配置好就完成了,看下最终效果吧!

最后,我们来验证一下吧:

从上面的结果可以看到,我们并未对域名进行任何配置就自动实现了相应解析,是不是很给力呢?有兴趣的同学赶紧用起来吧!