目前,我有一个应用程序/服务/小部件/插件/cronjob 等,定期访问互联网。我可以详细介绍我的具体问题,但我更希望得到一个答案,让我自己找到问题所在,并在此过程中更多地了解 Ubuntu。
我dnstop
目前正在使用它来显示网络上发出的所有 DNS 请求。目前,为了便于讨论,有一个请求weather.noaa.gov
以 15 分钟为周期发出。它可能是一个天气小工具,尽管我检查了我的进程,没有发现任何异常,并且该请求来自我的计算机。
那么问题是,我如何确定哪个进程正在访问weather.noaa.gov
?
我不想通过关闭每个服务/插件/应用程序来解决这个问题。我想找到一种方法来确定哪个进程正在发出该 DNS 请求。
如果我有一个像样的“应用程序防火墙”,那么这个请求就不会被发出。但这是一个“马已跑”的场景,我想找到发出该 DNS 请求的“流氓”进程。
答案1
如果您不介意运行一段时间的无限循环,您可以连续运行 netstat 并过滤程序所连接的计算机的 IP 地址的输出。我建议使用 IP 地址而不是域名,因为它更快,减少了每次 netstat 调用所花费的时间,从而增加了实际捕获进程的机会。如果您认为该进程不属于当前登录的用户,则应该以 root 身份运行 netstat 命令。因此,首先使用 nslookup 找出域的 IP:
nslookup weather.noaa.gov
对于我来说,目前给出的是:193.170.140.70 和 193.170.140.80。现在您可以设置一个无限循环的 netstats。您可以使用 grep 过滤输出(并丢弃 STDERR)。
while [ true ] ; do netstat -tunp 2>/dev/null | grep -e 193.170.140.70 -e 193.170.140.80 ; done
当然,编辑上述示例中的 IP 地址。此示例探测 TCP 和 UDP (-tu) 连接,不执行 DNS 解析 (-n) 并列出进程 (-p)。如果您认为有足够的时间进行 DNS 解析,只需省略 netstat 的 -n 选项,并将域替换为 grep 的 IP。您只需按 CTRL+c 即可停止无限循环
希望这能有所帮助,安德烈亚斯
附言:我知道,这不是理想的、有效的或干净的方法,但对于一次性搜索来说,这应该足够了。
答案2
您还可以通过 /etc/hosts 添加要连接的 FQDN 来“中断”应用程序。为其提供一些不可路由的 IP,如 10.1.2.3(或 127.0.0.1),然后查看中断的原因。