Oracle VM 検証環境での VyOS の IPsec 設定例

VyOS を使った IPsec の検証

検証環境とやりたいことは以下の通り。Virtual BOX 上に VyOS を3台展開し、ホスト名をそれぞれ vyrtr1 / vyrtr2 / vyrtr3 とし、以下のように IP 設定をしました。

環境を構築するにあたっては各 VyOS は以下の記事のように設定しました。

【VyOS】の基本設定,初期設定, Oracle VM での検証環境設定
【VyOS】の基本設定,初期設定, Oracle VM での検証環境設定
VyOS (読み方:ヴィワイオーエス)とは VMware や KVM 等の仮想...

パケットキャプチャは vyrtr3 上で以下コマンドで取得しました。

vyos@vyrtr1~$ monitor traffic interface eth0 save ipsec.pcap

また、パケットキャプチャ開始直後に以下コマンドで IPsec の再起動を実行しています。

vyos@vyrtr1~$ restart vpn

IKEv2 の場合

設定config (system 部分は省略)

[vyrtr1]

vyos@vyrtr1:~$ show configuration
interfaces {
    ethernet eth0 {
        address 10.1.1.1/24
        description lan1
        duplex auto
        hw-id 08:00:27:d1:8f:15
        smp-affinity auto
        speed auto
    }
    ethernet eth1 {
        address 198.51.100.1/24
        description wan1
        duplex auto
        hw-id 08:00:27:6a:99:9e
        smp-affinity auto
        speed auto
    }
    ethernet eth2 {
        address dhcp
        duplex auto
        hw-id 08:00:27:d2:b4:59
        smp-affinity auto
        speed auto
    }
    loopback lo {
    }
}
protocols {
    static {
        route 203.0.113.0/24 {
            next-hop 198.51.100.3 {
            }
        }
    }
}
service {
    ssh {
    }
}
vpn {
    ipsec {
        esp-group rtr1-esp {
            compression disable
            lifetime 1800
            mode tunnel
            pfs enable
            proposal 1 {
                encryption aes256gcm128
                hash sha512
            }
        }
        ike-group rtr1-ike {
            dead-peer-detection {
                action restart
            }
            ikev2-reauth yes
            key-exchange ikev2
            lifetime 3600
            proposal 1 {
                dh-group 26
                encryption aes256gcm128
                hash sha512
            }
        }
        ipsec-interfaces {
            interface eth1
        }
        site-to-site {
            peer 203.0.113.2 {
                authentication {
                    mode pre-shared-secret
                    pre-shared-secret ****************
                }
                ike-group rtr1-ike
                ikev2-reauth inherit
                local-address 198.51.100.1
                tunnel 0 {
                    esp-group rtr1-esp
                    local {
                        prefix 10.1.1.0/24
                    }
                    remote {
                        prefix 10.2.2.0/24
                    }
                }
            }
        }
    }
}
vyos@vyrtr1:~$

[vyrtr2]

vyos@vyrtr2:~$ show configuration
interfaces {
    ethernet eth0 {
        address 10.2.2.2/24
        description lan2
        duplex auto
        hw-id 08:00:27:ec:d6:2e
        smp-affinity auto
        speed auto
    }
    ethernet eth1 {
        address 203.0.113.2/24
        description wan2
        duplex auto
        hw-id 08:00:27:d6:aa:41
        smp-affinity auto
        speed auto
    }
    ethernet eth2 {
        address dhcp
        description for-ssh
        duplex auto
        hw-id 08:00:27:3e:b5:78
        smp-affinity auto
        speed auto
    }
    loopback lo {
    }
}
protocols {
    static {
        route 198.51.100.0/24 {
            next-hop 203.0.113.3 {
            }
        }
    }
}
service {
    ssh {
    }
}
vpn {
    ipsec {
        esp-group rtr2-esp {
            compression disable
            lifetime 1800
            mode tunnel
            pfs enable
            proposal 1 {
                encryption aes256gcm128
                hash sha512
            }
        }
        ike-group rtr2-ike {
            dead-peer-detection {
                action restart
            }
            ikev2-reauth yes
            key-exchange ikev2
            lifetime 3600
            proposal 1 {
                dh-group 26
                encryption aes256gcm128
                hash sha512
            }
        }
        ipsec-interfaces {
            interface eth1
        }
        site-to-site {
            peer 198.51.100.1 {
                authentication {
                    mode pre-shared-secret
                    pre-shared-secret ****************
                }
                ike-group rtr2-ike
                ikev2-reauth inherit
                local-address 203.0.113.2
                tunnel 0 {
                    esp-group rtr2-esp
                    local {
                        prefix 10.2.2.0/24
                    }
                    remote {
                        prefix 10.1.1.0/24
                    }
                }
            }
        }
    }
}
vyos@vyrtr2:~$

[vyrtr3]

vyos@vyrtr3:~$ show configuration
interfaces {
    ethernet eth0 {
        address 198.51.100.3/24
        description wan1
        duplex auto
        hw-id 08:00:27:a8:b4:12
        smp-affinity auto
        speed auto
    }
    ethernet eth1 {
        address 203.0.113.3/24
        description wan2
        duplex auto
        hw-id 08:00:27:3c:a4:c3
        smp-affinity auto
        speed auto
    }
    ethernet eth2 {
        address dhcp
        description for-ssh
        hw-id 08:00:27:98:6a:18
    }
    loopback lo {
    }
}
protocols {
    static {
        route 10.1.1.0/24 {
            next-hop 198.51.100.1 {
            }
        }
        route 10.2.2.0/24 {
            next-hop 203.0.113.2 {
            }
        }
    }
}
service {
    ssh {
    }
}
vyos@vyrtr3:~$

IKEv2 のパケットキャプチャ

pcap 形式のファイルはこちらから

IKEv1 の場合

IKEv2 (Single IPsec SA) の設定から以下の部分だけ変更しました。

[vyrtr1]

set vpn ipsec ike-group rtr1-ike ikev2-reauth no
set vpn ipsec ike-group rtr1-ike key-exchange ikev1
set vpn ipsec ike-group rtr1-ike proposal 1 dh-group 5
set vpn ipsec ike-group rtr1-ike proposal 1 encryption aes128
set vpn ipsec ike-group rtr1-ike proposal 1 hash sha1
set vpn ipsec site-to-site peer 203.0.113.2 ikev2-reauth no

[vyrtr2]

set vpn ipsec ike-group rtr2-ike ikev2-reauth no
set vpn ipsec ike-group rtr2-ike key-exchange ikev1
set vpn ipsec ike-group rtr2-ike proposal 1 dh-group 5
set vpn ipsec ike-group rtr2-ike proposal 1 encryption aes128
set vpn ipsec ike-group rtr2-ike proposal 1 hash sha1
set vpn ipsec site-to-site peer 198.51.100.1 ikev2-reauth no

[vyrtr3]

変更箇所なし

IKEv1 の場合、DH-Group、暗号化/ハッシュアルゴリズムを高レベルのもので利用しようとするとうまく接続できず、低レベルのものに変更したら接続できるようになりました。

IKEv1 のパケットキャプチャ

pcap 形式のファイルはこちらから

show コマンド

ikev2 の場合

vyos@vyrtr1:~$ show vpn ike sa
Peer ID / IP                            Local ID / IP
------------                            -------------
203.0.113.2                             198.51.100.1

    State  IKEVer  Encrypt  Hash    D-H Group      NAT-T  A-Time  L-Time
    -----  ------  -------  ----    ---------      -----  ------  ------
    up     IKEv2   n/a      n/a     n/a(n/a)       no     660     3600


vyos@vyrtr1:~$ show vpn ipsec sa
Connection                 State    Uptime    Bytes In/Out    Packets In/Out    Remote address    Remote ID    Proposal
-------------------------  -------  --------  --------------  ----------------  ----------------  -----------  ---------------------------------------
peer-203.0.113.2-tunnel-0  up       1m7s      504B/504B       6/6               203.0.113.2       N/A          AES_GCM_16_256/<built-in function hash>

ikev1 の場合

vyos@vyrtr1:~$ show vpn ike sa
Peer ID / IP                            Local ID / IP
------------                            -------------
203.0.113.2                             198.51.100.1

    State  IKEVer  Encrypt  Hash    D-H Group      NAT-T  A-Time  L-Time
    -----  ------  -------  ----    ---------      -----  ------  ------
    up     IKEv1   aes128   sha1_96 5(MODP_1536)   no     1080    3600


vyos@vyrtr1:~$ show vpn ipsec sa
Connection                 State    Uptime    Bytes In/Out    Packets In/Out    Remote address    Remote ID    Proposal
-------------------------  -------  --------  --------------  ----------------  ----------------  -----------  -------------------------------------------------
peer-203.0.113.2-tunnel-0  up       2m40s     1008B/1008B     12/12             203.0.113.2       N/A          AES_GCM_16_256/<built-in function hash>/MODP_1536

余談

$ show vpn ipsec sa コマンドはこのバージョンだと以下のエラーが出ました。

vyos@vyrtr1:~$ show vpn ipsec sa
Traceback (most recent call last):
  File "/usr/libexec/vyos/op_mode/show_ipsec_sa.py", line 86, in 
    hash = isa["integ-alg"].decode()
KeyError: 'integ-alg'
vyos@vyrtr1:~$

なので vi で 86 行目をコメントアウトしたらとりあえずコマンド表示はされるようになりました。

vyos@vyrtr1:~$ sudo vi /usr/libexec/vyos/op_mode/show_ipsec_sa.py

86行目の以下の行を # でコメントアウト

#     hash = isa["integ-alg"].decode()

ただし、副作用として、本来 hash 関数が表示されるべき箇所が「<built-in function hash>」と表示されてしまいます。

追加検証 : IKEv2 で IPsec SA を2つ以上構築する場合

IKEv2 では IKE_AUTH の中に 1つ目の IPsec SA 構築が含まれるため、CREATE_CHILD_SA のパケットが見えません。そのため、IPsec SA を2つ構築する構成にしてパケットキャプチャを取得してみました。

IKEv2 の設定をベースに、各々以下の設定を追加しました。

[vyrtr1]

set vpn ipsec site-to-site peer 203.0.113.2 tunnel 1 esp-group rtr1-esp
set vpn ipsec site-to-site peer 203.0.113.2 tunnel 1 local prefix 10.11.11.0/24
set vpn ipsec site-to-site peer 203.0.113.2 tunnel 1 remote prefix 10.22.22.0/24

[vyrtr2]

set vpn ipsec site-to-site peer 198.51.100.1 tunnel 1 esp-group rtr2-esp
set vpn ipsec site-to-site peer 198.51.100.1 tunnel 1 local prefix 10.22.22.0/24 
set vpn ipsec site-to-site peer 198.51.100.1 tunnel 1 remote prefix 10.11.11.0/24

[vyrtr3]

変更箇所なし

IKEv2 (Dual IPsec SA) のパケットキャプチャ

pcap 形式のファイルはこちらから