前回書いた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