yamasaki0's diary

IT勉強会や技術的なメモなどを書いていきたいと思います。

リモートからiptablesを設定するときに失敗して「あー繋がらなくなった」ってことにならないためのスクリプト

よくあるんですよね、リモートでちょっとiptablesスクリプトをいじってみたら、

あら・・繋がらなくなったよ!現地に行くしかない 

みたいなのが・・。
そんなことが無いようにiptables-applyというスクリプトがあるようなのですが、
これは、iptables-saveとiptables-restoreを使って、
ルール適用後にキー入力を待って、タイムアウトした場合は、
元の適用前のルールをrestoreしてくれるんです。
かなり便利なんですが、
iptables-restoreで読める形式でルールを書かないといけないのが難点で、
シェルスクリプトで書いたルールと比べると可読性がかなりよろしくない。

そこで、シェルスクリプトでかいたルールでも、同じようにキー入力を待って
からタイムアウトで元のルールをrestoreするスクリプトを書いてみました。

利用方法

使い方は、こいつ自身を直接実行するのではなく、
以下のような感じでルールスクリプトを書く形です。

$ cat filter_ruleset.sh
#!/bin/bash

# スクリプトを読み込む(先頭に「.」が必要な点に注意
. ./iptables-ruleupdater

# 変数等をセット
mynetwrok=10.10.10.0/24
myhost=10.10.10.12

#ルールを書く
rule_set () {
    iptables -F
    iptables -t nat -F
    iptables -P INPUT ACCEPT
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT

    # any -> ppp0:ssh accept
    iptables -A INPUT  -i ppp0 -d $myhost -p tcp -m state --state NEW,ESTABLISHED,RELATED --dport 22 -j ACCEPT
    iptables -A OUTPUT -o ppp0 -s $myhost -p tcp --sport 22 -j ACCEPT
    
    # 以下略

    iptables -A OUTPUT -j LOG
}

apply
# ↑上記のルールを適用したりチェックしたり分岐処理するファンクション

実行方法

# ./filter_ruleset.sh
 * Usege: filter_ruleset.sh {check|try|status|start}
  • check
    • スクリプトの文法的エラーがないかどうか確認します。
    • 中では実際にiptablesでルールを適用し、すべてルール適用が終わったらすぐさま直前のルールをrestoreします。
    • エラーがあった場合はそのスクリプト中の行数を表示し停止します。
  • try
    • ルールを適用した後、キーに入力を待ち、10秒まってもキー入力が無い場合は直前のルールをrestoreします。
  • start
    • ルールを普通に適用します(確認なし)

追記

id:bitwalkerhttp://d.hatena.ne.jp/bitwalker/20090111/1244874627 に同じようなことを簡単なスクリプトで実現されているのを見つけました。(ただ、この方法だとオールクリア状態に戻ってしまうので、ちょこっと更新とかは厳しいかも)