next up previous contents
Next: 7.3.2.4 FreeBSDでのIPsecの設定 Up: 7.3.2 SPD,SADの設定 Previous: 7.3.2.2 SADの設定

7.3.2.3 SPDの設定

SPDはIKEを使うか否かに関わらず必ず設定しなければならない項目です。 SPDは設定した瞬間から反映され、パケットはそのセキュリティポリシーに合致 するか否かを判断されます。SPDの設定にもsetkeyを用いるので、SADと混同しない ように注意してください。

SPDの設定コマンドは spdadd を用いて行います。

spdadd src-range dest-range upperspec policy ;

  1. src-range/dest-range 送信・宛先アドレスの範囲やポートの指定
    SADの設定と異なり、ポリシーの設定なので、アドレスの範囲まで含めて設定できます。 範囲の指定方法はプレフィックス長(/leng)を指定します。勿論、プレフィックスを 指定しない場合には単一のアドレスとして解釈されます。 また、アドレス(プレフィックス長を含む)の指定の後ろに [port]でポート 番号を指定できますが、ポート番号の範囲は指定出来ないようです。

    指定 範囲
      2001:512:240:a000::/64 2001:512:240:a000: をプレフィックスに持つ
      2001:512:240:a000::/60 2001:512:240:a000〜a007
      2001:512:240::/48 2001:512:240: をプレフィックスに持つ
      2001:512:240:a000::1[80] 2001:512:240:a000::1の80番ポート
      2001:512:240::/48[80] 2001:512:240::/48のネットの80番ポート

  2. upperspec 上位プロトコルの指定
    このポリシーとして合致させたい上位層のプロトコル番号あるいはプロトコル名( /etc/protocols に記載された名前)などが指定できます。

    upperspec 意味
      any 任意のプロトコル
      ipv6 IPv6
      41 IPv6(上と同じ)
      ipv4 IPv4
      tcp TCP
      udp UDP
      icmp ICMP
      ipv6-icmp ICMPv6

    なお、setkey のman には、現時点で転送(forwarding)に対しては この指定は動かないことが注意されています。実際、トンネルモードに指定された ルータなどでこれが動くためには、上位層のプロトコルのパケットが分割されて IPパケットに入っている場合があるので、それらをバッファリングした上で 、完全な形に再度組み立て、その上でこの指定に合致するか否かを チェックする必要があるからです(extra reassembly が必要だからとmanにはあります)。

  3. policy ポリシーの指定

    ここまでのIPアドレス、プロトコルの指定に合致し、 下の方向 (in または out )に合うパケットに対して、適用すべき ポリシーをここで指定します。

    ポリシーの指定は、以下の3つのパターンに分かれます。

    -P 方向 discard  
    -P 方向 none  
    -P 方向 ipsec protocol/mode/src-dst/level
    (-Pを頭につけることを忘れないでください。)

    discard, none, ipsecの意味はそれぞれ以下の通りです。

    キーワード 意味
    discard 適合するパケットを捨てる
    none 適合するパケットに対してIPsec操作をしない
    ipsec 適合するパケットに対してIPsec操作を行う

    また、ipsec に続くオプションの意味は次の通りです。

実際の設定について見てみましょう。

以下本文中では、IPv6アドレスは単に A, B と書くことにします。

SPDエントリを設定する際には、SAに対応して片方向づつ設定しなければならない ということです。そのために、送信者アドレスと宛先アドレスが、方向によって 逆になる点に注意しなければならない。

下の例では、A 上での SPD の設定で、B との 通信に関する記述です。

従って、

    A   ----- (out)-->  B
    A   <---- (in)----  B

という方向について記述しなければなりません。

以下では、SAについても設定をした例を掲げます。

    #### 以下 host A の設定 ####
    # setkey -c
    flush;
    spdflush;
    add A B esp 1000 -E des-cbc  0x0123456789ABCDEF;
    add B A esp 1001 -E des-cbc  0x0123456789ABCDEF;
    spdadd A B any -P out ipsec esp/transport//require;
    spdadd B A any -P in  ipsec esp/transport//require;

一方、通信する相手である B 側では上と方向を逆にして設定をします。

    #### 以下 host B の設定 ####
    # setkey -c
    flush;
    spdflush;
    add B A esp 1001 -E des-cbc  0x0123456789ABCDEF;
    add A B esp 1000 -E des-cbc  0x0123456789ABCDEF;
    spdadd B A any -P out ipsec esp/transport//require;
    spdadd A B any -P in  ipsec esp/transport//require;

先に書いたように、一つの通信に対して、片方向づつ2つの記述が SPD,SADの 両方に必要なのですが、問題は実際のアドレスに何を使うかが問題になります。

例えば、aliasで別のIPアドレスを振っても、そのインターフェースから出て行く IPアドレスは正式なインターフェースのIPアドレスになるので、2つの IPアドレス間の通信と言っても、どちらからどちらかに通信を始めるかによって、 違ってきます。また、同じセグメント内の場合には、自分のアドレスと 宛先アドレスの一致が最も長いソースアドレスを自動的に選択して通信しようと しますので、そのようなIPアドレスについて迷うような場合には、全ての IPアドレスについてのSPD,SADを書かねばなりません。


next up previous contents
Next: 7.3.2.4 FreeBSDでのIPsecの設定 Up: 7.3.2 SPD,SADの設定 Previous: 7.3.2.2 SADの設定
Noriyo Kanayama