我正在尝试按照此处的说明隔离并 tcpdump 来自单个进程的所有网络流量:(如何通过程序标记数据包):
$ sudo bash
# mkdir /sys/fs/cgroup/net_cls
# mount -t cgroup -onet_cls net_cls /sys/fs/cgroup/net_cls
# mkdir /sys/fs/cgroup/net_cls/tcpdump
# pidof my_program > /sys/fs/cgroup/net_cls/tcpdump/tasks
# echo 0x100001 > /sys/fs/cgroup/net_cls/tcpdump/net_cls.classid
# iptables -A INPUT -m cgroup --cgroup 0x100001 -j NFLOG --nflog-group 123
# iptables -A OUTPUT -m cgroup --cgroup 0x100001 -j NFLOG --nflog-group 123
# tcpdump -i nflog:123
然而,它的表现很差,因为它只显示出站流量,而不显示传入流量:
# iptables-save -c | grep cgroup
[0:0] -A INPUT -m cgroup --cgroup 1048577 -j NFLOG --nflog-group 123
[4242:623034] -A OUTPUT -m cgroup --cgroup 1048577 -j NFLOG --nflog-group 123
由于它旨在与仅关心出站流量的流量控制(tc)一起使用,这是设计使然,还是一个缺陷?
无论该问题的答案如何,是否有更好的方法来记录进出给定进程(或一组进程)的所有数据包?
PS:命令tcpdump -i nflog:123 not src host x.x.x.x
一直说
tcpdump: NFLOG link-layer type filtering not implemented
即使我不要求链路层过滤。那是怎么回事?
提前致谢!