FC2ブログ

PCで: ウチのネット環境の今(6) パケットフィルタリング#3

 さてパケットフィルタリングの話も三回目で、作ったスクリプトの紹介なんですが、これがまた「作りかけ」感に満ちた代物で(笑)。
 試験的に、コマンドライン引数で機能を切り替えていたのがそのまま残っていて、逆にオプションが少なかったり。
 そのくせ、設定を解釈する関数は妙にネチネチと作り込んであったり。
 まあ実際のところ、呼び出し方なんてそう変えるものでもないので、オプションや引数はいい加減でもいい、という個人ユースならではの仕様ですね。まあ、それをそのまま公開するのもアレですが。

 そして、以前のルーティング設定のスクリプトでは、まだ設定部分が比較的ちゃんと分かれていましたが(それでもスクリプト中に書いたりしていましたが"."でソースするようにするのも容易)、今回のは分けると結構書くのが大変かも。

 とまあそんなスクリプトの設定部分で使用するシェル関数の典型的な使用法は、こんな感じです。
AppendFilter chain proto src dst target
 で、proto(プロトコル)以降は','で区切って複数書けます。また、protoからdst(デスティネーション)までは省略可能で、指定しない場合は''と書きます。つまり、空文字列。
 src/dstは結構ややこしい指定ができて、書き方をusage風に表現するとこんな感じ。
src/dst: [addr[,addr...]][#port[-port][,[port[-port]]...]]
 addrはIPv4/v6アドレスで、','で区切って複数書けて、'#'で区切ってポート。ポートは'-'で並べると範囲指定、','で並べると並記。
 IPアドレスとポートの区切りが':'でなく'#'なのは、IPv6でも使えるように、ということで。
 targetは、通常はACCEPTかDROPでしょうが、ログを取るときにはLOG,DROPのように書きます。

 これで、最初に書いた例のように記述すると、引数の組み合わせでざざーっとiptables/ip6tablesコマンドが実行されるわけです。
 ここを解釈する部分のforのネストが、もう笑うしかないという感じで。
    for chain in "${chains[@]}"; do
local -a chainopt=("$cmd" "$chain")
for saddr in "${saddrs[@]}"; do
local -a saddropt=()
if [ "$saddr" ]; then saddropt=('-s' "$saddr"); fi
for sport in "${sports[@]}"; do
local -a sportopt=()
if [ "$sport" ]; then sportopt=('--sport' "$sport"); fi
for daddr in "${daddrs[@]}"; do
local -a daddropt=()
if [ "$daddr" ]; then daddropt=('-d' "$daddr"); fi
for dport in "${dports[@]}"; do
local -a dportopt=()
if [ "$dport" ]; then dportopt=('--dport' "$dport"); fi
for proto in "${protos[@]}"; do
local -a protoopt=()
if [ "$proto" ]; then protoopt=('-p' "$proto"); fi
for target in "${targets[@]}"; do
local -a logopt=()
if [ "$target" = 'LOG' ]; then logopt=("${logopt_def[@]}"); fi
v4check "$v4" "${saddropt[1]}" "${daddropt[1]}"
if [ $? -eq 0 ]; then
echo_and_do iptables -t filter "${chainopt[@]}" "${protoopt[@]}" "${saddropt[@]}" "${sportopt[@]}" "${daddropt[@]}" "${dportopt[@]}" -j "$target" "${logopt[@]}"
fi
v6check "$v6" "${saddropt[1]}" "${daddropt[1]}"
if [ $? -eq 0 ]; then
echo_and_do ip6tables -t filter "${chainopt[@]}" "${protoopt[@]}" "${saddropt[@]}" "${sportopt[@]}" "${daddropt[@]}" "${dportopt[@]}" -j "$target" "${logopt[@]}"
fi
done
done
done
done
done
done
done
とまあこんな風に書いてあります。はっはっは。

 前回書いたようにチェインをセットアップして、インタフェース毎に用意した関数(SetupFilters_XXX)を呼び出すようにして、その中でこういう関数をマクロか何かのように呼び出していく、というわけです。チェインのセットアップは、設定の配列(network_XXX)に書くと自動でやります。

 Appendの他にInsertというのもあり、要するにルールをチェインの最後に追加するか最初に挿入するかという違い。また、引数をもうちょっと自由に書けるのもあって、iptablesコマンドの直接呼び出しにやや近い使い方ができるのもあります。

 今回は三つ目のネットワークの分も削除せずに残してあります。まあ、実際のアドレスなどはいじってあったりしますが。
 また、"home"ネットワークでは何をしているかというと、特定のMACアドレスから以外は全部弾きますよ、という感じ。まあ、その特定のMACアドレスを書く配列が空になっていますけど。

 あとは、FTPに関するやり方はもう古いようなんですが、最近のやり方だと共通処理部分に書かないといけない感じなので、そこは昔風のまま(ip_conntrack_ftpとかを使用)になっています。

 それ以上はもう、読むしかない、という感じでしょうか(笑)。

extfilter_sh.txt

関連項目:

コメント

非公開コメント

プロフィール

水響俊二

Author:水響俊二
水響 俊二 [MIZUKI Shunji]

暫定的に、18禁作品の感想などは裏サイトで書いています。
   

最新記事
最新コメント
カテゴリ
検索フォーム
リンク
RSSリンクの表示
月別アーカイブ
アクセス解析中