iptables-saveで保存したデータは、テキスト形式のため編集が可能です。しかしテーブルごと、チェインごとに整理されているため可読性が悪くなっています。そうした点ではshスクリプトが優れています。また、shスクリプトはビルトインコマンドや外部コマンドなどを駆使することで、動的なパラメータを設定することもできます。
例として、テンプレートで使用していた自アドレスの指定を見てみましょう。
4 myhost='192.168.20.200'
固定IPアドレスを使用している場合は何も苦労はありませんが、DHCPによる割り当てでIPアドレスが動的に変化する場合は、以下のようにして自アドレスを知ることができます。
myhost=`ifconfig eth0 | grep "inet addr" | awk '{print $2}' | sed 's/addr://'`
上の例は、ifconfigコマンドの出力を利用しています。インターフェイスがeth0以外場合は、適宜修正を加えます。同じ要領で、ブロードキャストアドレスやネットマスク値を取得することもできます。
bcast=`ifconfig eth0 | grep "inet addr" | awk '{print $3}' | sed 's/Bcast://'`
mask=`ifconfig eth0 | grep "inet addr" | awk '{print $4}' | sed 's/Mask://'`
shスクリプトの利点として、反復制御や条件分岐が利用できる点も挙げられます。例えば、テンプレート12では「-d」オプションで複数アドレスの指定ができないために、2度同じようなiptables指定を行いました。
56 iptables -A FORWARD -i eth0 -o eth1 -p tcp -d 192.168.0.3 --dport 80 -j ACCEPT 57 iptables -A FORWARD -i eth0 -o eth1 -p tcp -d 192.168.0.4 --dport 80 -j ACCEPT
shスクリプトで反復制御と関数定義を利用することで、以下のようにすることができます。
func_test(){ for ip in $@; do iptables -A FORWARD -i eth0 -o eth1 -p tcp -d $ip --dport 80 -j ACCEPT done } func_test 192.168.0.3 192.168.0.4
テンプレート12ではIPアドレスを2つしか指定していなかったため、上記のように関数化するメリットはあまりありませんが、IPアドレスの数が多くなればメリットが生きてきます。
Copyright © ITmedia, Inc. All Rights Reserved.