iptables nat表命中率很少問題解析和解決

2021-09-16 20:48:21 字數 1548 閱讀 7850

問題背景描述:做乙個功能,路由器抓取lan側client的上下行速率,原先考慮到斷網的情況下,來抓取lan client跟路由器,所以在nat表的prerouting裡設定規則,結果發現對應的規則抓取的包很少。

當時測試方案,在路由器console裡,呼叫tftp 從lan pc down個檔案下來,結果,mangle的prerouting資料報正常,nat的prerouting資料報很少,filter的input資料報正常。

這個問題當時覺著非常詭異,且自己也比較感興趣,那麼開始分析原因和解決方案了

當時第乙個想法是:1.是不是mangle的prerouting accept的包,就不過nat的prerouting,測試方案,在mangle裡和nat裡的prerouting設定同一條對dns 過濾的包,如下

iptables -t nat -i prerouting -m string --hex-string "luyou|04|qtec|02|cn" --algo bm

結果對應的規則下抓包nat和mangle一致, 可見單個規則的accept,只會影響當前chain,也驗證了mangle的prerouting的包也會過nat表的prerouting的包,該想法不成立

接下來第二個想法是是不是發往local in的包不過nat的prerouting, 發往wan口的過nat的prerouting,首先從相關文件上看這個假想方案不成立,但當時實在沒其他方向,測試方案,還是抓取dns包,首先將lan pc 的dns伺服器設定為8.8.8.8,在nat的prerouting裡能抓到這個包,後來將 lan pc的dns伺服器設定為gateway,但在nat的prerouting仍能抓取到,所以該想法也沒不通過

第3個想法是 是否開啟硬體加速,就是說硬體加速的包,不過nat prerouting的計數器, 後來根據大牛解釋,後來在核心發現對應的硬體加速沒有開啟

最後細心看原始碼,發現在iptable_nat.c裡

*switch (ctinfo)

/* fall thru... (only icmps can be ip_ct_is_reply) */

case ip_ct_new:

* or local packets.

*/if (!nf_nat_initialized(ct, maniptype)) else

break;*終於發現問題產生的原因 即 netfilter中處理nat的hook並不像處理filter的hook。處理nat的hook時首先判斷連線是否ipt_new或者ipt_related的連線,如果是則ipt_do_table()呼叫nat上的規則;如果是保持ipt_established的,則直接找出tuple,然後做相應的修改。 這也是nat表不建議加對包過濾的規則的原因了

而之前的dns查詢測試中,lan pc每次dns查詢都會使用乙個新的隨機源埠,所以nat的規則的包也會增加,所以察覺不到異常,而tftp中,當檔案udp下傳時,應該conntrack 建立,所以很多包就不走nat的prerouting了,所以nat的prerouting包就少了很多,所以命中很少。

看來netfriter框架要好好仔細看,另除了firewall 規則外,ip conntrack也是比較重要的一環

快取命中率

安裝 docker redis 查詢乙個不存在的key 127.0.0.1 6379 get test nil 在看命中率 新插入乙個值 name 127.0.0.1 6379 set name jackma ok查詢name 127.0.0.1 6379 get name jackma 再看命中率...

快取命中率

避免命中 函式計算 無服務架構 tmp 初始化清空 tmp空間限制,新檔案生成 利用命中 快取命中率 終端使用者訪問加速節點時,如果該節點有快取住了要被訪問的資料時就叫做命中,如果沒有的話需要回原伺服器取,就是沒有命中。取資料的過程與使用者訪問是同步進行的,所以即使是重新取的新資料,使用者也不會感覺...

mysql計算共享池命中率 計算記憶體命中率

1 lc的命中率 計算公式 library cache hit ratio sum pinhits sum pins selectsum pinhits sum pins fromv librarycache 通常在98 以上,否則,需要要考慮加大共享池,繫結變數,修改cursor sharing等...