Iptables

替換 iptables 規則而不給出規則編號

  • December 13, 2019

如果添加的規則與鏈中已經存在的規則相同,是否可以通過覆蓋現有規則來替換iptables規則而不給出規則編號或插入/附加規則?我問的原因是我有一個自動添加iptables規則的腳本,並且可能存在添加的規則與鏈中已經存在的規則相同的情況。

這是一種足夠接近的方法來完成您的要求。iptables有選項-C/--check

-C, –check鍊式規則規範

檢查所選鏈中是否存在與規範匹配的規則。此命令使用與-D相同的邏輯來查找匹配條目,但不會更改現有的 iptables 配置並使用其退出程式碼來指示成功或失敗。

因此,例如,如果您有一些自動腳本嘗試執行以下操作:

iptables -I FORWARD -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT

並且你不想污染你的規則,你可以這樣做:

iptables -C FORWARD -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT || \
   iptables -I FORWARD -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT

這將檢查規則是否存在。如果它返回 true,則什麼都不會發生,如果它返回 false,shell 將執行第二條iptables規則。如果總是這樣完成,那麼您將冪等地獲得一次且僅一次該規則(但請參閱稍後關於排序的內容)。您本可以使用-A-I更有可能提供幫助。

如果規則的位置確實很重要,但由於其他更改而您不知道它目前的確切位置,則應使用使用者定義的鏈來執行此操作。這樣規則將始終在跳轉的位置被呼叫:

iptables -N mychain
iptables -A FORWARD -m comment --comment first_rule
iptables -A FORWARD -m comment --comment initially_second -j mychain

iptables -C mychain -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT || \
   iptables -A mychain -s 10.0.3.0/24 -d 10.0.4.0/24 -j ACCEPT

這樣,如果在某個時間之前插入了異常:

iptables -I FORWARD 2 -s 10.0.3.10 -d 10.0.4.20 -m comment --comment now_second -j DROP

您的腳本不會在此異常之前重新插入規則並取消它。

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