メモのページ - チラシの裏メモ 3枚目

通信技術や気になった事を黙々とメモし続ける

VyOSでGRE over IPsec VPN構成を組んでみた

OSSな仮想ルータであるVyOSを使用し、拠点間のVPN通信を確立させてみた。
IPsecによる拠点間通信を行う際、通信の暗号化の手段としてGREトンネル経由の通信やVTIを使用しての通信が挙げられる。
今回は、WANの通信の暗号化でよく採用される、IPsec上でGREを動かし中を通るユーザトラヒックとダイナミックルーティングの通信共にトンネリングさせる「GRE over IPsec VPN」を確立させてみた。
VyOSにGRE over IPsec VPNを実装する内容の記事はQiitaやはてなブログ等で散見されるものの、VyOSバージョン1.4での実装はあまり見かけない為、メモとして残した。


当方の環境
ホスト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)名である。
接続先と対になる感じで名称を設定すると、仮想的にケーブルが接続されたような状態となる。
※図をクリックすると拡大表示します



GRE over IPsec VPNとは
IPsecの技術にGREの技術を組み合わせてIPsecの上にGREを乗せて、拠点間通信を暗号化させて通信するというもの。
今回の環境ではWANの通信にてOSPFを動作させている為、OSPFによるルーティングも暗号化させるべくGREも乗せる事にした。
IPsecではユニキャストの通信しかトンネリング出来ないが、GREはマルチキャストの通信もトンネリングが出来る。IPsecの上にGREを乗せたような形になっている事からGRE over IPsec VPNとなっている。


VyOSの初期設定
WAN側およびLAN側のインタフェース、2台のVyOS間のルーティング設定(OSPF)は設定済み。
ユーザサイト側のWANルータ、jpmtkvmrt98の初期設定は以下のとおり。
当記事ではVirtualBoxの設定の詳細に関しては割愛する。今回はRAMは512MB、ネットワークアダプタはWAN側LAN側共に準仮想化ネットワーク(英語版ではParavirtualized Network)を選択している。

hoge@jpmtkvmrt98:~$ show configuration
interfaces {
    ethernet eth0 {
        address 192.168.3.98/24
        description "***To_jpmtkvmrt99_eth0***"
        hw-id 08:00:27:54:e6:1a
    }
    ethernet eth1 {
        address 192.168.100.1/24
        description "***To_LAN_Segment***"
        hw-id 08:00:27:b6:b3:85
    }
    ethernet eth2 {
        hw-id 08:00:27:01:52:54
    }
    ethernet eth3 {
        hw-id 08:00:27:3b:44:9f
    }
    loopback lo {
        address 10.1.1.98/32
        description "***Polling/Monitoring***"
    }
}
protocols {
    ospf {
        area 0.0.0.0 {
            network 192.168.3.0/24
        }
        interface eth0 {
            dead-interval 12
            hello-interval 3
        }
        log-adjacency-changes {
        }
        parameters {
            router-id 10.1.1.98
        }
        passive-interface eth1
        passive-interface eth2
        passive-interface eth3
        redistribute {
            connected {
            }
        }
    }
}
service {
    ssh {
    }
}
system {
    config-management {
        commit-revisions 100
    }
    console {
        device ttyS0 {
            speed 115200
        }
    }
    host-name jpmtkvmrt98
    login {
        user hoge {
            authentication {
                encrypted-password ****************
            }
        }
        user vyos {
            authentication {
                encrypted-password ****************
            }
        }
    }
    ntp {
        server 210.173.160.27 {
        }
        server 210.173.160.57 {
        }
    }
    syslog {
        global {
            facility all {
                level info
            }
            facility protocols {
                level debug
            }
        }
    }
    time-zone Asia/Tokyo
}
hoge@jpmtkvmrt98:~$


データセンタ側のWANルータ、jpmtkvmrt99の初期設定は以下のとおり。

hoge@jpmtkvmrt99:~$ show configuration
interfaces {
    ethernet eth0 {
        address 192.168.3.99/24
        description "***To_jpmtkvmrt98_eth0***"
        hw-id 08:00:27:e2:7d:ea
    }
    ethernet eth1 {
        address 192.168.200.1/24
        description "***To_jpmtkvmsw99_gi1/0/48***"
        hw-id 08:00:27:22:26:75
    }
    ethernet eth2 {
        hw-id 08:00:27:e0:76:6d
    }
    ethernet eth3 {
        hw-id 08:00:27:ec:28:85
    }
    loopback lo {
        address 10.1.1.99/32
        description "***Polling/Monitoring***"
    }
}
protocols {
    ospf {
        area 0.0.0.0 {
            network 192.168.3.0/24
        }
        interface eth0 {
            dead-interval 12
            hello-interval 3
        }
        log-adjacency-changes {
        }
        parameters {
            router-id 10.1.1.99
        }
        passive-interface eth1
        passive-interface eth2
        passive-interface eth3
        redistribute {
            connected {
            }
        }
    }
}
service {
    ssh {
    }
}
system {
    config-management {
        commit-revisions 100
    }
    console {
        device ttyS0 {
            speed 115200
        }
    }
    host-name jpmtkvmrt99
    login {
        user hoge {
            authentication {
                encrypted-password ****************
            }
        }
        user vyos {
            authentication {
                encrypted-password ****************
                plaintext-password ****************
            }
        }
    }
    ntp {
        server 210.173.160.27 {
        }
        server 210.173.160.57 {
        }
    }
    syslog {
        global {
            facility all {
                level info
            }
            facility protocols {
                level debug
            }
        }
    }
    time-zone Asia/Tokyo
}
hoge@jpmtkvmrt99:~$

対向先のルータjpmtkvmrt98と接続している状態につき、OSPFのネイバ関係は既に確立した状態。

hoge@jpmtkvmrt99:~$ show ip ospf neighbor

Neighbor ID     Pri State           Dead Time Address         Interface                        RXmtL RqstL DBsmL
10.1.1.98         1 Full/Backup       11.817s 192.168.3.98    eth0:192.168.3.99                    0     0     0

hoge@jpmtkvmrt99:~$



IPsecとトンネルの設定
ここから、IKEプロポーサルやESPプロポーサル、IPsec、GREの各設定に入る。
まずは、ユーザサイト側のWANルータjpmtkvmrt98にて設定。

IKEプロポーザルの設定
IKE(Internet Key Exchange)とは、IPsecのポリシーや暗号方式のネゴシエーション、鍵交換、相互認証等に使用される鍵交換の為のプロトコルである。
IKEに有るプロポーザル交換という機能により、IPsecを確立する通信機器間でIKEで使用するパラメータを定義し、パラメータが一致したらIKEが確立される。

hoge@jpmtkvmrt98:~$ configure
[edit]
hoge@jpmtkvmrt98# set vpn ipsec ike-group VYOS-IKE dead-peer-detection action restart
[edit]
hoge@jpmtkvmrt98# set vpn ipsec ike-group VYOS-IKE dead-peer-detection interval 15
[edit]
hoge@jpmtkvmrt98# set vpn ipsec ike-group VYOS-IKE dead-peer-detection timeout 90
[edit]
hoge@jpmtkvmrt98# set vpn ipsec ike-group VYOS-IKE lifetime 28800
[edit]
hoge@jpmtkvmrt98# set vpn ipsec ike-group VYOS-IKE proposal 1 dh-group 2
[edit]
hoge@jpmtkvmrt98# set vpn ipsec ike-group VYOS-IKE proposal 1 encryption aes128
[edit]
hoge@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)、IPsec SAの生存時間を3600秒に指定。

[edit]
hoge@jpmtkvmrt98# set vpn ipsec esp-group VYOS-ESP proposal 1 encryption aes128
[edit]
hoge@jpmtkvmrt98# set vpn ipsec esp-group VYOS-ESP proposal 1 hash sha1
[edit]
hoge@jpmtkvmrt98# set vpn ipsec esp-group VYOS-ESP lifetime 3600


IPSecの設定
IPsecを確立するIPアドレスや事前共有鍵、使用するIKE等を設定する。
site-to-site peerでIPsecを確立させたい相手のWAN側のIPアドレスを指定、local-addressで自側のWAN側のIPアドレスを指定。
local prefixとremote prefixで暗号化通信の対象となるネットワークアドレスを指定。自側の192.168.100.0/24のネットワークに属する機器と至側の192.168.200.0/24のネットワークに属する機器との間で通信が発生する際、暗号化通信の対象となる。

[edit]
hoge@jpmtkvmrt98# set vpn ipsec site-to-site peer 192.168.3.99 authentication mode pre-shared-secret
[edit]
hoge@jpmtkvmrt98# set vpn ipsec site-to-site peer 192.168.3.99 authentication pre-shared-secret SomePreSharedKey
[edit]
hoge@jpmtkvmrt98# set vpn ipsec site-to-site peer 192.168.3.99 ike-group VYOS-IKE
[edit]
hoge@jpmtkvmrt98# set vpn ipsec site-to-site peer 192.168.3.99 local-address 192.168.3.98
[edit]
hoge@jpmtkvmrt98# set vpn ipsec site-to-site peer 192.168.3.99 tunnel 0 esp-group VYOS-ESP
[edit]
hoge@jpmtkvmrt98# set vpn ipsec site-to-site peer 192.168.3.99 tunnel 0 local prefix 192.168.100.0/24
[edit]
hoge@jpmtkvmrt98# set vpn ipsec site-to-site peer 192.168.3.99 tunnel 0 remote prefix 192.168.200.0/24


GREトンネルの設定
対向先との間でGREトンネル確立させる為の設定。IPsecのみの場合とは異なり、マルチキャストの通信を中に通す事が出来る。
set interfaces tunnel tun0 addressコマンドでGREトンネルの始点のIPアドレスを指定。
encapsulationオプションでGREを指定。
remoteオプションでGREトンネルの終点を指定し、source-addressでGREトンネルの始点を指定。

参照した他のサイトでの解説では以下のコマンドで自側と至側の指定をするのだが、VyOSバージョン1.4(2021年4月11日版)ではremote-ipの方は弾かれた。
よって自側はsource-addressで指定、至側はremoteで指定。しかしremote-ipとlocal-ipの方が分かりやすいと思う。
set interfaces tunnel tun0 remote-ip 192.168.3.99
set interfaces tunnel tun0 local-ip 192.168.3.98

[edit]
hoge@jpmtkvmrt98# set interfaces tunnel tun0 address 192.168.1.1/30
[edit]
hoge@jpmtkvmrt98# set interfaces tunnel tun0 description ***BRANCHOFFICE_to_DATACENTRE***
[edit]
hoge@jpmtkvmrt98# set interfaces tunnel tun0 encapsulation gre
[edit]
hoge@jpmtkvmrt98# set interfaces tunnel tun0 multicast enable
[edit]
hoge@jpmtkvmrt98# set interfaces tunnel tun0 remote 192.168.3.99
[edit]
hoge@jpmtkvmrt98# set interfaces tunnel tun0 source-address 192.168.3.98


設定内容の保存
GREの設定まで終えたら、設定内容をcommitしsaveコマンドで設定内容を/config/config.bootに保存。

[edit]
hoge@jpmtkvmrt98# commit
[edit]
hoge@jpmtkvmrt98# save
Saving configuration to '/config/config.boot'...
Done
[edit]
hoge@jpmtkvmrt98#
[edit]
hoge@jpmtkvmrt98# exit
exit
hoge@jpmtkvmrt98:~$



対向先の設定
引き続き、データセンタ側のルータjpmtkvmrt99にて設定。
上記にてユーザサイト側で設定した内容をテレコにしたような内容である。

IKEプロポーザルの設定

hoge@jpmtkvmrt99:~$ configure
[edit]
hoge@jpmtkvmrt99# set vpn ipsec ike-group VYOS-IKE dead-peer-detection action restart
[edit]
hoge@jpmtkvmrt99# set vpn ipsec ike-group VYOS-IKE dead-peer-detection interval 15
[edit]
hoge@jpmtkvmrt99# set vpn ipsec ike-group VYOS-IKE dead-peer-detection timeout 90
[edit]
hoge@jpmtkvmrt99# set vpn ipsec ike-group VYOS-IKE lifetime 28800
[edit]
hoge@jpmtkvmrt99# set vpn ipsec ike-group VYOS-IKE proposal 1 dh-group 2
[edit]
hoge@jpmtkvmrt99# set vpn ipsec ike-group VYOS-IKE proposal 1 encryption aes128
[edit]
hoge@jpmtkvmrt99# set vpn ipsec ike-group VYOS-IKE proposal 1 hash sha1


ESPプロポーザルの設定
ESP(Encapsulated Security Payload)は、パケットが改竄されていないかどうかの認証と、パケットのペイロード部の暗号化を行う。
IPsecを確立する通信機器間でペイロード部の暗号化で使用するパラメータを定義し、パラメータが一致したらIKEが確立される。

[edit]
hoge@jpmtkvmrt99# set vpn ipsec esp-group VYOS-ESP proposal 1 encryption aes128
[edit]
hoge@jpmtkvmrt99# set vpn ipsec esp-group VYOS-ESP proposal 1 hash sha1
[edit]
hoge@jpmtkvmrt99# set vpn ipsec esp-group VYOS-ESP lifetime 3600


IPSecの設定
IPsecを確立するIPアドレスや事前共有鍵、使用するIKE等を設定する。

[edit]
hoge@jpmtkvmrt99# set vpn ipsec site-to-site peer 192.168.3.98 authentication mode pre-shared-secret
[edit]
hoge@jpmtkvmrt99# set vpn ipsec site-to-site peer 192.168.3.98 authentication pre-shared-secret SomePreSharedKey
[edit]
hoge@jpmtkvmrt99# set vpn ipsec site-to-site peer 192.168.3.98 ike-group VYOS-IKE
[edit]
hoge@jpmtkvmrt99# set vpn ipsec site-to-site peer 192.168.3.98 local-address 192.168.3.99
[edit]
hoge@jpmtkvmrt99# set vpn ipsec site-to-site peer 192.168.3.98 tunnel 0 esp-group VYOS-ESP
[edit]
hoge@jpmtkvmrt99# set vpn ipsec site-to-site peer 192.168.3.98 tunnel 0 local prefix 192.168.200.0/24
[edit]
hoge@jpmtkvmrt99# set vpn ipsec site-to-site peer 192.168.3.98 tunnel 0 remote prefix 192.168.100.0/24


GREトンネルの設定
対向先との間でGREトンネル確立させる為の設定。

[edit]
hoge@jpmtkvmrt99# set interfaces tunnel tun0 address 192.168.1.2/30
[edit]
hoge@jpmtkvmrt99# set interfaces tunnel tun0 description ***DATACENTRE_to_BRANCHOFFICE***
[edit]
hoge@jpmtkvmrt99# set interfaces tunnel tun0 encapsulation gre
[edit]
hoge@jpmtkvmrt99# set interfaces tunnel tun0 multicast enable
[edit]
hoge@jpmtkvmrt99# set interfaces tunnel tun0 remote 192.168.3.98
[edit]
hoge@jpmtkvmrt99# set interfaces tunnel tun0 source-address 192.168.3.99


設定内容の保存
GREの設定まで終えたら、設定内容をcommitしsaveコマンドで設定内容を/config/config.bootに保存。

[edit]
hoge@jpmtkvmrt99# commit
[edit]
hoge@jpmtkvmrt99# save
Saving configuration to '/config/config.boot'...
Done
[edit]
hoge@jpmtkvmrt99#
[edit]
hoge@jpmtkvmrt99# exit
exit
hoge@jpmtkvmrt99:~$



設定後の動作確認
まずはshow vpn ike saコマンドを叩き、IKEのSAが正常に確立されているか確認。
対向先(Peer ID)、自側(Local ID)共に見えている事、Stateがup、IKEのバージョンやEncryptの方式などが見えている事から、IKEのSAが正常に確立されている事が分かる。

hoge@jpmtkvmrt98:~$ show vpn ike sa
Peer ID / IP                            Local ID / IP
------------                            -------------
192.168.3.99                            192.168.3.98

    State  IKEVer  Encrypt  Hash    D-H Group      NAT-T  A-Time  L-Time
    -----  ------  -------  ----    ---------      -----  ------  ------
    up     IKEv1   aes128   sha1_96 2(MODP_1024)   no     7200    28800


hoge@jpmtkvmrt98:~$
hoge@jpmtkvmrt99:~$ show vpn ike sa
Peer ID / IP                            Local ID / IP
------------                            -------------
192.168.3.98                            192.168.3.99

    State  IKEVer  Encrypt  Hash    D-H Group      NAT-T  A-Time  L-Time
    -----  ------  -------  ----    ---------      -----  ------  ------
    up     IKEv1   aes128   sha1_96 2(MODP_1024)   no     3600    28800
hoge@jpmtkvmrt99:~$


次に、show vpn ipsec saコマンドを叩き、ESPのSAが正常に確立されているか確認。
Connection欄にて対向先が見えている事、Stateがupである事、Uptimeがカウントされている事等から、ESPのSAが正常に確立されている事が分かる。

hoge@jpmtkvmrt98:~$ show vpn ipsec sa
Connection                  State    Uptime    Bytes In/Out    Packets In/Out    Remote address    Remote ID    Proposal
--------------------------  -------  --------  --------------  ----------------  ----------------  -----------  ----------------------------------
peer-192.168.3.99-tunnel-0  up       1m10s     0B/0B           0/0               192.168.3.99      N/A          AES_CBC_128/HMAC_SHA1_96/MODP_1024
hoge@jpmtkvmrt99:~$
hoge@jpmtkvmrt99:~$ show vpn ipsec sa
Connection                  State    Uptime    Bytes In/Out    Packets In/Out    Remote address    Remote ID    Proposal
--------------------------  -------  --------  --------------  ----------------  ----------------  -----------  ----------------------------------
peer-192.168.3.98-tunnel-0  up       1m16s     0B/0B           0/0               192.168.3.98      N/A          AES_CBC_128/HMAC_SHA1_96/MODP_1024
hoge@jpmtkvmrt99:~$


そしてshow interfaces tunnelコマンドを叩き、GREトンネルが張れているか確認。
トンネルインタフェースtun0を認識。ステータス、リンク共にupである事からGREトンネルが正常に張れている事が分かる。

hoge@jpmtkvmrt98:~$ show interfaces tunnel
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
tun0             192.168.1.1/30                    u/u  ***BRANCHOFFICE_to_DATACENTRE***
hoge@jpmtkvmrt98:~$
hoge@jpmtkvmrt99:~$ show interfaces tunnel
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
tun0             192.168.1.2/30                    u/u  ***DATACENTRE_to_BRANCHOFFICE***
hoge@jpmtkvmrt99:~$


ところで、IPSecの通信が正常に出来るのであれば、当記事の構成にて通信が発生した際に上記のshow vpn ipsec saコマンドの出力内容に有る Bytes In/Out と ackets In/Out の欄がカウントされる筈である。
ユーザサイト(user-01)側からサーバ(jpmtkvmsv01)に対しPingを5発打ってみる。

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=42 time=2.313 ms
64 bytes from 192.168.200.2: seq=0 ttl=42 time=3.089 ms
64 bytes from 192.168.200.2: seq=0 ttl=42 time=2.612 ms
64 bytes from 192.168.200.2: seq=0 ttl=42 time=2.852 ms
64 bytes from 192.168.200.2: seq=0 ttl=42 time=2.527 ms

--- 192.168.200.2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 2.313/2.678/3.089 ms
hoge@user-01:$


Pingを打ち終えたら対向先のWANルータjpmtkvmrt99に入り、show vpn ipsec saコマンドを実行。
Bytes In/Out欄とPackets In/Out欄共にカウントされた。しかもPackets In/Outの欄ではPingを打った分だけカウントされている事が分かる。
よって、ユーザサイト側からサーバへのIPSec通信が正常に行われた事が分かる。

hoge@jpmtkvmrt99:~$ show vpn ipsec sa
Connection                  State    Uptime    Bytes In/Out    Packets In/Out    Remote address    Remote ID    Proposal
--------------------------  -------  --------  --------------  ----------------  ----------------  -----------  ----------------------------------
peer-192.168.3.98-tunnel-0  up       2m30s     420B/420B       5/5               192.168.3.98      N/A          AES_CBC_128/HMAC_SHA1_96/MODP_1024
hoge@jpmtkvmrt99:~$


ついでに、ユーザサイト側からFTPコマンドを叩きサーバからファイルを1つgetしてみる。
Alpine LinuxではFTPクライアントはlftpとなっている為、FTPクライアントの導入の際はapk add lftpコマンドを打ち別途インストールする必要が有る。

hoge@user-01:$ lftp ftpuser@192.168.200.2
Password:
lftp ftpuser@192.168.200.2:~>
lftp ftpuser@192.168.200.2:~> ls
-rw-r--r--   1  0        1000          5  Jan 29 10:37 README.txt
lftp ftpuser@192.168.200.2:~>
lftp ftpuser@192.168.200.2:~> get README.txt
5 bytes transferred
lftp ftpuser@192.168.200.2:~>
lftp ftpuser@192.168.200.2:~> bye
hoge@user-01:$ 


サーバからファイルを落とし終えたら、再度show vpn ipsec saコマンドを実行。
Bytes In/Out欄とPackets In/Out欄共に値が増えた事が分かる。
よって、ユーザサイト側からサーバへのIPSec通信が正常に行われた事が分かる。

hoge@jpmtkvmrt99:~$ show vpn ipsec sa
Connection                  State    Uptime    Bytes In/Out    Packets In/Out    Remote address    Remote ID    Proposal
--------------------------  -------  --------  --------------  ----------------  ----------------  -----------  ----------------------------------
peer-192.168.3.98-tunnel-0  up       3m31s     2K/2K           43/45             192.168.3.98      N/A          AES_CBC_128/HMAC_SHA1_96/MODP_1024
hoge@jpmtkvmrt99:~$



設定投入後のVyOSのコンフィグ
以下は、IKEプロポーザル、ESPプロポーザル、IPSec、GREトンネルの各設定投入後に再度show configurationコマンドを実行。
ユーザサイト側のWANルータ、jpmtkvmrt98の設定は以下のとおり。
上記で投入した設定内容の他に、自動で生成される設定が有るようである。

hoge@jpmtkvmrt98:~$ show configuration
interfaces {
    ethernet eth0 {
        address 192.168.3.98/24
        description "***To_jpmtkvmrt99_eth0***"
        hw-id 08:00:27:54:e6:1a
    }
    ethernet eth1 {
        address 192.168.100.1/24
        description "***To_LAN_Segment***"
        hw-id 08:00:27:b6:b3:85
    }
    ethernet eth2 {
        hw-id 08:00:27:01:52:54
    }
    ethernet eth3 {
        hw-id 08:00:27:3b:44:9f
    }
    loopback lo {
        address 10.1.1.98/32
        description "***Polling/Monitoring***"
    }
    tunnel tun0 {
        address 192.168.1.1/30
        description "***BRANCHOFFICE_to_DATACENTRE***"
        encapsulation gre
        multicast enable
        remote 192.168.3.99
        source-address 192.168.3.98
    }
}
protocols {
    ospf {
        area 0.0.0.0 {
            network 192.168.3.0/24
        }
        interface eth0 {
            dead-interval 12
            hello-interval 3
        }
        log-adjacency-changes {
        }
        parameters {
            router-id 10.1.1.98
        }
        passive-interface eth1
        passive-interface eth2
        passive-interface eth3
        redistribute {
            connected {
            }
        }
    }
}
service {
    ssh {
    }
}
system {
    config-management {
        commit-revisions 100
    }
    console {
        device ttyS0 {
            speed 115200
        }
    }
    host-name jpmtkvmrt98
    login {
        user hoge {
            authentication {
                encrypted-password ****************
            }
        }
        user vyos {
            authentication {
                encrypted-password ****************
            }
        }
    }
    ntp {
        server 210.173.160.27 {
        }
        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 {
            compression disable
            lifetime 3600
            mode tunnel
            pfs enable
            proposal 1 {
                encryption aes128
                hash sha1
            }
        }
        ike-group VYOS-IKE {
            close-action none
            dead-peer-detection {
                action restart
                interval 15
                timeout 90
            }
            ikev2-reauth no
            key-exchange ikev1
            lifetime 28800
            proposal 1 {
                dh-group 2
                encryption aes128
                hash sha1
            }
        }
        ipsec-interfaces {
        }
        site-to-site {
            peer 192.168.3.99 {
                authentication {
                    mode pre-shared-secret
                    pre-shared-secret ****************
                }
                connection-type initiate
                ike-group VYOS-IKE
                ikev2-reauth inherit
                local-address 192.168.3.98
                tunnel 0 {
                    allow-nat-networks disable
                    allow-public-networks disable
                    esp-group VYOS-ESP
                    local {
                        prefix 192.168.100.0/24
                    }
                    remote {
                        prefix 192.168.200.0/24
                    }
                }
            }
        }
    }
}
hoge@jpmtkvmrt98:~$


データセンタ側のWANルータ、jpmtkvmrt99の設定は以下のとおり。

hoge@jpmtkvmrt99:~$ show configuration
interfaces {
    ethernet eth0 {
        address 192.168.3.99/24
        description "***To_jpmtkvmrt98_eth0***"
        hw-id 08:00:27:e2:7d:ea
    }
    ethernet eth1 {
        address 192.168.200.1/24
        description "***To_jpmtkvmsw99_gi1/0/48***"
        hw-id 08:00:27:22:26:75
    }
    ethernet eth2 {
        hw-id 08:00:27:e0:76:6d
    }
    ethernet eth3 {
        hw-id 08:00:27:ec:28:85
    }
    loopback lo {
        address 10.1.1.99/32
        description "***Polling/Monitoring***"
    }
    tunnel tun0 {
        address 192.168.1.2/30
        description "***DATACENTRE_to_BRANCHOFFICE***"
        encapsulation gre
        remote 192.168.3.98
        source-address 192.168.3.99
    }
}
protocols {
    ospf {
        area 0.0.0.0 {
            network 192.168.3.0/24
        }
        interface eth0 {
            dead-interval 12
            hello-interval 3
        }
        log-adjacency-changes {
        }
        parameters {
            router-id 10.1.1.99
        }
        passive-interface eth1
        passive-interface eth2
        passive-interface eth3
        redistribute {
            connected {
            }
        }
    }
}
service {
    ssh {
    }
}
system {
    config-management {
        commit-revisions 100
    }
    console {
        device ttyS0 {
            speed 115200
        }
    }
    host-name jpmtkvmrt99
    login {
        user hoge {
            authentication {
                encrypted-password ****************
            }
        }
        user vyos {
            authentication {
                encrypted-password ****************
                plaintext-password ****************
            }
        }
    }
    ntp {
        server 210.173.160.27 {
        }
        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 {
            compression disable
            lifetime 3600
            mode tunnel
            pfs enable
            proposal 1 {
                encryption aes128
                hash sha1
            }
        }
        ike-group VYOS-IKE {
            close-action none
            dead-peer-detection {
                action restart
                interval 15
                timeout 90
            }
            ikev2-reauth no
            key-exchange ikev1
            lifetime 28800
            proposal 1 {
                dh-group 2
                encryption aes128
                hash sha1
            }
        }
        ipsec-interfaces {
        }
        site-to-site {
            peer 192.168.3.98 {
                authentication {
                    mode pre-shared-secret
                    pre-shared-secret ****************
                }
                connection-type initiate
                ike-group VYOS-IKE
                ikev2-reauth inherit
                local-address 192.168.3.99
                tunnel 0 {
                    allow-nat-networks disable
                    allow-public-networks disable
                    esp-group VYOS-ESP
                    local {
                        prefix 192.168.200.0/24
                    }
                    remote {
                        prefix 192.168.100.0/24
                    }
                }
            }
        }
    }
}
hoge@jpmtkvmrt99:~$


2022/2/1追記
当記事の疎通確認のパケットキャプチャをtcpdumpで実施済。
pcapファイルの取得方法及びpcapファイルの内容に関しては以下の記事を参照。
https://debslink.hatenadiary.jp/entry/20220131/1643632170
VyOSの中に保存されているファイルを吸い出す


今回はここまで。
Alpine Linux 2台(ユーザ機とFTPサーバ)とVyOS 2台(ユーザサイト側とデータセンタ側)でVirtualBox内に簡単なGRE over IPSec VPN構成を組み、ユーザ機とサーバ機との間でIPSecの通信を確立する事が出来た。
ベンダ依存な機能を除き、ルーティングやセキュリティ関連の学習用および検証用の仮想アプライアンスとして大活躍なVyOS。Cisco CSR1000vやJuniper vMXやArista vEOS等のような商用な仮想アプライアンスはホスト機側に要求されるスペックが高く、個人で使用するPCにて複数台動作させるには厳しい物となってきた中、VyOSのような動作が軽快且つそこそこ何でも喋れる仮想アプライアンスは非常に重宝する。かつてDPDKを実装するかもという憶測がちらほらと見えていたものの、2019年6月17日の公式ブログによるとDPDKは実装しないような事を匂わす記事が有った為(下記リンク先を参照)、DPDKを実装したDANOSやVyatta 5600 vRouter等のようにホスト機に高スペックを要求するような物にはなって欲しくないと思っている。
当環境では開発版(1.4.x)を使用している為、商用環境での実装はLTS版(1.3.x)が望ましい。LTS版の入手はサブスクリプション契約が必要だが、LTSリリースの少し手前なrc版やepa版であれば下記リンク先(VyOS monthly snapshots and release candidates)から入手が可能である。


VyOSとIPSec、GREに関する情報源
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://support.vyos.io/en/kb/articles/gre-over-ipsec-for-secure-tunneling-2 GRE Over IPsec for Secure Tunneling
https://changineer.info/network/vyatta/vyatta_ipsec_normal.html Vyatta(VyOS) IPsec設定 基礎編
https://www.optsp.co.jp/news/detail/2250/ VyOSを使って拠点間VPN通信をしてみた
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/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を動かす
https://debslink.hatenadiary.jp/entry/20220211/1644579656 VyOSでIPsec VTI構成を組んでみた (2022/2/11追記)