フロートリンクによる多拠点型IPsec-VPN(IPv4 メッシュ型)

コンフィグテンプレートを使用し多拠点間のメッシュ型VPNをシンプルに構成する設定例。

始める前に

  • SMFv2サービスのサービスアダプタとして登録する必要があります。
  • コンフィグテンプレートを使用します。
  • IPsec VPNおよびフロートリンクの基本的な利用方法の理解が必要です。

このタスクについて

  • テンプレートの条件分岐マクロにより、一つのテンプレートでPPPoEまたはDHCPによるWAN接続に対応します。PPPoEを利用する実網テストやルータ配下のDHCP環境でのテストに応用できます。
  • テンプレートのループ処理マクロにより対向拠点毎の個別設定を自動生成します。拠点数の増減時ににコンフィグを編集する必要がありません。
  • 拠点間の通信にVPNを使用し、それ以外のインターネットアクセスは直接WAN回線を使用します。
  • ここでは3拠点分のサンプルパラメータを用意していますが、追加拠点も容易に設定できます。
  • IPsec NAT Traversalが働きますが、対向毎に一方はNAT配下でない必要があります。
  • 拠点間通信がNATを経由しないプライベートネットワーク内でのテストも可能です。但しサービスホストへの到達性は必要です。

構成イメージ

設定例

サンプルコンフィグ

テンプレート名
IPv4_IPsecVPN_fullMesh
#if( ${wan_interface} == "ge0" )
interface.ge0.ipv4.address : dhcp
route.ipv4.0.destination   : default
route.ipv4.0.gateway       : dhcp
#else
interface.pppoe0.id        : ${pppoe0_id}
interface.pppoe0.password  : ${pppoe0_password}
route.ipv4.0.destination   : default
route.ipv4.0.gateway       : pppoe0
#end

#foreach( ${peer} in ${IPv4_IPsecVPN_fullMesh} )
#if ( ${system.sa_code} != ${peer.system.sa_code} )
interface.ipsec${loopCount}.floatlink.address-family : ipv4
interface.ipsec${loopCount}.floatlink.my-address     : ${wan_interface}
interface.ipsec${loopCount}.floatlink.key            : *floatlinkGroupKey*
interface.ipsec${loopCount}.floatlink.name-service   : *https://floatlinkurl*
interface.ipsec${loopCount}.floatlink.my-node-id     : ${system.sa_code}
interface.ipsec${loopCount}.floatlink.peer-node-id   : ${peer.system.sa_code}
interface.ipsec${loopCount}.preshared-key            : *preSharedKey*
route.ipv4.10.destination : ${peer.lan_prefixlen}.0/24
route.ipv4.10.gateway     : ipsec${loopCount}
#end
#end

interface.ge1.ipv4.address : ${lan_prefixlen}.1/24

nat.ipv4.napt.0.private   : ${lan_prefixlen}.0-${lan_prefixlen}.1.255
nat.ipv4.napt.0.interface : ${wan_interface}

dhcp.server.service         : enable
dhcp.server.0.interface     : ge1
dhcp.server.0.pool.address  : ${lan_prefixlen}.101/24
dhcp.server.0.pool.count    : 150
dhcp.server.0.dns.0.address : ${lan_prefixlen}.1

dns-forwarder.service                 : enable
dns-forwarder.0.address               : dhcp
dns-forwarder.1.address               : ipcp
dns-forwarder.listen.ipv4.0.interface : ge1

resolver.service     : enable
resolver.0.address   : dhcp
resolver.1.address   : ipcp

コンフィグ内の置換必須箇所

サンプルコンフィグをそのままテンプレートコンフィグ入力フォームにコピー&ペーストできますが、下線箇所は置換が必須です。
設定項目 置換必須箇所 書式
IKEの事前共有鍵 *preSharedKey* 秘匿すべき任意文字列の鍵
フロートリンクのネームサーバ *https://floatlinkurl* サービスから指定されたURL
フロートリンクのグループキー *floatlinkGroupKey* 任意文字列のグループ識別子

用意するパラメータ

設定項目 テンプレート変数 拠点1の例 拠点2の例 拠点3の例 備考
LANのネットワークプレフィックス ${lan_prefixlen} 192.168.1 192.168.2 192.168.3
使用するWANインタフェース ${wan_interface} ge0 ge0 pppoe0 ge0またはpppoe0
PPPoEのID ${pppoe0_id} user03@example.jp pppoe0の場合必須
PPPoEのパスワード ${pppoe0_password} user02passowrd pppoe0の場合必須

マクロコマンドとマクロ内の変数

${lan_prefixlen}
IPアドレスのネットワーク部のみ変数化し、複数のIPアドレス指定箇所に使用します。拠点個別の設定自由度が下がりますが、拠点追加時の設定誤りを避けることができます。
サンプルでは "192.168.1" から次の値が展開されます。
  • ge0 のIPアドレス (192.168.1.1/24)
  • ge0 のネットワークアドレス (192.168.1.0/24)
  • NAPT適用範囲 (192.168.1.0-192.168.1.255)
  • DHCPアドレスプールの先頭 (192.168.1.101/24)
#if( ${wan_interface} == "ge0" ) ~ #else ~ #end
#if() ~ #end は条件分岐を行うマクロコマンドです。対象拠点のWANインタフェースが ge0一致する(==)ことを条件にDHCPによるWAN接続を設定し、そうでない(pppoe0)の場合は #else 以降のPPPoE接続を設定します。
インタフェースに依存するデフォルト経路もここで設定します。
#foreach( ${peer} in ${IPv4_IPsecVPN_fullMesh} ) ~ #end
#foreach() ~ #end はループ処理を行うマクロコマンドです。
IPv4_IPsecVPN_fullMesh はテンプレート名を記述します。任意の文字列を使用できますが、テンプレート名と一致する必要があります。
このテンプレートに所属する先頭のSAの変数セットを${peer}に代入します。この値はループするたび次のSAの変数セットに置き換わります。peer は任意の文字列を使用できます。
#if ( ${system.sa_code} != ${peer.system.sa_code} ) ~ #end
ここでは左辺と右辺が一致しない(!=)ことを条件にマクロ内のコンフィグを展開します。
${system.sa_code} はシステム定義変数です。このテンプレートの展開対象のSAコードに置き換わります。
${peer.system.sa_code} は現在ループ処理中のSAの変数セット(peer)からSAコードを取り出します。つまり対向拠点のSAコードにあたります。
ループ処理の対象はテンプレートに所属する全SAが含まれるため、テンプレート展開対象のSAコードと対向拠点のSAコードが同じ場合にはコンフィグを展開しません。
また、...floatlink.my-node-id :...floatlink.peer-node-id : にそれぞれ指定しVPN対向を定義しています。
さらに、対向拠点のネットワークアドレスを ${peer.lan_prefixlen}.0/24 のように展開し、IPsecインタフェースをゲートウェイとする静的経路を設定します。
ipsec${loopCount}
${loopCount}はループ位置(回数)の数値に置き換わるシステム定義変数です。0から始まりループするたびインクリメントされます。
ここでは対向拠点ごとに異なるインタフェース名を割り当てるために使用しています。
floatlink.my-node-id : ${system.sa_code}-pppoe0
システム定義変数を利用してSAコードを自身のノードIDとしています。

その他のコンフィグの説明

NAPT (nat.ipv4.napt...)
NAPTの適用範囲と適用インタフェースにテンプレート変数を使用しています。
DHCPサーバ (dhcp.server...)
NAPTと同様にアドレスプールの範囲等にテンプレート変数を使用しています。
DNS中継 (dns-forwarder...)
DNSアドレスの取得にIPCPとDHCPを両方指定しています。DNS中継ではいずれか取得可能であったDNSを使用するため、条件分岐マクロを記述する必要はありません。
リゾルバ (resolver)
DNS中継と同様に、DNSアドレスの取得にIPCPとDHCPを両方指定しています。
IPフィルタ (filter.ipv4...)
このサンプルではコンフィグをシンプルにするためIPフィルタの設定を省いていますが、実際の運用では適切なフィルタを設定してください。

動作確認