2006年05月17日

IPSec で暗号化されたパケットの,iptables 上での識別方法

はてなブックマークに登録

Linux 2.6 カーネルでは,2.4 カーネルの FreeS/WAN の IPSec の実装とは異なって,ESP でカプセル化されたパケットが届くネットワークインタフェースと,カプセル化が解かれたパケットが届くインタフェースは同じものにるので,IPSec のチャンネルを通ってきたパケット,を識別しづらくなっています.(2.4 カーネルの FreeS/WAN の場合,カプセル化が解かれたパケットは,専用のインタフェースから届く形になっています.) しかし,フィルタリングする上で,そのパケットが ESP 化されて届いたのかそれとも生の形で届いたのかを識別するのは,時としてとても重要になります.


さて,この目的に合うモジュールは,と iptables(8) を探したところ,policy match モジュールが使えそうです.これは,IPSec の SPD を調べて,対象のパケットが IPSec のチャンネルを通ってきたか/通って出ていくかをチェックできるものです.(ですので,厳密な意味では ESP でカプセル化されていたパケット,にマッチするものではありません.) 使い方は簡単で,ESP でカプセル化されて届いたパケットは LAN 内のマシンと通信許可するルールは,

iptables -A FORWARD -m policy --pol ipsec --proto esp --dir in -i $OUT -d $LAN -j ACCEPT
といった形になります.或いは,IPSec のチャンネルを通って出ていくパケットに SNAT を施したいのであれば
iptables -t nat -A POSTROUTING -m policy --pol ipsec --proto esp -dir out --mode tunnel -s $GLOBAL -j SNAT --to $LOCAL
といった形になります.
個々のオプションの説明は iptables(8) を見てください.SPD を設定した経験があれば,必要なオプションに関しては大体想像が付くと思います.ちなみにこの policy match モジュール(ipt_policy.ko)が vanila kernel に取り込まれたのは 2.6.16 からのようです.


最後に,ESP パケットの見分け方の別の方法として,MARK ターゲットを使う方法もあります.一番目の例を書き換えてみると,

ESP=10
iptables -t mangle -A PREROUTING -p esp -j MARK --set-mark $ESP
iptables -A FORWARD -m mark --mark $ESP -i $OUT -d $LAN -j ACCEPT
のようになります.つまり最初に mangle テーブルで MARK ターゲットを使って ESP パケットに印を付けておけば,カプセル化が解かれた後もそのマークが保存されるので,それを目印にして ESP でカプセル化されて届いたものとそれ以外のものを識別しています.但し,この方法は当然ながら policy match を使った2番目の例には適用できません.

klab_gijutsu2 at 22:53│Comments(0)TrackBack(0)ipsec 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント