前言

今天想给家里面搭一个内网系统,但是如果其他主机来访问一定要加内网ip,感觉会很麻烦,所以就想用树莓派搭建一个DNS服务器,于是乎就有了这篇博客~。

正文

1. 内网之间如何设置DNS

其实这里有两种方法

1.1 设置每台主机的/etc/hosts文件

可以在内网中的每台主机上修改/etc/hosts文件,添加一个条目,将<所需要访问的内网IP>映射到home,这样就可以通过http://home:3000访问应用了。

在每台主机上执行以下操作:

  1. 打开/etc/hosts文件
  2. 添加 <所需要访问的内网IP> home
  3. 保存并且退出

完成这些步骤后,在内网中的其他机器上,你就可以通过http://home:3000访问运行在<所需要访问的内网IP>上的应用了。

1.2 设置本地DNS服务器

或者如果不在每台主机上主动修改/etc/hosts文件,就可以设置一个本地的DNS服务器(如dnsmasq)来处理内网的域名解析。

在DNS服务器上执行以下操作:

  1. 安装dnsmasqsudo apt-get install dnsmasq
  2. 配置dnsmasq,编辑/etc/dnsmasq.conf文件,添加条目:address=/home/<所需要访问的内网IP>
  3. 重启dnsmasq服务:sudo systemctl restart dnsmasq

配置好本地DNS服务器后,就可以将内网的其他主机的DNS设置指向这个DNS服务器了,这样其他主机就可以通过http://home:3000访问

2. 测试

在其他主机上,通过ping或者nslookup命令来验证DNS配置来看是否生效ping home或者nslookup home
如果DNS配置正确,就能看见home被解析为<所需要访问的内网IP>

或者在DNS服务器查询sudo lsof -i :53,如果出现类似的输出,那么就说明在DNS服务器上是成功了

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dnsmasq  1234 nobody   4u  IPv4  12345      0t0  UDP *:53
dnsmasq  1234 nobody   5u  IPv4  12346      0t0  TCP *:53 (LISTEN)

3. 问题

3.1 Address already in use

如果出现了dnsmasq: failed to create listening socket for port 53: Address already in use这样的问题,有可能是systemd-resolved占用了默认的53端口,可以检查systemd-resolved的服务状态来看是否有占用systemctl status systemd-resolved

如果systemd-resolved正在运行并且占用了53端口,如果我们不需要,那我们就可以禁用它,通过以下命令:

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

然后再尝试系统dnsmasq,通过命令sudo systemctl start dnsmasq,这样一般就成功了。喵~!

3.2 VPN

有时候即使你配置正确了,通过ipconfig或者ifconfig里面找到了你的<所需要访问的内网IP>,那么有可能是因为你的VPN,为了安全起见,直接覆盖了你的DNS配置文件。

这个时候,只有:

  1. 配置VPN
  2. 关闭VPN

总结

学习一下如何用Ubuntu 搭建一个DNS服务器~!

参考

[1] 自己
[2] ChatGPT

Q.E.D.


立志做一个有趣的碳水化合物