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
问题是关于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 )。
归档时间: |
|
查看次数: |
4005 次 |
最近记录: |