我的 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;