如何记录通过 OpenWRT 路由器发出的所有 DNS 请求?

exv*_*nce 15 networking dns openwrt dnsmasq

我有一个运行 dnsmasq 的 OpenWRT 路由器。我想创建一个文件,其中包含通过路由器请求的每个域。我的输出应该是这样的:

google.com
cnn.com
wikipedia.com
news.google.com
gmail.com
Run Code Online (Sandbox Code Playgroud)

理想情况下不会有任何重复。我可能可以设置一个 cron 作业,在必要时删除重复项。现在我正试图找出一种记录它们的好方法。我查看了 dnsmasq 的选项。我找到了以下选项:

 -q, --log-queries                       Log DNS queries.
 -8, --log-facility=<facilty>|<file>     Log to this syslog facility or file. (defaults to DAEMON)
--log-dhcp                          Extra logging for DHCP.
--log-async[=<integer>]             Enable async. logging; optionally set queue length.
Run Code Online (Sandbox Code Playgroud)

在 OpenWRT 上,这些设置似乎隐藏在 /etc/init.d/dnsmasq 文件中。我尝试设置它们但没有任何运气。:-( 有没有更简单的方法来实现我的目标?

啊! 通过一点技巧,我能够将其写入日志文件。但是,它没有创建此列表所需的数据。也许 dnsmasq 不能做我想做的事?

kev*_*kev 20

您可以编辑配置文件:

vi /etc/dnsmasq.conf

    # /etc/dnsmasq.conf
    log-dhcp
    log-queries
    log-facility=/tmp/dnsmasq.log
Run Code Online (Sandbox Code Playgroud)

或者编辑另一个配置文件:

vi /etc/config/dhcp

    config dnsmasq
        ...
        option logdhcp '1'
        option logqueries '1'
        option logfacility '/tmp/dnsmasq.log'
Run Code Online (Sandbox Code Playgroud)

然后重启服务:

/etc/init.d/dnsmasq restart
Run Code Online (Sandbox Code Playgroud)

日志文件可以实时解析tail+awk

$ vi dnsmasq.awk

    #!/usr/bin/awk -f

    BEGIN {
      OFS = ",";
    }

    $5 == "query[A]" {
      time = mktime( \
        sprintf("%04d %02d %02d %s\n", \
          strftime("%Y", systime()), \
          (match("JanFebMarAprMayJunJulAugSepOctNovDec",$1)+2)/3, \
          $2, \
          gensub(":", " ", "g", $3) \
        ) \
      );
      query = $6;
      host = $8;
      print time, host, query;
    }

$ chmod +x dnsmasq.awk

$ tail -f /tmp/dnsmasq.log | ./dnsmasq.awk

1468999090,192.168.1.100,google.com
1468999092,192.168.1.101,youtube.com
1468999095,192.168.1.102,facebook.com
1468999097,192.168.1.100,qa.sockets.stackexchange.com
Run Code Online (Sandbox Code Playgroud)

更高级的方法是通过 filebeat 将日志实时发送到 ELK。

  • 非常翔实的答案。谢谢你。:) 给未来读者的提示:请不要同时编辑 dnsmasq 和 dhcp 配置。如果您尝试应用新设置并且 dnsmasq 无法启动,您可能会在系统日志中收到错误“在行...处非法重复关键字”。这是因为 dnsmasq 会自动从 /etc/config/dhcp 生成配置文件,并且会重复使用 `log-facility=` 选项。此外,如果您不指定 log-facility,日志将写入系统日志。 (2认同)

Joe*_*Joe 5

您可以安装 tcpdump 并嗅探到端口 53 的数据包

tcpdump -i eth0 -l -vvv dst host 192.168.1.100 and dst port 53 >> dump.log
Run Code Online (Sandbox Code Playgroud)

这个文件会增长得非常快,你的路由器会很快耗尽内存。使用 U 盘保存日志可以防止这种情况发生。


小智 2

添加/etc/config/dhcp

config dnsmasq
    [...]
    option logqueries '1'
Run Code Online (Sandbox Code Playgroud)

并重新启动 dnsmasq。

日志将写入系统日志,可logread -f在终端中或通过 LuCi 查看。