Iptables
替換 iptables 規則而不給出規則編號
如果添加的規則與鏈中已經存在的規則相同,是否可以通過覆蓋現有規則來替換
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
您的腳本不會在此異常之前重新插入規則並取消它。