有沒有辦法像ctmark一樣查看nfmark?
我知道這
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
然後我們可以在文件中看到連接標記。標記=2ipv4 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
等等。這個網站說它是“使用這個連接結構的計數”。
問題是關於fwmark或只是標記(歷史上命名為nfmark,但同時重命名為標記,同時它不再依賴於 netfilter。nfmark 這個詞現在有點誤導,但仍然存在於一些不存在的地方t 或無法更新)。此標記在數據包的skbuff上完成,而conntrack 標記(又名ctmark等)在conntrack entry上完成。
獲取數據包標記的最簡單方法是通過 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
還有其他方法,更適合自動化但更難實現,例如 iptables 的
NFLOG
目標旨在將整個數據包“發送”到偵聽 netlink 套接字的日誌記錄程序,該程序可以使用nflog_get_nfmark()
(舊命名…)檢索標記。tcpdump
可以收聽 nflog 工具(trytcpdump --list-interfaces
)並顯示選定的數據包,這有時比調試日誌更方便,但我不知道如何讓它也顯示標記(它不知道nflog_get_nfmark()
或如何詢問 libpcap)。