几个不同的地方(例如http://wiki.wireshark.org/CaptureSetup/NFLOG)建议使用 Linux 的“NFLOG”防火墙模块来捕获由特定 UID 生成的数据包,如下所示:
# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30
# dumpcap -i nflog:30 -w uid-1000.pcap
我还没有找到任何关于它是如何工作的文档(特别是,netfilter.org
有很多写得很糟糕的库 API 文档,据我所知,没有任何关于实际内核级防火墙的语义规则),所以我有几个问题:
有没有该死的文件,它藏在哪里?
CONNMARK的东西真的有必要吗?也就是说,这也可以吗?
# iptables -A INPUT -m owner --uid-owner 1000 -j NFLOG --nflog-group 30 # iptables -A OUTPUT -m owner --uid-owner 1000 -j NFLOG --nflog-group 30
是否需要运行“ulogd”才能使其正常工作?
有没有办法告诉内核为我选择一个未分配的组号并告诉我它是什么?
有没有办法告诉内核这些过滤规则应该在进程 X 终止时自动删除?(进程 X不会以 uid 1000 运行。)
大概该
iptables
命令会进行一些特殊ioctl
调用或配置防火墙。是否有一个 C 库可用于在程序中执行相同的操作(即 Q4 中的“进程 X”)?
netfilter 站点上有一些示例可以帮助解释该功能。这是我在自己的代码中编写的用于设置 netfilter NFLOG 的函数。
以下是他们提供的示例:http: //www.netfilter.org/projects/libnetfilter_log/doxygen/files.html
这是不必要的。
不——事实上我没有在这个应用程序中使用它。
不是我知道的。在任何情况下,如果您为 HTTP 设置了 NFLOG 目标,一个用于记录丢弃的 FTP 数据包和一个用于扫描 SMTP 字符串的数据包,这将毫无用处。在这种情况下,您无法确定哪个规则绑定到哪个组,因此应该监听哪个组。
不,但内核仅填充最大大小的缓冲区,然后将丢弃数据。它不会在使用过多内存且未听规则的情况下对性能产生影响。
我知道没有 netfilter 库可以帮助您操作规则。不过,有一个内部驱动的库被用来代替。
IPtables 继承了一种与用户空间对话的相当古老的方法——您打开一个 SOCK_RAW IP 套接字与它进行通信。这将完全被 nftables 删除(因为它没有任何意义),它将通过 netlink 说话来做同样的事情。
具体回答这部分:
是的,这是必要的。不,您的提议不会匹配任何传入的数据包(也许它匹配本地计算机上的流量,但绝对不匹配外部网络流量)。
只有本地的传出数据包具有关联的所有者。在 INPUT 链的早期,所有者信息不可用,因为数据包仍在路由中。为了匹配与传出流相关的传入数据包,有必要在 OUTPUT 链中标记“连接”,随后可以在 INPUT 链上进行匹配。
另请参阅
iptables-extensions
手册页:(同样的警告也适用于 nftables。)