Archive for the ‘戒め’ Category

チェインルールの一括削除について

金曜日, 2月 7th, 2014

前回書いたiptablesについて失敗したのでしたためて、後人が同じ轍を踏まないことを祈ります。

RH-Firewall-1-INPUT というチェインにおいてtargetがDROPのラインナンバーを抽出し、削除するという意図のワンライナーです。

iptables  -L RH-Firewall-1-INPUT -n –line-numbers |grep DROP | awk ‘{print $1}’ |xargs -i echo “/sbin/iptables -D RH-Firewall-1-INPUT {}”

これを実行してしまったときに、意図しないルールが削除されてしまいました。

実際に実行されたコマンド

/sbin/iptables -D RH-Firewall-1-INPUT 6
/sbin/iptables -D RH-Firewall-1-INPUT 7
/sbin/iptables -D RH-Firewall-1-INPUT 8
/sbin/iptables -D RH-Firewall-1-INPUT 9
/sbin/iptables -D RH-Firewall-1-INPUT 10
/sbin/iptables -D RH-Firewall-1-INPUT 11
/sbin/iptables -D RH-Firewall-1-INPUT 12
/sbin/iptables -D RH-Firewall-1-INPUT 13
/sbin/iptables -D RH-Firewall-1-INPUT 14
/sbin/iptables -D RH-Firewall-1-INPUT 15
/sbin/iptables -D RH-Firewall-1-INPUT 16
/sbin/iptables -D RH-Firewall-1-INPUT 17
/sbin/iptables -D RH-Firewall-1-INPUT 18
/sbin/iptables -D RH-Firewall-1-INPUT 19
/sbin/iptables -D RH-Firewall-1-INPUT 20
/sbin/iptables -D RH-Firewall-1-INPUT 21

昇順の値を順に削除していくと、番号はshiftしていくのが原因です。下のサンプルで説明します。

 

$ iptables -L RH-Firewall-1-INPUT -n –line-numbers | egrep “^6|^7”
6 DROP tcp — 10.0.0.1 0.0.0.0/0 state NEW tcp
7 DROP tcp — 10.0.0.2 0.0.0.0/0 state NEW tcp

$ iptables -D RH-Firewall-1-INPUT 6

$ iptables -L RH-Firewall-1-INPUT -n –line-numbers | egrep “^6|^7”
6 DROP tcp — 10.0.0.2 0.0.0.0/0 state NEW tcp
7 DROP tcp — 10.0.0.3 0.0.0.0/0 state NEW tcp

 

このように7番のルールが6番に繰り上げられます。

こうなってしまうと21番のルールは意図しなかったルールを削除してしまうことになりますね。

そのため一括削除を行う場合は降順にソートする必要があります。

sortのオプションも自然数(-n)で降順(-r)が必須です。気をつけましょう。

/sbin/iptables  -L RH-Firewall-1-INPUT -n –line-numbers |grep DROP | awk ‘{print $1}’ |sort -nr |xargs -i echo “/sbin/iptables -D RH-Firewall-1-INPUT {}”

 

本来実行されるべきコマンドはこっちなのでした。

/sbin/iptables -D RH-Firewall-1-INPUT 21
/sbin/iptables -D RH-Firewall-1-INPUT 20
/sbin/iptables -D RH-Firewall-1-INPUT 19
/sbin/iptables -D RH-Firewall-1-INPUT 18
/sbin/iptables -D RH-Firewall-1-INPUT 17
/sbin/iptables -D RH-Firewall-1-INPUT 16
/sbin/iptables -D RH-Firewall-1-INPUT 15
/sbin/iptables -D RH-Firewall-1-INPUT 14
/sbin/iptables -D RH-Firewall-1-INPUT 13
/sbin/iptables -D RH-Firewall-1-INPUT 12
/sbin/iptables -D RH-Firewall-1-INPUT 11
/sbin/iptables -D RH-Firewall-1-INPUT 10
/sbin/iptables -D RH-Firewall-1-INPUT 9
/sbin/iptables -D RH-Firewall-1-INPUT 8
/sbin/iptables -D RH-Firewall-1-INPUT 7
/sbin/iptables -D RH-Firewall-1-INPUT 6