Rexdf

The devil is in the Details.

Dnsmasq的一些问题

| Comments

dnsmasq似乎常常用于简单用途的dns缓存,比如防止解析泄漏、作为dhcp服务器等。可以跑在服务器上,但也许更多的情况是跑在手机上或者路由器上。本文记录几个使用过程中遇到的问题。

配置文件的位置

之前我一般是修改的/etc/dnsmasq.conf,但其实更好的是,在/etc/dnsmasq.d/新建按功能命名的conf文件。

顺序有影响

interface=tap_soft
bind-interfaces
listen-address=127.0.0.1,172.10.1.1
dhcp-range=tap_soft,172.10.1.10,172.10.1.240,6h
dhcp-option=tap_soft,3,172.10.1.1

一定要是这个顺序,交换下前三行顺序,然后就怎么都起不来dnsmasq.service了。

启动时机

一般我都是改动了一下的。按照如下提示修改。

nano /lib/systemd/system/dnsmasq.service
[Unit]
Description=dnsmasq - A lightweight DHCP and caching DNS server
Requires=network.target sys-subsystem-net-devices-tap_soft.device rc.local.service
Wants=sys-subsystem-net-devices-tap_soft.device nss-lookup.target
Before=nss-lookup.target
After=sys-subsystem-net-devices-tap_soft.device network.target
[Service]
Restart=on-failure
RestartSec=20

关于rc.local

一般情况下,似乎只在openwrt之类的路由器上见得比较多,如果有systemd,写个systemd unit最好不过。写个/etc/init.d/脚本也行。

我的/etc/rc.loal内容如下

iptables -t nat -A POSTROUTING -s 172.10.1.0/24 -o eth0 -j SNAT --to-source 8.8.8.8
exit 0

然而每次reboot重启之后,dnsmasq都没有启动,提示的是dnsmasq.service: Job dnsmasq.service/start failed with result 'dependency'.。而登录上去手动执行systemctl start dnsmasq却可以正常启动。用journalctl -xe查看日志,找到如下:

GoogleApp rc.local[770]: Another app is currently holding the xtables lock. Perhaps you want to use the -w option?
GoogleApp systemd[1]: Failed to start /etc/rc.local Compatibility.

机子上其实还装了docker和wireguard,可能是执行rc.local的时候,正好有其他的正在执行iptables。所以解决办法其实也挺简单将/etc/rc.loal最前面加一个sleep 5,然后就好了,反复重启都暂时没遇到dnsmasq起不来的情况了。 像这种用sleep延迟执行时间的做法显然不完美,正确的做法应该是写个systemd,然后写好依赖,然而现在能用,也就此作罢。

与systemd-resolved共存

只需要注意systemd-resolved侦听的是127.0.0.53:53就好了。 参考如下命令笔记

# https://wiki.archlinux.org/index.php?title=Systemd-resolved&redirect=no
ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
nano /etc/systemd/resolved.conf.d/dns_servers.conf
[Resolve]
DNS=1.239.100.100 1.233.43.71
systemd-resolve --status

在openvz下启动

大都启动有问题,但是去掉 interface=tap_softbind-interfaces 貌似可以一用。

Comments