$Id: memo-racoon.txt,v 1.1.1.1 1999/10/26 17:19:17 sakane Exp $ %Hd: Racoon MEMO 1. initiator kernel SPD に従い af,src,dst,prefix,protocol,src-port,dst-port,proxy をあげる SADB_ACQUIRE処理 拾って IPSEC-SAネゴ処理 admin's IPSEC-SAネゴ 拾って IPSEC-SAネゴ処理 admin's IKE-SAネゴ 拾って IKE-SAネゴ処理 IKE-SAネゴ処理 IKE-SA table にある? ない IKE-SA table に入れて IKE-SAネゴ開始 ある 無視 proxy ある? ある dst は proxy, id は src,dst ない dst はそのまま。id は src,dst IPSEC-SAネゴ処理 IPSEC-SA ネゴ中 table にある? ある 無視 ない SADB_GET ある 無視 ない IPSEC-SAネゴ中table に入れる IPSEC-SAネゴqueue に入れる IKE-SAネゴ処理 src,dstの決定 ID payload ある? ある address ? YES ID に従う NO IKE-SA src,dst ない IKE-SA src,dst 2. responder IKE-SAネゴ処理 IKE-SA table にある? ない IKE-SAネゴ中tableに入れて IKE-SAネゴ開始 ある エラー IPSEC-SAネゴ処理 ============ o generic - 内部変数 PFKEY_V2, IPSEC_DOI, IPRPOTO, ADMIN で別々の値を扱っている。 可能な限り ipsec_doi で持つ。 IPSEC_DOI > PFKEY_V2 IPSEC_DOI > IPPROTO IPSEC_DOI > ADMIN PFKEY_V2 > ADMIN - pfkey における src と dst の扱いに注意。 - register がほいほい湧いてくるが、その度に supported algorithm を修正すべき - kernel に設定する proxy は pfkey_update -> 常に phase 1 の local に一致するはず。 pfkey_add -> 常に phase 1 の remote に一致するはず。 o rekey - phase 2 ネゴ中に phase 1 が expire すると? -> ネゴ待ってから phase 1 expire - phase 2 が expire した時。 -> delete を投げる。 -> phase 1 SA がない時。 -> 何もしない。 - phase 1 のrekeyする/しない -> 関連する phase 2 SA 内のトラフィックを見てあれば rekey! -> mib か…? o informational exchange - phase 1 の m-id ? とりあえず埋める。 - etype は? とりあえず informational o phase1 - initiator側 - aggressive mode の dhgrp のネゴは? しないので、phase 2 PFS といっしょ。 - vendor-id を hash する関数は? o phase2 - receiver 側 initiator からの ID payload 無い時 src = local/32[0], dst = remote/32[0] tunnel は proxy = remote ネゴ完了したら pfkey_st, isakmp_ph2 レコード削除して待機。 -> expire 制御のためしない。 ※commit bit は? ※expire したら? 既にある phase 1 に該当する新しい acquire が湧いてきたら? もちろん使う。 o pfkey_st acquire src, dst, proxy で検索。SPI は無い。 getspi, add, update src, dst, SPI で検索。proxy は使わない。ユニークだから。 expire src, dst, SPI で検索。proxy は使わない。ユニークだから。 SOFT-> ネゴ開始 HARD-> どうしよう… o post command phase 1 終ったら予め設定されたファイルを実行出来る。 これ実行してねってネゴしないのは、なんとなくセキュリティのため。 o racoon のIV iv = ivd = ive proc(msg) do_encrypt(ive, iv) encode(ive) iv <- last block send するまで ivd は潰せない。 ive も send 成功するまで潰せない。 send(msg) ive <- iv ivd <- iv --- do_decrypt(iv, ive) ive <- last block decode 成功するまで encode しないので潰しても平気 decode(ivd) proc(msg) do_encrypt(ive, iv) encode(ive) iv <- last block send(msg) ive <- iv ivd <- iv ---