如何添加 dnsmasq 并保持 systemd-resolved(18.04 至 20.04)

如何添加 dnsmasq 并保持 systemd-resolved(18.04 至 20.04)

我想使用 dnsmasq 获得快速的 dns 解析并保留默认的 systemd-resolved。

寻找一种优雅的方式来做到这一点

答案1

我想使用 dnsmasq 获得快速的 DNS 解析,并保持默认的 systemd-resolved/NetworkManager 设置不变,以备将来使用。是的,dnsmasq 的大量 DNS 缓存可以提高浏览速度。是的,目标是保留 18.04 的默认特色 DNS 设置

  1. 安装 dnmasq
  2. 配置它(监听地址和dns服务器)
  3. 配置 NetWorkManager 以进行手动 DNS 服务器地址配置
  4. 检查验证

1——使用 sudo

apt-get -y install dnsmasq

2——使用 sudo

tee -a /etc/dnsmasq.conf << ENDdm
interface=lo
bind-interfaces
listen-address=127.0.0.1
# DNS server from OpenDns. Use yours...
server=208.67.222.222
server=208.67.220.220
ENDdm

systemctl restart dnsmasq
systemctl enable dnsmasq

3 - 使用 USER 配置 NetworkManager

# Get NM first active profile name
NetManProfile=$(nmcli -t  connection show --active | cut -f 01 -d ':')
# remove, if exists, current dns servers
nmcli con mod "$NetManProfile" ipv4.dns ""
# set 'manual' dns server
nmcli con mod "$NetManProfile" ipv4.ignore-auto-dns yes
# set dnsmasq as manually set dns server
nmcli con mod "$NetManProfile" ipv4.dns 127.0.0.1
# i also disabled ip6, do what u want
nmcli con mod "$NetManProfile" ipv6.method ignore
# reconnect to take effect
nmcli connection down "$NetManProfile"
nmcli connection up "$NetManProfile"

4 - 检查验证

  • systemd-resolved 默认监听 127.0.0.53
  • dnsmasq 按照 /etc/dnsmasq 中的设置监听 127.0.0.1
  • systemd-resolved 从 NetworkManager 获取 127.0.0.1
netstat -antup
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat       PID/Program name    
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      1036/dnsmasq        
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      766/systemd-resolve
cat /run/systemd/resolve/resolv.conf 
nameserver 127.0.0.1

答案2

我有一个特定的用例,效果很好。我在我的 LAN 路由器(一台 Ubuntu 服务器机器,没有 systemd 解析)上运行 dnsmasq,并让路由器后面的 LAN 机器默认使用普通的 systemd 解析 DNS 解析。这一切都是可能的,而且运行得非常优雅,一些调整至 dnsmasq:

# Make clients that request IPs use this box for DNS
dhcp-option=option:router,192.168.0.1

domain=mydomain.lan
local=/mydomain.lan/
expand-hosts

现在我可以在我的局域网内启动无数个 Ubuntu VM,而再也不用摆弄 DNS - 它就可以正常工作。

需要进行调整是因为 systemd-resolved 不允许您使用“单标签”主机名(其中没有点),这与 dnsmasq 和“经典 DNS”不同。一旦您让 dnsmasq 自动将 LAN 主机名扩展为 FQDN,一切就都好了。顺便说一句,我花了很长时间才弄清楚。这些 systemd 解决的问题1 2帮助我解决了这个问题。

答案3

我尝试寻找一个合理的解决方案并且发现存在不同的方法。

我希望在满足所有业务需求的同时,尽可能地保留发行版布局。以下是我收集并测试过的,可以在干净的 Ubuntu 18.04 和 KDE Neon 版本上运行:

# Install required package and reconfigure service plans (i.e. disablesystemd-resolved, enable dnsmasq
sudo apt-get install dnsmasq
sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved
sudo systemctl enable dnsmasq

# These two lines should work on most environments, but .. :-) - so I kept them commented out for less experienced users
# Just add or change 'dns=dnsmasq' to your NetworkManager.conf to the section [main]
# and yes, the sed expression can be better :-)

#sudo cp /etc/NetworkManager/NetworkManager.conf /etc/NetworkManager/NetworkManager.conf.backup
#sudo bash -c 'cat /etc/NetworkManager/NetworkManager.conf.backup |sed -e "s/^dns=.*//"| sed -e "s/\[main\]/\[main\]\ndns=dnsmasq/" >/etc/NetworkManager/NetworkManager.conf'

# Restart NetworkManager to make the change above applied
sudo systemctl restart NetworkManager

# This removes the systemd resolv.conf link only if it has NetworkManager replacement :-)
ls /var/run/NetworkManager/resolv.conf && sudo rm /etc/resolv.conf

# And add NetworkManager's resolv.conf available for the system resolver
sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf

(请注意,与上述答案的唯一一般区别是 NetworkManager 自动处理 dnsmasq DNS 服务器分配

答案4

Ubuntu 18.10

恕我直言,如果您要运行 dnsmasq,您应该静态分配您的 ip 地址,而不是从 dhcp 获取。这样您就可以完全禁用 systemd-resolved。

  1. sudo apt-get 安装 dnsmasq

  2. sudo systemctl disable systemd-resolved

  3. sudo systemctl stop systemd-resolved

  4. 手动分配您的 IP 地址、网关,并将 IP 地址作为 DNS 分配给您的机器。

  5. 配置 /etc/dnsmasq.conf(真的...RTFM --> man dnsmasq.conf)

  6. sudo systemctl 启用 dnsmasq

  7. 重启
  8. sudo systemctl status dnsmasq

  9. 将 dhcp 服务器上的 dhcp 指向您崭新的 dnsmasq 服务器(..如果 yumpto)

相关内容