動的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.conf
にaggressive=yes
を、/etc/strongswan.conf
にcharon { 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つが問題になります。
- トンネルインターフェースのIPアドレスを設定できない
- VyOSは(strongSwanは?)対向IPアドレスAnyでトランスポートモードを設定できない
1つめは当然ながらそうなのですが、後ほど紹介する対処法があります。
2つめは1つめの問題を解決すれば結果的に関係なくなるのですが、少し面白い状況なので記録を兼ねて紹介します。
対向IPアドレスが不定になる場合は、ipsecのremote-address
をany
に設定します。
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 prefix
とremote 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
input
(forward
ではなく)チェーンのルールに、上記のようなトンネル終端の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 1
のprefix
と対称になっている必要があります。 - 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を張ることができました。
試行錯誤した結果なので、実はもっと簡潔な設定方法があるかもしれませんが、ひとまず成功事例として紹介します。
最近のコメント