dnsmasq 和 ipset

包含网卡/无线网的网络问题和ADSL/校园网/宽带拨号支持及代理/共享等网络使用问题
回复
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

dnsmasq 和 ipset

#1

帖子 leslielg » 2022-08-23 20:22

kubuntu 22.04
/etc/resolv.conf 里有个默认的dns server
nameserver 127.0.0.53
我需要它来解析公司的内网网址

外网网址我需要通过dnsmasq.conf里匹配的dns来解析
所以我希望dns解析流程是这样:
一个域名先送到dnsmasq,通过白名单匹配到就走白名单里指定的dns去解析,解析结果加到ipset里
没有匹配到就走默认的dns

没用过dnsmasq,不知道怎么弄

ipset里的IP list都发往ppp0这个网卡,不在ipset IP list里的发往eth0

求大神指点
头像
astolia
论坛版主
帖子: 6451
注册时间: 2008-09-18 13:11

Re: dnsmasq 和 ipset

#2

帖子 astolia » 2022-08-24 17:36

dnsmasq的配置方法网上随便搜都有一大堆好吧 https://cloud.tencent.com/developer/article/1878676
server=1.1.1.1
server=/intranet.name/10.1.2.3

127.0.0.53这个是systemd的DNSStubListener,可以到/etc/systemd/resolved.conf里把DNS=改成dnsmasq监听的地址。如果用的是network manager,直接在它的设置里写就行。

如果ip list条目不多,直接用ip route add设置一下到ppp0的路由,保证默认的路由是eth0不变。要用ipset的话,要绕一圈,参考 https://zhuanlan.zhihu.com/p/144585950 最后的例子
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

Re: dnsmasq 和 ipset

#3

帖子 leslielg » 2022-08-24 18:22

/etc/resolv.conf在每次连公司vpn后会写入公司的dns server(ip假设不固定)
cat /etc/resolv.conf
domain xxx.com
nameserver 10.19.185.31
nameserver 10.19.180.31
nameserver 127.0.0.53
所以这个没法替换成dnsmasq来完成吧?dnsmasq和systemd的dns只能运行一个么?

“DNS=改成dnsmasq监听的地址”
我运行dnsmasq的cmdline是 sudo dnsmasq --conf-file=dnsmasq_list.conf -p 5353
这个监听的地址是什么?127.0.0.1? 端口呢?

那我能把/etc/resolv.conf改成
nameserver <dnsmasq监听的地址>
nameserver 127.0.0.53

这样是不是就会先走dnsmasq?而且公司vpn连上后加在dnsmasq前面,也没问题
头像
astolia
论坛版主
帖子: 6451
注册时间: 2008-09-18 13:11

Re: dnsmasq 和 ipset

#4

帖子 astolia » 2022-08-24 19:55

leslielg 写了: 2022-08-24 18:22 /etc/resolv.conf在每次连公司vpn后会写入公司的dns server(ip假设不固定)
cat /etc/resolv.conf
domain xxx.com
nameserver 10.19.185.31
nameserver 10.19.180.31
nameserver 127.0.0.53
所以这个没法替换成dnsmasq来完成吧?dnsmasq和systemd的dns只能运行一个么?
可以替换。你只要别让dnsmasq在127.0.0.53上监听就可以两个同时运行
最好的做法是看下你用的vpn软件有没有办法禁止写入resolv.conf

leslielg 写了: 2022-08-24 18:22 “DNS=改成dnsmasq监听的地址”
我运行dnsmasq的cmdline是 sudo dnsmasq --conf-file=dnsmasq_list.conf -p 5353
这个监听的地址是什么?127.0.0.1? 端口呢?
监听地址要看你dnsmasq_list.conf里面是怎么定义的了,或者用ss或netstat查看。另外你运行命令都不去搞明白每个参数的意思?写了-p 5353还来问端口

leslielg 写了: 2022-08-24 18:22 那我能把/etc/resolv.conf改成
nameserver <dnsmasq监听的地址>
nameserver 127.0.0.53

这样是不是就会先走dnsmasq?而且公司vpn连上后加在dnsmasq前面,也没问题
这个可说不准。理论上用libc库里的那套东西的话,是会按顺序查询。但难免有的程序会有其他的做法。
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

Re: dnsmasq 和 ipset

#5

帖子 leslielg » 2022-08-24 23:11

监听地址要看你dnsmasq_list.conf里面是怎么定义的了,或者用ss或netstat查看。另外你运行命令都不去搞明白每个参数的意思?写了-p 5353还来问端口

我当然知道我启动的是5353端口,我在问你 DNS=改成dnsmasq监听的地址 哪里指明端口
resolv.conf里是不能写成127.0.0.1:5353这样的形式
而且我就是本机用啊,ip就应该是127.0.0.1吧,dnsmasq_list.conf里没有写listenaddres类似的内容,只有server/ipset的条目
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

Re: dnsmasq 和 ipset

#6

帖子 leslielg » 2022-08-25 10:04

我用dnsmasq替换了systemd-resolved之后(不指定dnsmasq启动端口,使用默认53)
域名解析确实先走的dnsmasq.conf里的白名单
nslookup xxxx.com
Server: 127.0.0.53
Address: 127.0.0.53#53

Non-authoritative answer:
Name: xxxx.com
Address: 1x.21.16.110

但是公司域名解析都失败了
/etc/resolv.conf在办公室用网线就这一条
nameserver 127.0.0.53

这条路看样子走不通
头像
astolia
论坛版主
帖子: 6451
注册时间: 2008-09-18 13:11

Re: dnsmasq 和 ipset

#7

帖子 astolia » 2022-08-25 22:43

leslielg 写了: 2022-08-25 10:04 这条路看样子走不通
怎么可能不通,这就是一个非常常见的dns分流+路由选路的方案。你觉得走不通,那只是因为你还没有搞明白系统上dns机制
leslielg 写了: 2022-08-25 10:04 我用dnsmasq替换了systemd-resolved之后(不指定dnsmasq启动端口,使用默认53)
域名解析确实先走的dnsmasq.conf里的白名单
nslookup xxxx.com
Server: 127.0.0.53
Address: 127.0.0.53#53

Non-authoritative answer:
Name: xxxx.com
Address: 1x.21.16.110

但是公司域名解析都失败了
/etc/resolv.conf在办公室用网线就这一条
nameserver 127.0.0.53
我在上面说过了,127.0.0.53这个是systemd-resolved搞的stub dns listener,只是起到一个中介作用,并不是真正负责域名解析的dns服务器ip。背后实际的dns服务器ip可以用resolvectl来看。
另外,一般桌面系统上会安装NetworkManager,kubuntu 22.04应该也不例外。实际的dns服务器ip是按NetworkManager里的配置来的。/etc/systemd/resolved.conf里面的应该没有对具体网络接口生效,这也会在resolvectl的输出中体现。
你也可以用wireshark之类的网络分析工具看看dns请求发给了哪些ip,这样比较容易发现问题出在哪里
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

Re: dnsmasq 和 ipset

#8

帖子 leslielg » 2022-08-26 9:41

回复7楼的发言:
我需要搞明白“系统上dns机制”吗,还是只需要知道它们的使用方法。你能说下按我这个需求,方案是什么?

我在6楼写的已经用dnsmasq替换了systemd-resolved,地址127.0.0.53是dnsmasq的server,为什么你说这个仍然是systemd-resolved?
我系统里安装有networkmanager,但是dns没有使用networkmanager来管理。你是说systemd的dns做不到这个功能要换networkmanager?
头像
astolia
论坛版主
帖子: 6451
注册时间: 2008-09-18 13:11

Re: dnsmasq 和 ipset

#9

帖子 astolia » 2022-08-29 17:12

leslielg 写了: 2022-08-26 9:41 回复7楼的发言:
我需要搞明白“系统上dns机制”吗,还是只需要知道它们的使用方法。你能说下按我这个需求,方案是什么?
你可以不理解机制,但这样就就很难制定出一个完善的方案,出错了也不知道具体的原因,只能得出“这条路走不通”这样的结论。
如果是我自己来弄,我会进行如下操作。
1、建立一个本机dns服务器(可以用dnsmasq、unbound、bind9等)来统一处理本机所有对外的dns请求。即/etc/resolv.conf里面只留下本机dns服务器的监听地址,或者如果需要保留systemd-resolved的stub dns server,就把它的后端设成本机dns服务器。这样做的好处是避免某些软件采用不同的dns查询算法导致访问的域名泄露给错误的dns服务器,比如向/etc/resolv.conf里列出的所有监听地址都发送请求然后取回应最快的一个。
2、本机dns服务器里面,根据域名分流转发到不同的外部公网dns服务器。这个是很基础的功能,各个dns服务器软件都有,不多说了
3、控制dns请求的网络数据包发送到正确的网络接口,这个靠修改本机路由表实现。由于企业内网所用的网段是固定的范围,一般只需要在路由表中添加针对特定网段的路由规则即可,都用不着ipset这东西。还有在你的例子里,由于vpn软件建立连接后肯定也会修改路由表,所以还要做相应的处理,比如需要删除vpn添加的默认网关。
另外如果需要解析的公司内网域名非常有限且和ip的对应关系固定,那么1和2步的操作可以换成直接将对应关系写进/etc/hosts。
leslielg 写了: 2022-08-26 9:41 我在6楼写的已经用dnsmasq替换了systemd-resolved,地址127.0.0.53是dnsmasq的server,为什么你说这个仍然是systemd-resolved?
因为你并没有说清楚你做了哪些操作来实现“替换“。一般人会直接将/etc/resolv.conf里的地址改成dnsmasq的默认监听地址127.0.0.1,不会让dnsmasq去监听127.0.0.53,因为这会多一个关掉systemd-resolved的stub dns server的步骤。你说的“但是公司域名解析都失败了”也很像是将内网域名交给了公网dns服务器解析的结果
leslielg 写了: 2022-08-26 9:41 我系统里安装有networkmanager,但是dns没有使用networkmanager来管理。
如果你之前没有对dns相关的进行过配置,那么systemd-resolved会按照networkmanager的dns配置来处理。因为具体的网络接口应该是归networkmanager来管的。
leslielg 写了: 2022-08-26 9:41 你是说systemd的dns做不到这个功能要换networkmanager?
我没有这么说,systemd-resolved和networkmanager两者的定位本身是重复的。在你的这个需求里面,两者是可以互换的
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

Re: dnsmasq 和 ipset

#10

帖子 leslielg » 2022-08-29 18:55

"本机dns服务器里面,根据域名分流转发到不同的外部公网dns服务器。这个是很基础的功能,各个dns服务器软件都有,不多说了"

这里就有问题,你需要将“外部公网dns服务器” hardcode到dnsmasq的conf里,这个在服务器/路由器可以这么做。但是个人电脑特别是笔记本不行。
笔记本连到不同的网络/wifi,会由dhcp分配一个dns server,这个是我要沿用的,而没法hardcode的。比如我在家里dhcp后看到的默认dns server是192.168.1.1,这个是我的路由器的IP。同样的笔记本在公司分配的dns server不一样。不能hardcode公网dns服务器去替代这个。

需求是白名单的域名走我指定的dns IP。其它的走原来默认的路由,它背后是networkmanager在管理或者不是,没有必要就不去修改。
头像
astolia
论坛版主
帖子: 6451
注册时间: 2008-09-18 13:11

Re: dnsmasq 和 ipset

#11

帖子 astolia » 2022-08-29 22:32

leslielg 写了: 2022-08-29 18:55 这里就有问题,你需要将“外部公网dns服务器” hardcode到dnsmasq的conf里,这个在服务器/路由器可以这么做。但是个人电脑特别是笔记本不行。
笔记本连到不同的网络/wifi,会由dhcp分配一个dns server,这个是我要沿用的,而没法hardcode的。比如我在家里dhcp后看到的默认dns server是192.168.1.1,这个是我的路由器的IP。同样的笔记本在公司分配的dns server不一样。不能hardcode公网dns服务器去替代这个。
算了,我来完整说说我是怎么分析的。
当我在公司,不需要进行额外的设置,直接用默认的dhcp分配下来的路由、dns就好
当我在家里不需要连到公司时,也不需要额外的设置,直接用默认的dhcp分配下来的路由、dns就好
当我在家里需要连到公司时,需要运行vpn,还需要修改dns,可能还需要修改路由表

那么我的方案就很简单了。
1、/etc/resolv.conf里面的nameserver就保持原来systemd的127.0.0.53
2、dnsmasq的配置设成监听在127.0.0.1,设置成公司内网域名转发给公司内网中的真实dns服务器10.x.x.x,其他转发给192.168.1.1
3、平常不运行dnsmasq,所有dns请求走127.0.0.53,127.0.0.53又转发给从dhcp搞来的dns服务器地址
4、只有要从家里连到公司时,才运行dnsmasq,并修改/etc/resolv.conf把dns服务器地址设成127.0.0.1,可能还需要修改一下路由表

把第4步操作写成个程序,简单的shell脚本就好,把连vpn的操作一起放进去。到时候运行一下,什么都给你搞好,退出时再恢复原有的设置。

你如果还理解不了那是你知识所限,我也懒得再说了。
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

Re: dnsmasq 和 ipset

#12

帖子 leslielg » 2022-08-30 8:51

你没有明白 *不能hardcode*
dnsmasq的配置设成监听在127.0.0.1,设置成公司内网域名转发给公司内网中的真实dns服务器10.x.x.x,其他转发给192.168.1.1

这两个IP是我举的例子。目的是说明dnsmasq conf里,不能把它们hardcode进去,因为这个IP是动态的,公司的dns server也没说是静态的

除非这一条后半段能改成这样,但是要求systemd-resolved和dnsmasq同时运行:
dnsmasq的配置设成监听在127.0.0.1,白名单外的转发给127.0.0.53
或者dnsmasq能完成:
所有dns请求走127.0.0.53(dnsmasq),127.0.0.53又转发给从dhcp搞来的dns服务器地址
头像
astolia
论坛版主
帖子: 6451
注册时间: 2008-09-18 13:11

Re: dnsmasq 和 ipset

#13

帖子 astolia » 2022-09-03 14:09

来来来,我们先重温一下一段对话
leslielg 写了: 2022-08-26 9:41 我需要搞明白“系统上dns机制”吗,还是只需要知道它们的使用方法。
astolia 写了: 2022-08-29 17:12 你可以不理解机制,但这样就就很难制定出一个完善的方案,出错了也不知道具体的原因,只能得出“这条路走不通”这样的结论。
知道我为什么要让你重温吗?因为你这么一段
leslielg 写了: 2022-08-30 8:51 除非这一条后半段能改成这样,但是要求systemd-resolved和dnsmasq同时运行:
dnsmasq的配置设成监听在127.0.0.1,白名单外的转发给127.0.0.53
就是你没搞懂systemd-resolved、dnsmasq、networkmanager、/etc/resolv.conf、从dhcp获取的dns地址之间的关系。否则的话,你就会知道把我上面方案已经这么做了。如果你觉得不是,想想这句话
leslielg 写了: 2022-08-30 8:51 这两个IP是我举的例子
---------------------------
leslielg 写了: 2022-08-30 8:51 你没有明白 *不能hardcode*
dnsmasq的配置设成监听在127.0.0.1,设置成公司内网域名转发给公司内网中的真实dns服务器10.x.x.x,其他转发给192.168.1.1

这两个IP是我举的例子。目的是说明dnsmasq conf里,不能把它们hardcode进去,因为这个IP是动态的,公司的dns server也没说是静态的
我看你的脑子才被一些先入为主的错误观念hardcode了。就算你们公司的SB网管没把dns服务器地址固定下来,那又怎么样呢?dnsmasq的配置不能改吗?用sed、grep之类的工具直接从网络状态中提取出来ip,改写dnsmasq的配置不就完了?你是不是不会shell编程,才完全没往这方向想?用python之类的脚本语言甚至C语言也一样可以做啊,只是代码是否简便而已
leslielg
帖子: 124
注册时间: 2008-08-30 10:52

Re: dnsmasq 和 ipset

#14

帖子 leslielg » 2022-09-29 10:21

我们是跨过大公司,跟你认识里的“网管”就要固定dns不一样。我建议你最好就事论事,要不然其实只是在展露你自己。
我提的问题是已有工具的配置和搭配能不能实现我的要求。要不要编程改dnsmasq是前面问题有确定答案后再怎么选择的问题。

astolia 写了: 2022-09-03 14:09 来来来,我们先重温一下一段对话
leslielg 写了: 2022-08-26 9:41 我需要搞明白“系统上dns机制”吗,还是只需要知道它们的使用方法。
astolia 写了: 2022-08-29 17:12 你可以不理解机制,但这样就就很难制定出一个完善的方案,出错了也不知道具体的原因,只能得出“这条路走不通”这样的结论。
知道我为什么要让你重温吗?因为你这么一段
leslielg 写了: 2022-08-30 8:51 除非这一条后半段能改成这样,但是要求systemd-resolved和dnsmasq同时运行:
dnsmasq的配置设成监听在127.0.0.1,白名单外的转发给127.0.0.53
就是你没搞懂systemd-resolved、dnsmasq、networkmanager、/etc/resolv.conf、从dhcp获取的dns地址之间的关系。否则的话,你就会知道把我上面方案已经这么做了。如果你觉得不是,想想这句话
leslielg 写了: 2022-08-30 8:51 这两个IP是我举的例子
---------------------------
leslielg 写了: 2022-08-30 8:51 你没有明白 *不能hardcode*
dnsmasq的配置设成监听在127.0.0.1,设置成公司内网域名转发给公司内网中的真实dns服务器10.x.x.x,其他转发给192.168.1.1

这两个IP是我举的例子。目的是说明dnsmasq conf里,不能把它们hardcode进去,因为这个IP是动态的,公司的dns server也没说是静态的
我看你的脑子才被一些先入为主的错误观念hardcode了。就算你们公司的SB网管没把dns服务器地址固定下来,那又怎么样呢?dnsmasq的配置不能改吗?用sed、grep之类的工具直接从网络状态中提取出来ip,改写dnsmasq的配置不就完了?你是不是不会shell编程,才完全没往这方向想?用python之类的脚本语言甚至C语言也一样可以做啊,只是代码是否简便而已
头像
astolia
论坛版主
帖子: 6451
注册时间: 2008-09-18 13:11

Re: dnsmasq 和 ipset

#15

帖子 astolia » 2022-09-29 22:12

leslielg 写了: 2022-09-29 10:21 我们是跨过大公司,跟你认识里的“网管”就要固定dns不一样。我建议你最好就事论事,要不然其实只是在展露你自己。
真是笑死人,以为扯个“跨过大公司”的虎皮出来想吓唬谁啊?即使是世界500强的企业,从上到下照样一堆不配坐在那个位置上的人。
leslielg 写了: 2022-09-29 10:21 我提的问题是已有工具的配置和搭配能不能实现我的要求。要不要编程改dnsmasq是前面问题有确定答案后再怎么选择的问题。
就事论事,能实现,我上面已经给出了方案。同样就事论事,你很可能无法实现,因为你也在上面充分展露了你自己。
回复