如何过滤来自 Linux 中特定进程的 DNS 数据包

如何过滤来自 Linux 中特定进程的 DNS 数据包

我的 Linux 机器上有一个可疑程序,我想专门过滤 DNS 数据包请求和响应。

我知道有wireshark,但我更喜欢命令行。我可以在其中主要过滤与 dns 相关的传出和传入数据包。

我该如何解决这个问题?

答案1

您是否尝试过仅使用tcpdump -i <interface name> -vv port 53 它来捕获来自服务器的所有 dns,这取决于您正在运行的内容,这可能会起作用。

你能设置java程序使用的接口或IP吗?如果可以的话,您可以在 tcpdump 上使用过滤器来限制仅该 IP。

如果您需要向接口添加另一个 IP,ip add 192.168.55.55/32 dev eth0请替换 IP 和开发名称以匹配您的设置。

如果可以设置接口,还可以通过以下方式创建私有vlan:

ip link add link eth0 <name of link> type vlan id 10更改 ID 和接口以匹配您的设置。如果您需要程序的外部访问,sysctl net.ipv4.conf.eth0.forwarding这将在您的接口上启用当前会话的转发,如果您将链接的 IP 设置为 /32 地址,则转发应该可以工作。

与链接类似,添加一个 Tap 设备ip link add link eth0 <name of tap> type tap,上面的转发和 IP 地址同样适用。

如果您可以在其自己的 IP 或接口上获取它,那么:

自己的接口:tcpdump -i <interface name> -n -p -vv port 53-n 将停止 dns 查找并更快地显示结果,-p 停止 promisc(接收物理接口上的所有数据包,即使它不是 tcpdump 的默认模式,最后 -vv 表示详细,因此它显示数据包中的数据。

自己的IP:tcpdump -i <interface name> -n -p port 53 host <ip address>该IP是java程序和接口的IP,以匹配您的本地设置。

答案2

strace将是最好的计划。

如果进程已经在运行,则执行ps aux并获取该进程的 pid。

然后运行strace -f -e trace=network -s 1500 -p <pid here>

-s 1500是打印完整的数据包,假设你的mtu是标准的1500,如果有大的udp数据包你可以使用-s 10000,但如果它们只是dns数据包,1500应该足够了。

如果该进程没有运行,则:strace -f -e trace=network -s 1500 cmd with arguments;

相关内容