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

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

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

google.com
cnn.com
wikipedia.com
news.google.com
gmail.com

理想情况下不会有任何重复。我可能会设置一个 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.

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

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

答案1

您可以编辑配置文件:

vi /etc/dnsmasq.conf

    # /etc/dnsmasq.conf
    log-dhcp
    log-queries
    log-facility=/tmp/dnsmasq.log

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

vi /etc/config/dhcp

    config dnsmasq
        ...
        option logdhcp '1'
        option logqueries '1'
        option logfacility '/tmp/dnsmasq.log'

[请不要编辑这两个文件]

然后重启服务:

/etc/init.d/dnsmasq restart

可以使用以下方法实时解析日志文件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

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

答案2

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

tcpdump -i eth0 -l -vvv dst host 192.168.1.100 and dst port 53 >> dump.log

此文件会快速增长,您的路由器会很快耗尽内存。使用 USB 棒保存日志可避免这种情况。

答案3

另外/etc/config/dhcp

config dnsmasq
    [...]
    option logqueries '1'

并重新启动 dnsmasq。

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

答案4

假设您正在使用路由器,如果您想大量将日志写入内部闪存,这会缩短闪存的使用寿命,并可能使其变坏。

如果您不介意您的日志出现在第三方服务上,我可以建议您使用 OpenDNS 来实现您的目的吗?

从概念上来说

  1. 一旦您的路由器改变 WAN IP,它需要将您的新 IP 通知 OpenDNS。
  2. 您的路由器需要配置为使用 OpenDNS 服务器进行 DNS 查找。
  3. 尽管经过几个小时的延迟,您的网络的 DNS 查询历史记录仍会显示在 OpenDNS 仪表板上。在这里,您可以查看按最高顺序排列的域名查询次数,以及显示每小时查询次数的图表。

细节

引自我写的一个教程

OpenDNS DNS-O-Matic 设置

首先,我们需要在 DNS-O-Matic 和 OpenDNS 上有一个账户来维护日志。

  1. 注册一个 DNS-O-Matic ( www.dnsomatic.com) 帐户。使用不带特殊字符的密码。据我记得,这会导致 OpenWRT 上的配置出现问题。您可以通过增加长度来弥补密码强度的损失。
  2. 使用相同的登录凭据,登录 OpenDNS 仪表板 ( dashboard.opendns.com)
  3. 在“设置”下,为您的网络命名。我称之为“家庭”
  4. 设置:<Your network label>,选择此项
  5. 点击统计和日志
  6. 启用统计和日志
  7. 返回 DNS-O-Matic
  8. 添加服务,OpenDNS
  9. 选择您的家庭网络

OpenWRT 配置

我们需要配置 OpenWRT 以便在公共 IP 地址发生变化时通过 DNS-O-Matic 服务更新 OpenDNS,例如由于路由器重启、WAN 链接断开并重新连接等。

注意:这些步骤适用于 OpenWRT Chaos Calmer。

重要提示:根据路由器上的可用空间,您可能不得不使用非 SSL 选项。

  1. 导航System > Software
  2. 更新列表
  3. 如果您想使用 SSL,请安装ca-certificateswget
  4. 如果您不想或无法使用 SSL,请安装wget-nossl
  5. 安装ddns-scriptsluci-app-ddns
  6. 导航至服务 > 动态 DNS
  7. 添加新条目并调用它dnsomatic
  8. 选择-自定义- DDNS服务提供商
  9. 将自定义更新网址设置为http://[USERNAME]:[PASSWORD]@updates.dnsomatic.com/nic/update?hostname=all.dnsomatic.com&myip=[IP]&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG不替换任何内容
  10. 将主机名设置为dnsomatic.com
  11. 输入你的用户名与密码
  12. 如果您使用 SSL 选项,请选中“使用 HTTP 安全”
  13. URL 的 [IP] 部分将按照‘高级设置’下的‘​​IP 地址源’和‘网络’字段的定义进行替换。
  14. 保存并应用

相关内容