動的IPアドレス(CGN)のNEC IXルータと固定IPアドレスのVyOS間でサイト間IPsec VPNを張る

こんにちは、tukapiyoです。

これまで私は、SEIL/X1+L-02C(インターリンクの固定IP SIM 128kbps使い放題プラン)を使って、VPS上のVyOSとIPsecのサイト間VPNを張っていました。
しかしこのためにわざわざ(低速な)SIMを契約して、速度的な問題から(?)通信も不安定だったため、どうにかこの環境を改善したいとずっと考えていました。

しかし色々調査してみると、今の環境ではどうも改善することができなさそうだと判断するに至ります。
そこで、NECのIXルータ(IX2207)+L-03Fを新たに調達し、家に余っていたIIJmioタイプDのSIMを組み合わせてVPNを張ることを決意するのでした。

IIJmioのSIMはCGN(キャリアグレードNAT)が行われるので、SIMに割り当てられるIPアドレスはシェアードIPアドレスです。
このため固定IP同士のように双方のIPアドレスを使った設定はできません。
このような環境でVPNを張って通信を行うことができるようになりましたので、情報をまとめたいと思います。

やりたいこと

IX2207(動的IPアドレス)対VyOS(固定IPアドレス)間でGRE over IPsecを張りたい。

SEIL/X1で動的IPからVPNを張れない

動的IPアドレスからVPNを張る方法

IPsecのサイト間VPNは拠点の片方が固定IPアドレスであれば、もう片方が動的IPアドレスが動的でも張ることができます。
このとき使うべきは、

  • IKEv1 Aggressive Mode
  • IKEv2

のどちらかです。
IKEv2ではモードの概念がなくなっていて、特段意識せずに動的IPアドレスを利用できそうです。

SEIL/X1の場合

SEIL/X1ではIKEv2に対応せず、必然的にIKEv1 Aggressive Modeを利用することになります。
しかし固定IPアドレス側のVyOSでは、IKEv1 Aggressive Modeの認証にPSK(事前共有鍵)を使う事ができません。

正確には使うことができないというか、セキュリティ上無効化されているので、strongSwan(VyOSの中で使われているVPNサーバ)の設定ファイルを書き換える必要があるのですが、VyOSでは直接設定ファイルの書き換えをサポートしていません。
ちなみにstrongSwanの設定ファイル書き換えについては、IIJ Enginieer Blogで紹介されています。

Linuxの /etc/ipsec.confaggressive=yes を、/etc/strongswan.confcharon { i_dont_care_about_security_and_use_aggressive_mode_psk = yes } を入れて無理やり折衝させます。

PSKに対応していないのであれば、RSA鍵かx.509証明書を使った認証も考えられますが、残念ながらSEIL/X1は対応していません。
詰み(罪)です。

NEC IXルータの場合

IXルータではIKEv2にも対応します。
勝利です。

ちなみにIKEv1の場合はPSKの認証しか対応しないようですが、IKEv2ではPSKの他にEAP-MD5とRSA鍵に対応するようです。
ただし今回はIKEv2+PSKの組み合わせで設定します。
IKEv1のAggressive Modeと違ってIKEv2+PSKはVyOS(strongSwan)で利用可能です。

比較

利用できる機能について比較してみました。
IKEv1はAggressive Modeに限って記載しています。

VyOS(接続先) SEIL/X1(接続元) IXルータ(接続元)
IKEv1 Aggressive Mode
└認証方式:PSK 非対応(Mainモードでは利用可) 対応 対応
└認証方式:RSA鍵 対応 非対応 非対応
└認証方式x:509証明書 対応 非対応 非対応
IKEv2
└認証方式:PSK 対応 IKEv2に非対応 対応
└認証方式:EAP-MD5 非対応 IKEv2に非対応 対応
└認証方式:RSA 対応 IKEv2に非対応 対応

このように2機種間(VyOS+α)で対応機能に差異があるため、VyOSと同じ認証方式で統一するなら、IXルータのPSKまたはRSA鍵を利用すれば良さそうだと分かりました。

動的IPからVPNを張る方法の検討

では簡単じゃないかと思ったそこのあなた、どうやらそうではなさそうです。

VyOSで固定IPアドレス同士のVPN設定

固定IPアドレス同士のVPNの場合、以下の様な設定を行っています。

set vpn ipsec authentication psk ピア名 id 自IPアドレス
set vpn ipsec authentication psk ピア名 id 対向IPアドレス
set vpn ipsec authentication psk ピア名 secret シークレット

set vpn ipsec ike-group IKE-group close-action start
set vpn ipsec ike-group IKE-group dead-peer-detection action restart
set vpn ipsec ike-group IKE-group dead-peer-detection interval 15
set vpn ipsec ike-group IKE-group disable-mobike
set vpn ipsec ike-group IKE-group ikev2-reauth
set vpn ipsec ike-group IKE-group key-exchange ikev2
set vpn ipsec ike-group IKE-group lifetime 3600
set vpn ipsec ike-group IKE-group proposal 1 dh-group 5
set vpn ipsec ike-group IKE-group proposal 1 encryption aes256
set vpn ipsec ike-group IKE-group proposal 1 hash sha256

set vpn ipsec esp-group ESP-group lifetime 3600
set vpn ipsec esp-group ESP-group mode transport
set vpn ipsec esp-group ESP-group pfs dh-group5
set vpn ipsec esp-group ESP-group proposal 1 encryption aes256
set vpn ipsec esp-group ESP-group proposal 1 hash sha256

set vpn ipsec site-to-site peer ピア名 authentication local-id 自IPアドレス
set vpn ipsec site-to-site peer ピア名 authentication remote-id 対向IPアドレス
set vpn ipsec site-to-site peer ピア名 authentication mode pre-shared-secret
set vpn ipsec site-to-site peer ピア名 connection-type initiate
set vpn ipsec site-to-site peer ピア名 default-esp-group ESP-group
set vpn ipsec site-to-site peer ピア名 ike-group IKE-group
set vpn ipsec site-to-site peer ピア名 ikev2-reauth inherit
set vpn ipsec site-to-site peer ピア名 local-address 自IPアドレス
set vpn ipsec site-to-site peer ピア名 remote-address 対向IPアドレス
set vpn ipsec site-to-site peer ピア名 tunnel 1 protocol gre

set interfaces tunnel tun10 address 自トンネルIPアドレス
set interfaces tunnel tun10 encapsulation gre
set interfaces tunnel tun10 source-address 自IPアドレス
set interfaces tunnel tun10 remote 対向IPアドレス

IPsecで自IPアドレスと対向IPアドレス間のGREプロトコルを暗号化対象に設定して、トンネルインターフェースでGREトンネルを張っています。

VyOSで対向Anyだとトランスポートモードが設定できない

しかし、動的IPを利用している環境では以下の2つが問題になります。

  1. トンネルインターフェースのIPアドレスを設定できない
  2. VyOSは(strongSwanは?)対向IPアドレスAnyでトランスポートモードを設定できない

1つめは当然ながらそうなのですが、後ほど紹介する対処法があります。
2つめは1つめの問題を解決すれば結果的に関係なくなるのですが、少し面白い状況なので記録を兼ねて紹介します。

対向IPアドレスが不定になる場合は、ipsecのremote-addressanyに設定します。

set vpn ipsec site-to-site peer ピア名 remote-address any

他にも設定を変える箇所はありますが、ここでは本質ではないので割愛します。
この状態でcommitを行うと問題無くコミットできますが、実はVyOSの再起動やrestart ipescを行ってstrongSwanサービスの再起動を行うとサービス起動に失敗します。

失敗したときのメッセージはこんな感じです。

# run restart ipsec
Job for strongswan.service failed because the control process exited with error code.
See "systemctl status strongswan.service" and "journalctl -xeu strongswan. service" for details.
IPsec process restarted
[edit]

journalctlでログを確認すると以下の様なエラーメッセージとともにサービス起動に失敗していることが分かります。

swanctl[25622]: loading connection 'ピア名' failed: invalid value for: remote_ts, config discarded

対向のトラフィックセレクタがおかしいよといわれています。
まぁよく考えれば当然ではあるのですが、普通に設定できてしまうので注意ポイントでした。

IXルータ同士で動的IPからVPNを張る

IXルータ同士であればおそらく簡単です。
設定例は、以下のサイトが参考になります。こちらはIKEv2トンネルモードでの設定例のようです。

またNECから公開されている機能説明書や設定事例集も参考になります。

1200ページにわたる機能説明書を読むと、以下の様な記載があります。

(e)GRE トンネルと IPsec の連携
GRE トンネルと物理インタフェース上の IPsec 設定を併用することにより、GRE トンネルのパケットを暗号化することができます。また、Ver.8.9 以降は、トンネルインタフェースで直接 GRE over IPsec を設定が可能です。
前者の方式は、動的アドレス環境で利用できない、性能が低いなどの制限がありますので、通常は後者のトンネルインタフェース方式を利用してください。
IPsec はトランスポートモードで利用します。トランスポートモードの詳細については、IPsec の項を参照してください。with-id-payload は必ず設定してください。
なお、Ver9.2 以降では GRE over IKEv2 も設定可能です。モードをトランスポートにして設定してください。

(機能説明書から抜粋)

記載の通り、IXルータではトンネルインターフェースを使って、トランスポートモードのIPsecで動的IPアドレスからGREトンネルを張ることができるようです。
# と書かれているものの、上で紹介した設定例や、NECから公開されている設定事例集を読むと、トンネルモード使ってる事例が多いんですけどね…

VyOS同士で動的IPからVPNを張る

VyOS同士でも簡単です。
VyOSのブログで設定例が公開されています。

動的IPアドレスを利用した設定については、「Configuring GRE/IPsec Using a Loopback Interface」の項を参考にします。

Loopbackインターフェース(dummyインターフェース)にIPアドレスを割り当てて、そのIPアドレス同士でGREトンネルを張ります。
IPsec自体はトンネルモードで、remote-address anyに設定し(上記ページでは設定省略されてますが)、tunnelのlocal prefixremote prefixにそれぞれdummyインターフェースのIPアドレスを設定するようです。

IXルータ(動的IP)とVyOS(固定IP)でVPNを張る

構成イメージ

設計方針

さて、そもそも固定IPアドレス同士のIPsecですら異機種間は魔境な訳ですが、動的IPアドレスを使ったものはより魔境です。
前項を見てもらえば分かる様に、設定の方向性がかなり違うことが分かります。

そこで設定方針を決めます。
前提として、VyOSよりIXルータの方が柔軟に設定ができそうなので、VyOSの設定になるべく寄せてみようと思います。

  • IKEv2を利用する(IKEv1を使う理由がないし、Aggressive ModeだとVyOSでPSKが使えない)
  • トンネルモードを利用する(VyOSもIXルータもトンネルモードの方がよさそう)
  • IPsecトンネルと、GREトンネルをそれぞれ作成する

VyOS 固定IPアドレス側

VyOS側は、eth0の固定IPアドレスでIPsec接続を行います。

set vpn ipsec authentication psk ピア名 id 自IPアドレス
set vpn ipsec authentication psk ピア名 id 対向ID
set vpn ipsec authentication psk ピア名 secret シークレット

set vpn ipsec ike-group IKE-group close-action start
set vpn ipsec ike-group IKE-group dead-peer-detection action restart
set vpn ipsec ike-group IKE-group dead-peer-detection interval 15
set vpn ipsec ike-group IKE-group disable-mobike
set vpn ipsec ike-group IKE-group ikev2-reauth
set vpn ipsec ike-group IKE-group key-exchange ikev2
set vpn ipsec ike-group IKE-group lifetime 3600
set vpn ipsec ike-group IKE-group proposal 1 dh-group 5
set vpn ipsec ike-group IKE-group proposal 1 encryption aes256
set vpn ipsec ike-group IKE-group proposal 1 hash sha256

set vpn ipsec esp-group ESP-group lifetime 3600
set vpn ipsec esp-group ESP-group mode tunnel
set vpn ipsec esp-group ESP-group pfs dh-group5
set vpn ipsec esp-group ESP-group proposal 1 encryption aes256
set vpn ipsec esp-group ESP-group proposal 1 hash sha256

set vpn ipsec site-to-site peer ピア名 authentication local-id 自IPアドレス
set vpn ipsec site-to-site peer ピア名 authentication remote-id 対向ID
set vpn ipsec site-to-site peer ピア名 authentication mode pre-shared-secret
set vpn ipsec site-to-site peer ピア名 connection-type respond
set vpn ipsec site-to-site peer ピア名 default-esp-group ESP-group
set vpn ipsec site-to-site peer ピア名 ike-group IKE-group
set vpn ipsec site-to-site peer ピア名 ikev2-reauth inherit
set vpn ipsec site-to-site peer ピア名 local-address 自IPアドレス
set vpn ipsec site-to-site peer ピア名 remote-address any
set vpn ipsec site-to-site peer ピア名 tunnel 1 local prefix 172.31.100.1/32
set vpn ipsec site-to-site peer ピア名 tunnel 1 remote prefix 172.31.100.2/32

set interfaces dummy dum0 address 172.31.100.1/30

set interfaces tunnel tun0 address 192.168.100.1/30
set interfaces tunnel tun0 encapsulation gre
set interfaces tunnel tun0 source-address 172.31.100.1
set interfaces tunnel tun0 remote 172.31.100.2

簡単に設定意図を示します。

  • 2行目、23行目
    これまでIDをIPアドレスで設定していましたが、対向IPアドレスは動的であるためIDを明示的に設定します。
  • 25行目
    固定IP側から動的IP側へ接続することはできないため、必然的に待ち受け側(respond)になります。
  • 31-32行目
    IPsec対象になるIPアドレスを設定しますが、今回はトンネル終端に利用するIPアドレス(dum0インターフェースのIPアドレス)を設定します。
  • 34行目
    設定例に沿って、トンネル終端のIPアドレスを別に割り当てます。
    VyOSにはこのような用途で利用できるダミーインターフェースがあります。
    ルーティングの観点で/30を設定しておきます。
  • 36行目
    トンネル内のIPアドレスを設定します。
    VPN内の実際のトラフィックはこちらのIPアドレスを使って行われます。
  • 38-39行目
    トンネルインターフェースの終端のIPアドレスを設定します。
    このIPアドレス間で行われるトンネル通信が暗号化対象です。

なお、MTUの設定は省略しているので、適宜設定してください。

またVyOS側は固定IPアドレスということで、当然ファイアウォールが設定されているはずです。
このままではIPsecが張れてもトンネルの通信が行えないので、ファイアウォールの設定も行います。

set firewall ipv4 name INPUT rule 10 set action return
set firewall ipv4 name INPUT rule 10 set ipsec match-ipsec
set firewall ipv4 name INPUT rule 10 set source address 172.31.100.2

inputforwardではなく)チェーンのルールに、上記のようなトンネル終端のIPアドレスからのIPsec通信を許可するように設定します。

IXルータ 動的IPアドレス側

IXルータは、USB-Serial0.0のLTEモバイルに割り当てられたシェアードIPアドレスを使ってIPsec接続を行います。

ikev2 authentication psk id ipv4 対向IPアドレス key char シークレット
!
interface Tunnel0.0
  tunnel mode ipsec-ikev2
  ip address 172.31.100.2/30
  ip tcp adjust-mss auto
  ikev2 child-lifetime 3600
  ikev2 child-pfs 1536-bit
  ikev2 child-proposal enc aes-cbc-256
  ikev2 child-proposal integrity sha2-256
  ikev2 connect-type auto
  ikev2 dpd interval 15
  ikev2 local-authentication id fqdn 自ID
  ikev2 nat-traversal keepalive 20
  ikev2 negotiation-direction initiator
  ikev2 outgoing-interface USB-Serial0.0
  ikev2 sa-lifetime 3600
  ikev2 sa-proposal enc aes-cbc-256
  ikev2 sa-proposal integrity sha2-256
  ikev2 sa-proposal dh 1536-bit
  ikev2 local-ts ipv4 address 172.31.100.2/32
  ikev2 remote-ts ipv4 address 172.31.100.1/32
  ikev2 ipsec-mode tunnel
  ikev2 peer 対向IPアドレス authentication psk id ipv4 対向IPアドレス
  no shutdown
!
interface Tunnel1.0
  tunnel mode gre ip
  tunnel source 172.31.100.2
  tunnel destination 172.31.100.1
  tunnel outgoing-interface Tunnel0.0
  tunnel df-bit auto
  ip address 192.168.100.2/30
  ip tcp adjust-mss auto
  no shutdown

こちらも簡単に設定意図を示します。

  • 1行目、24行目
    対向は固定IPなので、IPアドレスでIDを設定しています。
  • 5行目
    VyOS側ではダミーインターフェース(dum0)に割り当てていたトンネル終端のIPアドレスは、IXルータではIPsecトンネルインターフェースに直接割り当てます。
    こちらもルーティングの観点で/30を設定しておきます。
  • 13行目
    自IPアドレスは動的なので、IDを明示的に設定します。
    うちではFQDNを設定していますが、他のものでも問題無いと思われます。
  • 14行目
    CGN配下なので、nat-traversalを有効にします。
  • 15行目
    動的IP側から接続するため、initiatorを設定します。
  • 21-22行目
    IPsec対象になる通信として、GREトンネルの終端IPアドレスを指定します。
    この設定が、VyOSのtunnel 1prefixと対称になっている必要があります。
  • 29-30行目
    GREトンネルの終端IPアドレスを設定します。
  • 33行目
    トンネル内のIPアドレスを設定します。

IXルータにはLoopbackインターフェースがあり、VyOSでいうdummyインターフェースのようなことができそうだったのですが、実際にはLoopbackインターフェースは外部との疎通がないため、トンネルインターフェースにIPアドレスを設定しました。

なお、MTUの設定は省略しているので、適宜設定してください。

接続結果

VyOS側のトンネル接続状況を確認します。

$ show vpn ipsec connections
Connection       State    Type    Remote address  Local TS         Remote TS       Local id      Remote id    Proposal
---------------  -------  ------  --------------  ---------------  --------------- ------------  -----------  ---------------------------------------
ピア名           up       IKEv2   %any            -                -               自IPアドレス  対向ID       AES_CBC/256/HMAC_SHA2_256_128/MODP_1536
ピア名-tunnel-1  up       IPsec   %any            172.31.100.1/32  172.31.100.2/32 自IPアドレス  対向ID       AES_CBC/256/HMAC_SHA2_256_128/MODP_1536

IXルータ側のトンネル接続状況も確認します。

(config)# show ikev2 sa
IKEv2 SA - 1 created
Interface Tunnel0.0
  SPI (I)(snip)  (R)(snip)
    Remain lifetime[sec] : 2808
    Serial : 213
    Direction : responder
    Local Addr : 自IPアドレス:4500
    Peer Addr  : 対向IPアドレス:4500
    Local ID : FQDN 自ID
    Peer ID  : IPV4-ADDR 対向IPアドレス
    NAT detection : local side
    NAT-T keepalive interval[sec] : 20
    Status : establish
    Local message ID : 52
    Peer message ID  : 2
    Encryption alg : AES-CBC-256
      initiator key : (snip)
      responder key : (snip)
    Integrity alg : HMAC-SHA2-256-128
      initiator key : (snip)
      responder key : (snip)
    PRF alg  : HMAC-SHA2-256
    DH group : MODP-1536
    PFS : MODP-1536
    DPD : interval 15[sec]
    Child
      Prot SPI(IN)    SPI(OUT)   Lifetime[sec]
      ESP  (snip)     (snip)     2848

(config)# show ikev2 child-sa
Child SA - 1 connected
Interface Tunnel0.0
  IKE Peer ID : IPV4-ADDR 対向IPアドレス
    IKE SPI (I)(snip)  (R)(snip)
    IKE SA serial : 213
    Child SA
      Protocol : ESP
      Local Addr : 自IPアドレス:4500
      Peer Addr  : 対向IPアドレス:4500
      Enc alg  : AES-CBC-256
      Hash alg : HMAC-SHA2-256-128
      Remain lifetime[sec] : 2844
      Anti-replay : on
      UDP-encapsulation : on
      Direction is outbound
        SPI : (snip)
        Serial : 451
        Authkey : (snip)
        Enckey  : (snip)
      Direction is inbound
        SPI : (snip)
        Serial : 452
        Authkey : (snip)
        Enckey  : (snip)
      Local TS:
        TS type : IPV4-ADDR-RANGE
          Protocol any
            Address Range 172.31.100.2 to 172.31.100.2
            Port Range 0 to 65535
      Peer TS:
        TS type : IPV4-ADDR-RANGE
          Protocol any
            Address Range 172.31.100.1 to 172.31.100.1
            Port Range 0 to 65535
    Statistics
      Outbound
        309917 packets, 41569921 octets
        0 cipher failure, 0 out of memory, 0 ts unacceptable
        0 misc error, 0 invalid packet, 0 packet too big
      Inbound
        473300 packets, 504146062 octets
        0 invalid sa, 77 replay detected, 0 integrity failure
        0 cipher failure, 0 packet truncated, 0 invalid padding
        0 unknown protocol, 0 out of memory, 0 ts unacceptable
        0 misc error, 0 tcp chksum error, 0 invalid packet
        0 recv error
    History
      Time                Event
      (snip)              (snip)

(snip)は省略を示します。

無事接続できました。

まとめ

上記のように異機種間ではあるものの、動的IPアドレス(しかもCGN配下のシェアードIPアドレス)からサイト間VPNを張ることができました。

試行錯誤した結果なので、実はもっと簡潔な設定方法があるかもしれませんが、ひとまず成功事例として紹介します。

おすすめ

コメントを残す

Amazon プライム対象