8.3. iptables-save

これまで説明した通り、 iptables-save コマンドは、現在のルールセットを iptables-restore で利用できるファイルへ保存するツールだ。このコマンドは極めてシンプルで、たったふたつの引数しか採らない。コマンド書式を理解するために、以下のコマンドを見ていただこう。

iptables-save [-c] [-t table]

-c 引数は、バイトおよびパケットのカウンタ値を保持するよう iptables-save に指示する。これは例えば、メインファイヤーウォールを再起動したいものの、統計に役立つバイトおよびパケットカウンタは喪失したくない場合に使用する。そうした際に -c 引数付きの iptables-save コマンドを使用すれば、統計および集計のルーティーンをリセットすることなくファイヤーウォールをリブートできる。デフォルトの挙動では、当然、カウンタは無傷では済まない。

-t 引数は、保存対象とするテーブルを iptables-save に指示する。-t を指定しない場合、 iptables-save コマンドは自動的に、有効なすべてのテーブルをファイルに保存する。下記の例は、いかなるルールセットもロードしていない時に iptables-save コマンドが出力するはずの内容を示している。

# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002
*filter
:INPUT ACCEPT [404:19766]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [530:43376]
COMMIT
# Completed on Wed Apr 24 10:19:17 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002
*mangle
:PREROUTING ACCEPT [451:22060]
:INPUT ACCEPT [451:22060]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [594:47151]
:POSTROUTING ACCEPT [594:47151]
COMMIT
# Completed on Wed Apr 24 10:19:17 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [3:450]
:OUTPUT ACCEPT [3:450]
COMMIT
# Completed on Wed Apr 24 10:19:17 2002

コメントも何行か書かれており、それらは # で始まっている。テーブルは *<table-name> のような書き方になっており、例えば *mangle がそれだ。そして各テーブル毎に、チェーンの定義とルールが記されている。チェーンの定義は :<チェーン名> <チェーンポリシー> [<パケットカウンタ>:<バイトカウンタ>] のような形式だ。チェーン名は例えば PREROUTING などで、それにポリシーACCEPT のように続く。最後にパケットカウンタとバイトカウンタが来るが、これは iptables -L -v が出力するものと同じだ。最後に COMMIT キーワードでテーブルの宣言が締めくくられる。 COMMIT キーワードは、取り敢えずこの時点まででカーネルへのパイプライン上にあるすべてのルールを登録実行せよ、という指示をする。

上記は例はちょっと単純すぎる。今度は、ごく小さな iptables-save ルールセット を含む簡単な例を示すのが何よりもの説明になると思う。その状態で iptables-save を掛けたとすると、下記のような出力が得られるはずだ:

# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002
*filter
:INPUT DROP [1:229]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -i eth1 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
-A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT 
COMMIT
# Completed on Wed Apr 24 10:19:55 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002
*mangle
:PREROUTING ACCEPT [658:32445]
:INPUT ACCEPT [658:32445]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [891:68234]
:POSTROUTING ACCEPT [891:68234]
COMMIT
# Completed on Wed Apr 24 10:19:55 2002
# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002
*nat
:PREROUTING ACCEPT [1:229]
:POSTROUTING ACCEPT [3:450]
:OUTPUT ACCEPT [3:450]
-A POSTROUTING -o eth0 -j SNAT --to-source 195.233.192.1 
COMMIT
# Completed on Wed Apr 24 10:19:55 2002

見ての通り、ここでは -c 引数を用いたので、各コマンドの先頭にはバイトおよびパケットカウンタが付いている。その点を除いては、各コマンドラインはほぼスクリプトの生き写しとなっている。今や課題は、出力をいかにしてファイルに書き出すかだけだ。答は簡単、 Linux をちょっと触ったことのある読者なら、やり方はもう分かっているはずだ。渡してやりたいファイルへコマンド出力をリダイレクトするだけである。こんな要領だ:

iptables-save -c > /etc/iptables-save
   

つまり、このコマンドは、バイトおよびパケットカウンタを保持したまま、ルールセットを丸ごと /etc/iptables-save という名前のファイルに保存する。