Iptables

有沒有辦法像ctmark一樣查看nfmark?

  • March 18, 2019

我知道這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=1use=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 工具(try tcpdump --list-interfaces)並顯示選定的數據包,這有時比調試日誌更方便,但我不知道如何讓它也顯示標記(它不知道nflog_get_nfmark()或如何詢問 libpcap)。

引用自:https://unix.stackexchange.com/questions/499791