今回もOSSな仮想ルータであるVyOSを使用し、拠点間のVPN通信を確立させてみた。
IPsecによる拠点間通信を行う際、通信の暗号化の手段としてGREトンネル経由の通信やVTIを使用しての通信が挙げられるが、今回は、暗号化通信の開始地点及び終端地点を明示的に定義するだけで(とは大袈裟だが...)暗号化通信が出来る、IPsec VTIを確立させてみた。
GRE over IPsec VPNに関しては前回の記事(VyOSでGRE over IPsec VPN構成を組んでみた)を参照。
https://debslink.hatenadiary.jp/entry/20220130/1643510508
当方の環境
ホストOS:macOS 10.13.6 / MacBook Air 2011 / RAM: 4GB / CPU: Intel Core i7 1.8GHz
Oracle VirtualBox:6.1.32
ゲストOS:Alpine Linux 3.14.3 (x86_64)、VyOS 1.4 rolling-202104111334
Alpine LinuxとVyOS共に、安定動作の為に要求されるホスト機側のスペックが低い為、ホスト機のRAMが4GBしか無いにも関わらず、4台共に安定動作していた。
構成
Alpine Linux(user-01)とVyOS(jpmtkvmrt98)が居る拠点をユーザサイト、VyOS(jpmtkvmrt99)とAlpine Linux(jpmtkvmsv01)が居る拠点をデータセンタ側とした。
構成図内の緑色の文字列(intnet01など)は、VirtualBoxのネットワークアダプタ設定の内部ネットワーク(Internal Network)名である。
接続先と対になる感じで名称を設定すると、仮想的にケーブルが接続されたような状態となる。
※図をクリックすると拡大表示します
IPsec VTIとは
VTIとは"Virtual Tunnel Interface"の略。VTIを有効にした機器間で暗号化された通信が流れる。
前回のGRE over IPsec VPNではマルチキャストを通すには別途オプションを付けて有効にしたが、VTIではデフォルトでマルチキャストを通す。
IPsecのプロセスがVTIを有効にしたインタフェースに割り当てられ、そこに流れる通信は自動で暗号化される為、前回の記事で扱ったGRE over IPsec VPNのような暗号化に関する細かな設定は不要である。
VyOSの初期設定
WAN側およびLAN側のインタフェースは設定済み。
ユーザサイト側のWANルータ、jpmtkvmrt98の初期設定は以下のとおり。
当記事ではVirtualBoxの設定の詳細に関しては割愛する。今回はRAMは512MB、ネットワークアダプタはWAN側LAN側共に準仮想化ネットワーク(英語版ではParavirtualized Network)を選択している。
vyos@jpmtkvmrt98:~$ show configuration interfaces { ethernet eth0 { address 192.168.3.98/24 hw-id 08:00:27:e0:15:21 } ethernet eth1 { address 192.168.100.1/24 hw-id 08:00:27:ee:ee:47 } ethernet eth2 { hw-id 08:00:27:1d:9b:1c } loopback lo { address 10.1.1.98/32 } } service { ssh { } } system { config-management { commit-revisions 100 } conntrack { modules { ftp h323 nfs pptp sip sqlnet tftp } } console { device ttyS0 { speed 115200 } } host-name jpmtkvmrt98 login { user vyos { authentication { encrypted-password **************** plaintext-password **************** } } } ntp { server 210.173.160.27 { prefer } server 210.173.160.57 { } } syslog { global { facility all { level info } facility protocols { level debug } } } time-zone Asia/Tokyo } vyos@jpmtkvmrt98:~$
データセンタ側のWANルータ、jpmtkvmrt99の初期設定は以下のとおり。
vyos@jpmtkvmrt99:~$ show configuration interfaces { ethernet eth0 { address 192.168.3.99/24 hw-id 08:00:27:bb:a8:c5 } ethernet eth1 { address 192.168.200.1/24 hw-id 08:00:27:f9:51:96 } ethernet eth2 { hw-id 08:00:27:18:80:15 } loopback lo { address 10.1.1.99/32 } } service { ssh { } } system { config-management { commit-revisions 100 } conntrack { modules { ftp h323 nfs pptp sip sqlnet tftp } } console { device ttyS0 { speed 115200 } } host-name jpmtkvmrt99 login { user vyos { authentication { encrypted-password **************** plaintext-password **************** } } } ntp { server 210.173.160.27 { prefer } server 210.173.160.57 { } } syslog { global { facility all { level info } facility protocols { level debug } } } time-zone Asia/Tokyo } vyos@jpmtkvmrt99:~$
IPsecの設定
ここから、IKEプロポーサルやESPプロポーサル、IPsec、VTI、OSPFの各設定に入る。
GRE over IPsec VPNより設定が簡単と言うものの、トンネル関連の設定はIPsec VTIでも必要である。
今回は、オプション値はGRE over IPsec VPNの設定の際に使用した内容を流用。
IKEプロポーザルの設定
IKE(Internet Key Exchange)とは、IPsecのポリシーや暗号方式のネゴシエーション、鍵交換、相互認証等に使用される鍵交換の為のプロトコルである。
dead-peer-detection等のオプションは必須ではなく、GRE over IPsec VPNの設定時より簡略化された内容となる。
IKEに有るプロポーザル交換という機能により、IPsecを確立する通信機器間でIKEで使用するパラメータを定義し、パラメータが一致したらIKEが確立される。
まずは、ユーザサイト側のWANルータjpmtkvmrt98にて設定。
vyos@jpmtkvmrt98:~$ configure [edit] vyos@jpmtkvmrt98# set vpn ipsec ike-group VYOS-IKE proposal 1 dh-group 2 [edit] vyos@jpmtkvmrt98# set vpn ipsec ike-group VYOS-IKE proposal 1 encryption aes128 [edit] vyos@jpmtkvmrt98# set vpn ipsec ike-group VYOS-IKE proposal 1 hash sha1
ESPプロポーザルの設定
ESP(Encapsulated Security Payload)は、パケットが改竄されていないかどうかの認証と、パケットのペイロード部の暗号化を行う。
IPsecを確立する通信機器間でペイロード部の暗号化で使用するパラメータを定義し、パラメータが一致したらIKEが確立される。
当環境では、暗号化方式はAES(Advanced Encryption Standard)、ハッシュ関数はSHA-1(Secure Hash Algorithm)に指定。
[edit] vyos@jpmtkvmrt98# set vpn ipsec esp-group VYOS-ESP proposal 1 encryption aes128 [edit] vyos@jpmtkvmrt98# set vpn ipsec esp-group VYOS-ESP proposal 1 hash sha1
IPSecの設定
IPsecを確立するIPアドレスや事前共有鍵、使用するIKE等を設定する。
site-to-site peerでIPsecを確立させたい相手のWAN側のIPアドレスを指定、local-addressで自側のWAN側のIPアドレスを指定。
[edit] vyos@jpmtkvmrt98# set vpn ipsec site-to-site peer 192.168.3.99 authentication mode pre-shared-secret [edit] vyos@jpmtkvmrt98# set vpn ipsec site-to-site peer 192.168.3.99 authentication pre-shared-secret SomePreSharedKey [edit] vyos@jpmtkvmrt98# set vpn ipsec site-to-site peer 192.168.3.99 ike-group VYOS-IKE [edit] vyos@jpmtkvmrt98# set vpn ipsec site-to-site peer 192.168.3.99 local-address 192.168.3.98
VTIの設定
対向先との間でVTIによるトンネル確立の為の設定。
先にVTIインタフェースへIPアドレスの設定を行い、その後にVTIをIPsec及びESPに紐付けさせる。
VyOSの場合、後でVTIにIPアドレスをアサインするとcommit実行の際に弾かれる為、要注意。
[edit] vyos@jpmtkvmrt98# set interfaces vti vti0 address 192.168.1.1/24 [edit] vyos@jpmtkvmrt98# set vpn ipsec site-to-site peer 192.168.3.99 vti bind vti0 [edit] vyos@jpmtkvmrt98# set vpn ipsec site-to-site peer 192.168.3.99 vti esp-group VYOS-ESP
OSPFの設定
暗号化させたい通信をVTIに通す事から、物理インタフェースeth0ではなくVTIインタフェースvti0に割り当てたネットワークアドレスで設定し、vti0でOSPFを喋らせる。
物理インタフェースでOSPFを喋らせると通信はVTIを通らず暗号化されないまま対向先に流れる為、show vpn ike saコマンド実行の際Bytes In/OutやPackets In/Outがカウントされなくなる。
router-idの設定の有無はIPsec VTIの通信への影響は無いが、自分の場合OSPFの設定時には必ず設定を入れている。
[edit] vyos@jpmtkvmrt98# set protocols ospf area 0.0.0.0 network 192.168.1.0/24 [edit] vyos@jpmtkvmrt98# set protocols ospf parameters router-id 10.1.1.98 [edit] vyos@jpmtkvmrt98# set protocols ospf redistribute connected
設定内容の保存
OSPFの設定まで終えたら、設定内容をcommitしsaveコマンドで設定内容を/config/config.bootに保存。
IKEプロポーザルやESPプロポーザル等各項目毎に保存しても良い。
[edit] vyos@jpmtkvmrt98# commit [ vpn ipsec ] loaded ike secret 'ike_192-168-3-99' loaded connection 'peer_192-168-3-99' successfully loaded 1 connections, 0 unloaded [edit] vyos@jpmtkvmrt98# exit exit vyos@jpmtkvmrt98:~$
対向先の設定
引き続き、データセンタ側のルータjpmtkvmrt99にて設定。
上記にてユーザサイト側で設定した内容をテレコにしたような内容である。
IKEプロポーザルの設定
vyos@jpmtkvmrt99:~$ configure [edit] vyos@jpmtkvmrt99# set vpn ipsec ike-group VYOS-IKE proposal 1 dh-group 2 [edit] vyos@jpmtkvmrt99# set vpn ipsec ike-group VYOS-IKE proposal 1 encryption aes128 [edit] vyos@jpmtkvmrt99# set vpn ipsec ike-group VYOS-IKE proposal 1 hash sha1
ESPプロポーザルの設定
[edit] vyos@jpmtkvmrt99# set vpn ipsec esp-group VYOS-ESP proposal 1 encryption aes128 [edit] vyos@jpmtkvmrt99# set vpn ipsec esp-group VYOS-ESP proposal 1 hash sha1
IPSecの設定
[edit] vyos@jpmtkvmrt99# set vpn ipsec site-to-site peer 192.168.3.98 authentication mode pre-shared-secret [edit] vyos@jpmtkvmrt99# set vpn ipsec site-to-site peer 192.168.3.98 authentication pre-shared-secret SomePreSharedKey [edit] vyos@jpmtkvmrt99# set vpn ipsec site-to-site peer 192.168.3.98 ike-group VYOS-IKE [edit] vyos@jpmtkvmrt99# set vpn ipsec site-to-site peer 192.168.3.98 local-address 192.168.3.99
VTIの設定
[edit] vyos@jpmtkvmrt99# set interfaces vti vti0 address 192.168.1.2/24 [edit] vyos@jpmtkvmrt99# set vpn ipsec site-to-site peer 192.168.3.98 vti bind vti0 [edit] vyos@jpmtkvmrt99# set vpn ipsec site-to-site peer 192.168.3.98 vti esp-group VYOS-ESP
OSPFの設定
[edit] vyos@jpmtkvmrt99# set protocols ospf area 0.0.0.0 network 192.168.1.0/24 [edit] vyos@jpmtkvmrt99# set protocols ospf parameters router-id 10.1.1.99 [edit] vyos@jpmtkvmrt99# set protocols ospf redistribute connected
設定内容の保存
OSPFの設定まで終えたら、設定内容をcommitしsaveコマンドで設定内容を/config/config.bootに保存。
IKEプロポーザルやESPプロポーザル等各項目毎に保存しても良い。
[edit] vyos@jpmtkvmrt99# commit [ vpn ipsec ] loaded ike secret 'ike_192-168-3-98' loaded connection 'peer_192-168-3-98' successfully loaded 1 connections, 0 unloaded [edit] vyos@jpmtkvmrt99# save Saving configuration to '/config/config.boot'... Done [edit] vyos@jpmtkvmrt99# exit exit vyos@jpmtkvmrt99:~$
設定後の動作確認
GRE over IPsec VPNの時と同様に、show vpn ike saコマンドを叩き、IKEのSAが正常に確立されているか確認。
対向先(Peer ID/IP)、自側(Local ID/IP)共に見えている事、Stateがup、IKEのバージョンやEncryptの方式などが見えている事から、IKEのSAが正常に確立されている事が分かる。
vyos@jpmtkvmrt98:~$ show vpn ike sa Peer ID / IP Local ID / IP ------------ ------------- 192.168.3.99 192.168.3.99 192.168.3.98 192.168.3.98 State IKEVer Encrypt Hash D-H Group NAT-T A-Time L-Time ----- ------ ------- ---- --------- ----- ------ ------ up IKEv2 AES_CBC_128 HMAC_SHA1_96 MODP_1024 no 58 0 vyos@jpmtkvmrt98:~$
vyos@jpmtkvmrt99:~$ show vpn ike sa Peer ID / IP Local ID / IP ------------ ------------- 192.168.3.98 192.168.3.98 192.168.3.99 192.168.3.99 State IKEVer Encrypt Hash D-H Group NAT-T A-Time L-Time ----- ------ ------- ---- --------- ----- ------ ------ up IKEv2 AES_CBC_128 HMAC_SHA1_96 MODP_1024 no 113 0 vyos@jpmtkvmrt99:~$
次に、show vpn ipsec saコマンドを叩き、ESPのSAが正常に確立されているか確認。
Connection欄にて対向先が見えている事、Stateがupである事、Uptimeがカウントされている事等から、ESPのSAが正常に確立されている事が分かる。
vyos@jpmtkvmrt98:~$ show vpn ipsec sa Connection State Uptime Bytes In/Out Packets In/Out Remote address Remote ID Proposal --------------------- ------- -------- -------------- ---------------- ---------------- ----------- ------------------------ peer_192-168-3-99_vti up 1m15s 0B/0B 0/0 192.168.3.99 N/A AES_CBC_128/HMAC_SHA1_96 vyos@jpmtkvmrt98:~$
vyos@jpmtkvmrt99:~$ show vpn ipsec sa Connection State Uptime Bytes In/Out Packets In/Out Remote address Remote ID Proposal --------------------- ------- -------- -------------- ---------------- ---------------- ----------- ------------------------ peer_192-168-3-98_vti up 1m26s 0B/0B 0/0 192.168.3.98 N/A AES_CBC_128/HMAC_SHA1_96 vyos@jpmtkvmrt99:~$
上記で作成したvtiインタフェースの状態を確認。
S(State)とL(Link)共にu(Up)の状態である事が分かる。
vyos@jpmtkvmrt98:~$ show interfaces vti Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down Interface IP Address S/L Description --------- ---------- --- ----------- vti0 192.168.1.1/24 u/u vyos@jpmtkvmrt98:~$
vyos@jpmtkvmrt99:~$ show interfaces vti Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down Interface IP Address S/L Description --------- ---------- --- ----------- vti0 192.168.1.2/24 u/u vyos@jpmtkvmrt99:~$
OSPFのネイバ関係を確認。
上記で作成したvti0インタフェースを介し、OSPFネイバ関係が確立出来ている事が分かる。
vyos@jpmtkvmrt98:~$ show ip ospf neighbor Neighbor ID Pri State Dead Time Address Interface RXmtL RqstL DBsmL 10.1.1.99 1 Full/DR 36.188s 192.168.1.2 vti0:192.168.1.1 0 0 0 vyos@jpmtkvmrt98:~$
vyos@jpmtkvmrt99:~$ show ip ospf neighbor Neighbor ID Pri State Dead Time Address Interface RXmtL RqstL DBsmL 10.1.1.98 1 Full/Backup 31.029s 192.168.1.1 vti0:192.168.1.2 0 0 0 vyos@jpmtkvmrt99:~$
ここで、ユーザサイト(user-01)側からサーバ(jpmtkvmsv01)に対しPingを5発打ってみる。
tcpdumpコマンドでパケットキャプチャを実行したい場合は、Pingを打つ前に実行する。
VyOSでのtcpdump実行に関しては、以下の記事(VyOSの中に保存されているファイルを吸い出す)を参照。
https://debslink.hatenadiary.jp/entry/20220131/1643632170
ユーザサイト側からサーバ側にVTIの暗号化された通信が流れたら、show vpn ipsec saコマンドの出力内容に有る Bytes In/Out と ackets In/Out の欄がカウントされる。
hoge@user-01:$ ping -c 5 192.168.200.2 PING 192.168.200.2 (192.168.200.2): 56 data bytes 64 bytes from 192.168.200.2: seq=0 ttl=62 time=2.445 ms 64 bytes from 192.168.200.2: seq=0 ttl=62 time=1.607 ms 64 bytes from 192.168.200.2: seq=0 ttl=62 time=27.461 ms 64 bytes from 192.168.200.2: seq=0 ttl=62 time=2.499 ms 64 bytes from 192.168.200.2: seq=0 ttl=62 time=2.329 ms --- 192.168.200.2 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max = 1.607/7.268/27.461 ms hoge@user-01:$
Pingを打ち終えたらtcpdumpを止めて、show vpn ipsec saコマンドを実行。
Bytes In/Out欄とPackets In/Out欄共にカウントが増えた。
よって、ユーザサイト側からサーバへのIPSec通信が正常に行われた事が分かる。
急用で暫く席を外していたら、想定以上にカウンタが増えていた...
vyos@jpmtkvmrt98:~$ show vpn ipsec sa Connection State Uptime Bytes In/Out Packets In/Out Remote address Remote ID Proposal --------------------- ------- -------- -------------- ---------------- ---------------- ----------- ---------------------------------- peer_192-168-3-99_vti up 10m27s 6K/6K 94/96 192.168.3.99 N/A AES_CBC_128/HMAC_SHA1_96/MODP_1024 vyos@jpmtkvmrt98:~$
vyos@jpmtkvmrt99:~$ show vpn ipsec sa Connection State Uptime Bytes In/Out Packets In/Out Remote address Remote ID Proposal --------------------- ------- -------- -------------- ---------------- ---------------- ----------- ---------------------------------- peer_192-168-3-98_vti up 10m38s 6K/6K 92/92 192.168.3.98 N/A AES_CBC_128/HMAC_SHA1_96/MODP_1024 vyos@jpmtkvmrt99:~$
tcpdumpの実行結果を、VyOSから吸い出したファイルを開いて確認。
ISAKMPおよびESPで暗号化された通信がキャプチャされている事が分かる。
※画像をクリックすると拡大表示します
設定投入後のVyOSのコンフィグ
以下は、IKEプロポーザル、ESPプロポーザル、IPSec、VTI、OSPFの各設定投入後に再度show configurationコマンドを実行。
ユーザサイト側のWANルータ、jpmtkvmrt98の設定は以下のとおり。
上記で投入した設定内容の他に、自動で生成される設定が有るようである。
vyos@jpmtkvmrt98:~$ show configuration interfaces { ethernet eth0 { address 192.168.3.98/24 hw-id 08:00:27:e0:15:21 } ethernet eth1 { address 192.168.100.1/24 hw-id 08:00:27:ee:ee:47 } ethernet eth2 { hw-id 08:00:27:1d:9b:1c } loopback lo { address 10.1.1.98/32 } vti vti0 { address 192.168.1.1/24 } } protocols { ospf { area 0.0.0.0 { network 192.168.1.0/24 } parameters { router-id 10.1.1.98 } redistribute { connected { } } } } service { ssh { } } system { config-management { commit-revisions 100 } conntrack { modules { ftp h323 nfs pptp sip sqlnet tftp } } console { device ttyS0 { speed 115200 } } host-name jpmtkvmrt98 login { user vyos { authentication { encrypted-password **************** plaintext-password **************** } } } ntp { server 210.173.160.27 { prefer } server 210.173.160.57 { } } syslog { global { facility all { level info } facility protocols { level debug } } } time-zone Asia/Tokyo } vpn { ipsec { esp-group VYOS-ESP { proposal 1 { encryption aes128 hash sha1 } } ike-group VYOS-IKE { proposal 1 { dh-group 2 encryption aes128 hash sha1 } } site-to-site { peer 192.168.3.99 { authentication { mode pre-shared-secret pre-shared-secret **************** } ike-group VYOS-IKE local-address 192.168.3.98 vti { bind vti0 esp-group VYOS-ESP } } } } } vyos@jpmtkvmrt98:~$
データセンタ側のWANルータ、jpmtkvmrt99の設定は以下のとおり。
vyos@jpmtkvmrt99:~$ show configuration interfaces { ethernet eth0 { address 192.168.3.99/24 hw-id 08:00:27:bb:a8:c5 } ethernet eth1 { address 192.168.200.1/24 hw-id 08:00:27:f9:51:96 } ethernet eth2 { hw-id 08:00:27:18:80:15 } loopback lo { address 10.1.1.99/32 } vti vti0 { address 192.168.1.2/24 } } protocols { ospf { area 0.0.0.0 { network 192.168.1.0/24 } parameters { router-id 10.1.1.99 } redistribute { connected { } } } } service { ssh { } } system { config-management { commit-revisions 100 } conntrack { modules { ftp h323 nfs pptp sip sqlnet tftp } } console { device ttyS0 { speed 115200 } } host-name jpmtkvmrt99 login { user vyos { authentication { encrypted-password **************** plaintext-password **************** } } } ntp { server 210.173.160.27 { prefer } server 210.173.160.57 { } } syslog { global { facility all { level info } facility protocols { level debug } } } time-zone Asia/Tokyo } vpn { ipsec { esp-group VYOS-ESP { proposal 1 { encryption aes128 hash sha1 } } ike-group VYOS-IKE { proposal 1 { dh-group 2 encryption aes128 hash sha1 } } site-to-site { peer 192.168.3.98 { authentication { mode pre-shared-secret pre-shared-secret **************** } ike-group VYOS-IKE local-address 192.168.3.99 vti { bind vti0 esp-group VYOS-ESP } } } } } vyos@jpmtkvmrt99:~$
今回はここまで。
Alpine Linux 2台(ユーザ機とFTPサーバ)とVyOS 2台(ユーザサイト側とデータセンタ側)でVirtualBox内に簡単なIPsec VTI構成を組み、ユーザ機とサーバ機との間でIPSecの通信を確立する事が出来た。
当環境では開発版(1.4.x)を使用している為、商用環境での実装はLTS版(1.3.x)が望ましい。LTS版を入手するにはVyOSを管理している団体との間でサブスクリプション契約が必要だが、LTSリリースの少し手前なrc版やepa版であれば下記リンク先(VyOS monthly snapshots and release candidates)から入手が可能である。
VyOSとIPSecに関する情報源
https://vyos.io/ VyOS
https://docs.vyos.io/en/latest/index.html VyOS User Guide
https://vyos.net/get/nightly-builds/ VyOS nightly build (バージョン1.4のダウンロードサイト)
https://changineer.info/network/vyatta/vyatta_ipsec_normal.html Vyatta(VyOS) IPsec設定 基礎編
https://blog.vyos.io/vyos-project-2019-june-update VyOS Project 2019 - June update
https://vyos.net/get/snapshots/#vyos-1.3.0-epa1 VyOS monthly snapshots and release candidates
VyOSに関する記事
https://debslink.hatenadiary.jp/entry/20220130/1643510508 VyOSでGRE over IPsec VPN構成を組んでみた
https://debslink.hatenadiary.jp/entry/20171001/1506867093 VyOSをNexus7で動かす
https://debslink.hatenadiary.jp/entry/20171009/1507517604 VyOSをVirtualBox+Vagrantで動かす
https://debslink.hatenadiary.jp/entry/2019/10/13/155145 AndroidスマホでVyOSを動かす