VyOS 1.4でIKEv2リモートアクセスVPNサーバを構築する

Android 12以降、L2TP/IPsecが新規で設定出来なくなり、既存のVPNプロファイルで耐え忍んでいる方も多いことでしょう(そんな一人でした)。
そんな私ですが、VPNサーバにしていたVyOSを1.3.2から1.4へアップデートしたところ、設定していたL2TP/IPsecも使えなくなってしまい、これを期にIKEv2(IKEv2/IPsec)のリモートアクセスを設定することにしました。
意外と情報が少なく、色々はまりポイントもあったので、備忘のため記事にしておきます。

環境

  • VyOS 1.4-rolling-202302080317
  • rolling releaseなので仕様が変更になったり、バグが含まれる可能性があります。

ネットワーク構成

  • VyOS
    • eth0:1.1.1.1/24
    • eth1:192.168.100.1/24
    • キャッシュDNSサーバ:192.168.100.11
  • 接続元端末 Windows 11
    • 5Gテザリング
    • テザリングのDHCP払い出しプライベートIPアドレス
    • グローバルIPアドレスは、CGNで変換
  • 接続元端末 Android 12
    • 5G
    • キャリア割り当て動的プライベートIPアドレス
    • グローバルIPアドレスは、CGNで変換

設定方針

  • リモートアクセスクライアント用アドレスプール
    • 192.168.100.128/29
  • ユーザ認証にID/PASSを使う
  • サーバ認証にサーバ証明書を使う
    • このためIPアドレスではなく、FQDNでのVPN接続を前提とします
  • Windowsは標準のVPN設定画面から設定出来るようにする

コンフィグ

証明書のインストール

VyOS 1.4のAPIを利用できるようにする」の記事でHTTPS用に証明書をインストールしている手順を参考にしてください。

サーバ証明書とCA証明書をインストールします。

  • インストールした証明書名
    • ServerCertificate
  • インストールしたCA証明書の証明書名
    • LetsEncryptR3

とします(後ほど使います)。

グローバル設定

コンフィグモードで作業します。

# set vpn ipsec interface eth0

ike-group

ike-groupを設定します。

# set vpn ipsec ike-group IKE-REMOTE key-exchange ikev2
# set vpn ipsec ike-group IKE-REMOTE lifetime 3600
# 
# set vpn ipsec ike-group IKE-REMOTE proposal 1 dh-group 2
# set vpn ipsec ike-group IKE-REMOTE proposal 1 encryption aes256
# set vpn ipsec ike-group IKE-REMOTE proposal 1 hash sha256
# 
# set vpn ipsec ike-group IKE-REMOTE proposal 2 dh-group 16
# set vpn ipsec ike-group IKE-REMOTE proposal 2 encryption aes256
# set vpn ipsec ike-group IKE-REMOTE proposal 2 hash sha256

Windowsの標準では、modp1024dh-group 2)以外は受け付けられないので、Windows用に強度の弱いproposal 1を設定しています。
レジストリエディタを利用したり、VyOSで生成できるPowerShellコマンドを利用すると、より強度の強い設定が利用可能なのですが、Windowsの標準的なUIで設定できるよう、強度を落としたものを用意しています。
この辺に詳細が載っています。

一方Androidなどでは、modp4096が利用できるためproposal 2で強度の強い設定も用意しています。

esp-group

esp-groupを設定します。

# set vpn ipsec esp-group ESP-REMOTE lifetime 3600
# set vpn ipsec esp-group ESP-REMOTE mode tunnel
# set vpn ipsec esp-group ESP-REMOTE pfs disable
# 
# set vpn ipsec esp-group ESP-REMOTE proposal 1 encryption aes256
# set vpn ipsec esp-group ESP-REMOTE proposal 1 hash sha1
# 
# set vpn ipsec esp-group ESP-REMOTE proposal 2 encryption aes256
# set vpn ipsec esp-group ESP-REMOTE proposal 2 hash sha256

こちらも同様に、Windows標準ではハッシュアルゴリズムにsha1以外受け付けられないので、Windows用に強度の弱いproposal 1を設定しています。

一方Androidなどでは、sha2が利用できるためproposal 2で強度の強い設定も用意しています。

pool

VPNのクライアントに割り当てるIPアドレスプールを設定します。
VyOSのeth1のセグメント(192.168.100.0/24)の中から、192.168.100.128/29だけ切り出して使うことにします。

# set vpn ipsec remote-access pool REMOTE-POOL name-server 192.168.100.11
# set vpn ipsec remote-access pool REMOTE-POOL prefix 192.168.100.128/29

connection

リモートアクセスの設定をします。
設定方針に記載の通り、今回はユーザの認証にID/PASSを使う方式を採用します。
一方サーバの認証には事前に設定したサーバ証明書を使う方式を採用します。

 
# set vpn ipsec remote-access connection REMOTE-CONN authentication client-mode eap-mschapv2
# set vpn ipsec remote-access connection REMOTE-CONN authentication local-id <VyOSのFQDN>
# set vpn ipsec remote-access connection REMOTE-CONN authentication local-users username <ユーザ名> password <ユーザのパスワード>
# set vpn ipsec remote-access connection REMOTE-CONN authentication server-mode x509
# set vpn ipsec remote-access connection REMOTE-CONN authentication x509 ca-certificate LetsEncryptR3
# set vpn ipsec remote-access connection REMOTE-CONN authentication x509 certificate ServerCertificate
# 
# set vpn ipsec remote-access connection REMOTE-CONN esp-group ESP-REMOTE
# set vpn ipsec remote-access connection REMOTE-CONN ike-group IKE-REMOTE
# set vpn ipsec remote-access connection REMOTE-CONN local-address 1.1.1.1
# set vpn ipsec remote-access connection REMOTE-CONN pool REMOTE-POOL

クライアントの設定

Windows

WindowsのVPN設定で、以下のように接続を作成します。
それだけ。

Android

AndroidのVPNクライアントでも同様の設定が出来るのですが、繋がりません。

同様の設定といいつつ、正確にはWindowsと異なり「IPsec ID」という項目が用意されていて、必須じゃないように見えて空欄だと設定を保存できないのですが、ここには何を入れても問題なさそうです。
YAMAHA RTXルータによるIKEv2の設定では、「IPsec ID」によるクライアント毎の個別設定などが行えるようです。

繋がらない原因としては、サーバ証明書のOCSP(証明書の執行確認の仕組み)が正常に働いていないとかという情報がありました。

これに関しては自己署名証明書を使えば問題ないという話もありますが、今回はきちんとした証明書を利用するため、AndroidアプリのstrongSwan VPN Clientを利用します。
VyOSのVPNはstrongSwanで実現されているので、公式クライアントを利用するわけです。

アプリから「ADD VPN PROFILE」を選択し、以下のように接続を作成します。

トラブルシュート

Q:VPN接続したが通信が出来ない

A:natやfirewallの設定を確認してください。

今回の構成の場合、

  • interface:eth0 ←これが重要
  • src:192.168.100.128/29
  • ipsec:有効

なパケットが流入することになります。

そのため、eth0でインターネット側からのnat destinationをしている場合、送信元IPアドレスの除外が必要です。
たとえば、VyOS配下にウェブサーバがいて80/tcpや443/tcpを宛先NATする場合、送信元がリモートアクセスクライアント(192.168.100.128/29)の通信を除外しなければ、リモートアクセスクライアントからインターネット方向のHTTP/HTTPS通信でさえ、NATルールにマッチしてしまいます。

また、一般的にインターネット側のインターフェースはfirewalldefault-action dropにしていることが多いと思います。
eth0でin方向のfirewallを設定している場合、match-ipsecな、source address 192.168.100.128/29のパケットを明示的に許可する必要があります。

おすすめ

コメントを残す

Amazon プライム対象