Linux

Linux - 查找預設路由的命中

  • January 7, 2020

與此類似的問題 -路由表命中?- 除了我不使用 iptables 並在核心路由表中尋找正常的路由命中。

但是我的案例是查找通過防火牆中的預設路由轉發了多少數據包,以確保在我刪除它之前它是無用的。對上述問題的回答包括檢查記憶體,但是否有可能轉發某些數據包而不會命中記憶體?

此外,在檢查記憶體後,推薦的命令 ( route -neeC) 剛剛終止,我想長時間(約 24 小時)檢查預設路由“查找命中”。關於如何做到這一點的任何建議?

乾杯。

IPv4 的 linux 路由記憶體已在Linux 3.6中刪除(僅保留使用優化的LPC-trie)。因此,具有 2012 年之後作業系統的 Linux 系統無法獲取路由記憶體統計資訊。


標記預設路由的使用的一種簡單方法是在此路由上放置一個領域值。匹配此路由的數據包(而不是使用同一網關的更具體的路由)將被辨識為具有給定領域值。因此,如果預設路由是 192.0.2.1 via eth0,則路由將設置如下:

ip route add default via 192.0.2.1 proto static realm 10

或者,您可以通過替換為 來更改以前的預設路由(無領域)addchange而不會中斷。

然後,這個領域標籤至少可以在其他兩個網路子系統中重用:tc filter ... route或 nftables’ nft ... meta rtclassid


交通管制

tc相當粗糙,通常在介面級別工作。附加過濾器的最簡單方法是使用prioqdisc,這是最簡單的有類 qdisc。它的特定優先級屬性實際上不會被使用。所以按照前面的例子:

tc qdisc add dev eth0 root handle 1: prio

現在添加帶有空操作的過濾器(如果需要,還可以使用pref order 和continue控制項以允許其他類似的過濾器),只是為了對其進行統計:

tc filter add dev eth0 parent 1: protocol ip pref 1 route to 10 action continue

現在每個匹配路由領域 10 的 ip 數據包,都將使用 顯示在統計資訊中tc -s filter show dev eth0。例子:

# tc -s filter show dev eth0
filter parent 1: protocol all pref 1 route chain 0 
filter parent 1: protocol all pref 1 route chain 0 fh 0xffff000a to 10 
   action order 1: gact action continue
    random type none pass val 0
    index 1 ref 1 bind 1 installed 48 sec used 4 sec
   Action statistics:
   Sent 12230 bytes 79 pkt (dropped 0, overlimits 0 requeues 0) 
   backlog 0b 0p requeues 0

注意:轉發的本地發起的數據包都是匹配的,這可能是測量的問題。


表格

這裡的nftables不會用於做任何類型的防火牆,而只是用於增加一些計數器。

nftables只安裝請求的 netfilter 的鉤子,而不是所有可用的鉤子,因此通常比iptables佔用更少的空間。在這裡,我們只需要一個匹配領域的規則——這就是rtclassid表達式的作用——上面有一個計數器。如果它用於本地發起的數據包,那麼只需使用輸出掛鉤。forward hook 將只匹配轉發的數據包。

nft add table ip mystats
nft add chain ip mystats forward '{ type filter hook forward priority 0; policy accept; }'
nft add rule ip mystats forward meta rtclassid 10 counter

例如稍後會給出:

# nft list ruleset
table ip stats {
   chain forward {
       type filter hook forward priority filter; policy accept;
       meta rtclassid 10 counter packets 1453 bytes 118264
   }
}

僅當將值儲存在命名對像中時才可能將值歸零,規則集將改為(使用 載入nft -f file):

table ip mystats {
   counter defaultroutecount { }

   chain forward {
       type filter hook forward priority filter; policy accept;
       meta rtclassid 10 counter name "defaultroutecount"
   }
}

然後nft list countersornft reset counters將顯示(或顯示並重置)其內容。

引用自:https://serverfault.com/questions/993437