dnsmasq:无法创建 IPset 控制套接字:权限被拒绝

dnsmasq: failed to create IPset control socket: Permission denied

当我在 CentOS 7 中启动 dnsmasq 服务时,我得到这样的状态:

这是因为我在/etc/dnsmasq.d/wblist.conf

中添加了一个wblist.conf

cat wblist.conf

# for router itself
server=/google.com.tw/192.168.8.20#53
ipset=/google.com.tw/gfwlist

ipset -L gfwlist

Name: gfwlist
Type: hash:net
Revision: 3
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16784
References: 0
Members:

但是如果我评论ipset行,服务可以成功重启。

我不知道为什么。我用了很久dnsmasq/ipset,突然遇到这个问题

有人遇到过这种情况吗?

我发现这篇文章 SELinux 阻止 ipset 创建 netlink 套接字,我禁用了 SELinux,然后它起作用了。不知道为什么。

不建议禁用 SElinux。

您可以通过创建并安装 SELinux 策略模块来解决此问题。

首先你需要创建一个名为my-dnsmasq.tetype enforcement规则文件,内容如下:

module my-dnsmasq 1.0;

require {
        type dnsmasq_t;
        class netlink_socket { bind create write };
}

#============= dnsmasq_t ==============
allow dnsmasq_t self:netlink_socket { bind create write };

现在可以编译成策略模块包文件了:

checkmodule -M -m -o my-dnsmasq.mod my-dnsmasq.te
semodule_package -o my-dnsmasq.pp -m my-dnsmasq.mod

获得策略模块包文件my-dnsmasq.pp后,安装它:

sudo semodule -i my-dnsmasq.pp

最后,重启dnsmasq.service:

sudo systemctl restart dnsmasq

并进行如下测试:

nslookup google.com.tw
ipset list gfwlist

如果一切正常,你会看到ipset中添加了一个ip。