有没有办法像ctmark一样查看nfmark?

Sou*_*osh 1 iptables netfilter ip-conntrack

据我所知,iptables --set-mark不会在数据包“上”添加标记。目标MARK是将标记与内核数据结构中的数据包相关联。数据包本身没有被修改。但是有没有办法查看数据包及其相关标记呢?

我们可以从 中看到ctmark(使用目标设置的连接标记CONNMARK/proc/net/nf_conntrack。我正在寻找类似的内容以供查看nfmark(数据包标记)。

我们可以这样查看ctmark

iptables -I OUTPUT 1 -t mangle -j CONNMARK --restore-mark
iptables -I OUTPUT 2 -t mangle -m conntrack --ctorigdst 172.30.138.151 -m mark --mark 0 -j MARK --set-mark 2
iptables -A POSTROUTING -t mangle -j CONNMARK --save-mark
Run Code Online (Sandbox Code Playgroud)

然后我们就可以在文件中看到连接标记/proc/net/nf_conntrack标记=2

ipv4     2 icmp     1 18 src=157.43.150.253 dst=172.30.138.151 type=8 code=0 id=54809 packets=4 bytes=336 src=172.30.138.151 dst=157.43.150.253 type=0 code=0 id=54809 packets=4 bytes=336 mark=2 zone=0 use=2
Run Code Online (Sandbox Code Playgroud)

还有一个关于输出的问题/proc/net/nf_conntrack。字段的含义是什么use?我见过等等use=1这个网站说的是“这个连接结构的使用计数”。use=2

A.B*_*A.B 5

问题是关于fwmark或只是标记(历史上称为nfmark,但更名为只是标记,同时它不再依赖于 netfilter。nfmark 这个词现在有点误导,但仍然出现在一些不存在的地方) t 或无法更新)。该标记是在数据包的skbuff上完成的,而conntrack 标记(又名ctmark等)是在conntrack 条目上完成的。

获取数据包标记的最简单方法是通过 iptables 的LOG目标记录它。像这样的东西(有限制以避免洪水):

iptables -A INPUT -m mark ! --mark 0 -m limit --limit 8/min --limit-burst 12 -j LOG --log-prefix "IPTables-Marks: "
Run Code Online (Sandbox Code Playgroud)

应使用标记记录数据包。该标记(当非零时,即上面选择的匹配的情况)显示在日志行的末尾。(来自OP的评论)示例:

kern.debug kernel: [11007.886926] IPTables-Marks: IN=wlan0 OUT= MAC=e4:xx:xx:xx:97:32:28:xx:xx:xx:fb:60:08:00 SRC=192.168.8.10 DST=192.168.8.1 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=23698 DF PROTO=TCP SPT=36764 DPT=22 WINDOW=254 RES=0x00 ACK URGP=0 MARK=0x2
Run Code Online (Sandbox Code Playgroud)

还有其他方法,更适合自动化,但更难实现,例如 iptables 的NFLOG目标旨在将整个数据包“发送”到侦听 netlink 套接字的日志记录程序,该程序可以使用nflog_get_nfmark()(旧命名...)检索标记。tcpdump可以监听 nflog 设施(尝试tcpdump --list-interfaces)并显示选定的数据包,这有时比调试日志更方便,但我不知道有什么方法让它也显示标记(它不知道nflog_get_nfmark()或如何询问 libpcap )。