如何使用 iptables 或任何其他防火墙/工具在 Linux 中标记特定程序/cmd 的所有数据包(入站和出站)
鉴于 --cmd-owner 选项已弃用 ref:http://www.spinics.net/lists/netfilter/msg49716.html。
例如,如何标记所有 Firefox 的数据包,知道 Firefox 可以生成进程,因此 PID 选项不可行。
答案1
一个可能的解决方案是使用cgroups
net_cls
cgroup
子系统对某些进程组进行分组,使用 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