准备工作

准备工作

如何使用 iptables 或任何其他防火墙/工具在 Linux 中标记特定程序/cmd 的所有数据包(入站和出站)

鉴于 --cmd-owner 选项已弃用 ref:http://www.spinics.net/lists/netfilter/msg49716.html

例如,如何标记所有 Firefox 的数据包,知道 Firefox 可以生成进程,因此 PID 选项不可行。

答案1

一个可能的解决方案是使用cgroups net_clscgroup子系统对某些进程组进行分组,使用 iptables规则标记此中的数据包匹配扩展,然后用于tcpdump监控来自该cgroup的数据包。通过监听nflog接口。

准备工作

net_cls在子系统中创建cgroup

$ mkdir /sys/fs/cgroup/net_cls/firefox

将相关pid添加到cgroup中

确保所有相关 pid 都分组的最佳方法是这样做您开始运行该应用程序。

例如,如果您想运行 Firefox,请首先检查当前 shell 的 pid ( echo $$)。然后将其添加到您创建的cgroup中。

$ echo <pid> > /sys/fs/cgroup/net_cls/firefox/tasks

从 shell 生成的所有进程现在都将分配给“firefox”cgroup。

为 cgroup 分配类 ID

从文档中cgroups net_cls:

您可以将十六进制值写入net_cls.classid;这些值的格式为 0xAAAABBBB; AAAA 是主句柄号码,BBBB 是次句柄号码。

echo 0x100001 > /sys/fs/cgroup/net_cls/firefox/net_cls.classid

iptables在规则中标记这些数据包

iptables匹配扩展您可以利用:

比赛延长

iptables 可以使用带有 -m 或 --match 选项的扩展数据包匹配模块,后跟匹配模块名称;之后,根据特定模块,各种额外的命令行选项变得可用。

您使用组组扩展模块,并通过分配来标记这些数据包神经网络日志作为团体目标:

神经网络日志

该目标提供匹配数据包的日志记录。当为规则设置此目标时,Linux 内核会将数据包传递到加载的日志记录后端以记录该数据包。这通常与 nfnetlink_log 结合使用作为日志记录后端,它将通过 netlink 套接字将数据包多播到指定的多播组。一个或多个用户空间进程可以订阅该组以接收数据包。

--nflog-group nlgroup

数据包所属的 netlink 组 (0 - 2^16-1)(仅适用于 nfnetlink_log)。默认值为 0。

所以它看起来像这样(获取您创建的 net_cls.classid,并决定 nflog 组的某个数字):

$ iptables -I INPUT 1 -m cgroup --cgroup 0x100001 -j NFLOG --nflog-group 123
$ iptables -I OUTPUT 1 -m cgroup --cgroup 0x100001 -j NFLOG --nflog-group 123

nflog该规则将用组号 123标记 cgroup 中的所有传入/传出数据包。

跑步tcpdump

您可以使用该nflog界面。并非所有版本都tcpdump支持此功能。您可以检查您的版本是否支持:

$ tcpdump --list-interfaces |grep nflog
5.nflog (Linux netfilter log (NFLOG) interface) [none]

如果是,您可以监听该接口中的所有数据包,这些数据包是您创建的 cgroup 中的进程发送/接收的数据包:

$ tcpdump -v -i nflog:123

相关内容