変数に基づいて複数のインターフェイスに適用されるiptablesルールを作成しようとしています。どのルールがより効率的で速いのですか?最小限のコードでこのルールを書くより良い方法はありますか?
#Variable
Ext_INTF="eth0 usb0 tun0 tun1"
1)
for i in $Ext_INTF;
do
iptables -A FORWARD -i $i -j DROP
done
2)
iptables -A FORWARD -i $Ext_INTF -j DROP
答え1
方法2は機能しません。無効なiptables
呼び出しが生成されます。何をするかを考えると、iptablesルールだけを追加するだけで、単一のルールでインターフェイスセットを一致させることはできません。方法1は一般的な方法であり、ほぼ唯一の方法である。
iptablesルール設定の効率性は問題ではありません。確かに最適ではないことをするには本当に頑張ってください。ここで重要なのは、ルールを正しく作成し、ルール自体の効率を高め、簡単にメンテナンスできるようにスクリプトを読みやすくすることです。
書き込み$Ext_INTF
(二重引用符以外の変数の置き換え)は、変数の値をスペースで区切られた部分に分割し、各部分をファイル名と一致するワイルドカードパターンに展開します。ここの変数にはワイルドカード文字(\[*?
)は含まれていません。したがって、for i in $Ext_INTF; …
変数値の単語を繰り返します。通常、二重引用符内で変数の置換のみを使用する必要があります。以降、$Ext_INTF
二重引用符内にのみ「値」を示しますが、ここでは分割しようとしていますが、Ext_INTF
その部分にはシェルワイルドカードは含まれていません。
Ext_INTF="eth0 usb0 tun0 tun1"
for i in $Ext_INTF; do
iptables -A FORWARD -i "$i" -j DROP
done
bashとkshでは、通常のshではなく文字列変数の代わりに配列を使用できます。 (zshでは配列を使用するか、を使用して明示的に分割を要求する必要があり$=Ext_INTF
ます)
Ext_INTF=(eth0 usb0 tun0 tun1)
for i in "${Ext_INTF[@]}"; do
iptables -A FORWARD -i "$i" -j DROP
done