Centos

添加新規則時 iptables 超出配額

  • September 11, 2016

我有 iptables 在 Centos 7 上工作,使用版本 v1.4.21,但也在 v1.6.0 上進行了測試(請注意,我沒有重建核心,因為它說我不再需要擴展)。

我設置了一個配額並使用它:

# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
   pkts      bytes target     prot opt in     out     source               destination
   3639  3999378 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 4000000 bytes
    142   175468 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0
#

然後,當我向此鏈添加任何其他規則時,現有規則“重置”字節使用並再次用完配額:

# iptables -I 192.168.2.5 -m quota --quota 1000 -j ACCEPT
# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
   pkts      bytes target     prot opt in     out     source               destination
      2      168 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 1000 bytes
   7239  7998334 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 4000000 bytes
    890   387931 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0

即使沒有超過,這種行為總是將配額量添加到規則中,即使我正在影響不同的規則:

# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
   pkts      bytes target     prot opt in     out     source               destination
    379    67755 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 4000000 bytes
      0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0
# iptables -I 192.168.2.5 -m quota --quota 1000 -j ACCEPT
# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
   pkts      bytes target     prot opt in     out     source               destination
      2      168 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 1000 bytes
    379    67755 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 4000000 bytes
      0        0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0
# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
   pkts      bytes target     prot opt in     out     source               destination
     11      924 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 1000 bytes
   4159  4066453 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            quota: 4000000 bytes
    315   190056 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0

這似乎是一個錯誤,也許與這個有關。

有任何想法嗎?我的一種解決方法是自己擷取字節並將它們添加到新規則的配額中。當它已經超過時效果很好,但如果沒有,我可能會因為讀取、計算、刪除和添加之間的差距而錯過字節。

閱讀您連結和測試的另一個問題,我只能得出結論,配額模組不是很有用:每當發生變化時重置。

這就是為什麼還有一個名為 quota2 的模組的原因!它不是 iptables 的一部分,而是 xtables-addons 的一部分。在 Debian 中,它可以使用 xtables-addons-dkms 安裝並編譯。我認為您必須在 CentOS7 中自己編譯它。

手冊頁的三個摘錄(可以在這裡找到:xtables-addons.8

通過procfs可以讀取和重置計數器的值,從而使這個匹配成為一個極簡的記賬工具。

.

–name name

為計數器指定一個特定的名稱。此選項必須存在,

配額出現在 /proc/net/xt_quota/名稱中並且是讀/寫的

–quota iq

指定此計數器的初始配額。如果計數器已經存在,則不會重置。

這意味著必須使用 iptables 本身之外的一些邏輯(例如,如果您必須重新啟動伺服器,則保存剩餘配額並在啟動時恢復),但這肯定會解決您的問題。

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