我理解这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
然后我们就可以在文件中看到连接标记/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
还有一个关于输出的问题/proc/net/nf_conntrack
。字段的含义是什么use
?我见过use=1
等等use=2
这个网站说它是“此连接结构的使用计数”。
答案1
问题是关于弗瓦马克要不就标记(历史上称为诺夫马克但重命名为刚刚标记同时它不再依赖于netfilter。这个单词诺夫马克现在有点误导,但仍然存在于一些未更新或无法更新的地方)。这个标记是在数据包的磁盘缓冲区,而连续跟踪标记(又名CT标记等)是在继续跟踪条目。
获取数据包标记的最简单方法是通过 iptables 记录它LOG
目标。像这样的东西(有限制以避免洪水):
iptables -A INPUT -m mark ! --mark 0 -m limit --limit 8/min --limit-burst 12 -j LOG --log-prefix "IPTables-Marks: "
应使用标记记录数据包。该标记(当非零时,即上面选择的匹配的情况)显示在日志行的末尾。 (来自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
还有其他方法,更适合自动化但更难实现,例如 iptablesNFLOG
目标旨在将整个数据包“发送”到侦听 netlink 套接字的日志记录程序,该程序可以使用以下命令检索标记nflog_get_nfmark()
(旧命名...)。tcpdump
可以监听 nflog 设施(尝试tcpdump --list-interfaces
)并显示选定的数据包,这有时比调试日志更方便,但我不知道有什么方法让它也显示标记(它不知道nflog_get_nfmark()
或如何询问 libpcap )。