VyOS on VirtualBox (Windows11)

# やろうとしたこと
  VyOSをVirtualBoxにインストールして、別に立てたOpenVPNサーバーへクライアント接続をすることを目標に始めました。

# インストール環境
- Windows11 21H2 (Build 22000.1042)
- VirtualBox 6.1.38 r153438 (Qt5.6.2)
- VyOS 1.4 (rolling-202210050218-amd64)

# 躓いたところ
1. Windows11上のVirtualBoxにVyOSをインストールしようとしたところ、Kernel Panicに。
1. VyOSをインストール後、OpenVPNサーバへ接続するマニュアルや記事を書いている人がおどろくほど少なかった＆TLS-Authの設定に難があり･･･
## 試したこと
- VirtualBoxのGUIでできるオプションをいろいろ変更
- OpenVPN TLSの設定を追加したり削除したり、いろいろ小細工したり･･･

# 結果
## VirtualBoxのゲストの設定
  「システム→アクセラレーション」タブにある
    準仮想化インターフェース
  を、
    ディフォルト→Hyper-V
  にしたところ、無事起動。
  ※Hyper-Vが生きているから、このオプションにしないといけないのかな･･･？

## VPN接続(OpenVPNサーバーへ)
### 行った設定
- キーボードを日本語レイアウトに変更
  ```shell
  vyos$ sudo su -
  root# vi /etc/default/keyboard
  - XKBMODEL="pc105"
  - XKBLAYOUT="us"
  + XKBMODEL="pc106"
  + XKBLAYOUT="up"
  root# exit
  vyos$ reboot
  ```

- タイムゾーンを変更
  ```shell
  vyos$ configure
  vyos# set system time-zone Asia/Tokyo
  vyos# commit
  vyos# save
  vyos# date
  ```

- イーサネットを設定
  vyos# set interfaces __NIC#__ address '__IP_Address__'
  vyos# set interfaces __NIC#__ description '__Network_Label__'
  ```shell
  vyos# set interfaces eth1 address '192.168.100.1'
  vyos# set interfaces eth1 description 'LAN'
  vyos# show interfaces
  vyos# commit
  vyos# save
  ```

- SSHサービスを起動
  ```shell
  vyos# set service ssh
  vyos# commit
  vyos# save
  vyos# exit
  vyos$ reboot
  ```
- NTPサーバーを設定
  vyos# set system ntp server __NTP_Server_IP/Host__
  ```shell
  vyos$ configure
  vyos# delete system ntp server
  vyos# set system ntp server ntp.nict.jp
  vyos# commit
  vyos# save
  ```
- NATを設定
  vyos# set nat source rule __Rule#__ outbound-interface __NIC#_
  vyos# set nat source rule __Rule#__ translation address masquerade
  ```
  vyos# set nat source rule 999 outbound-interface eth0
  vyos# set nat source rule 999 translation address masquerade
  vyos# commit
  vyos# save
  ```
- VPNを設定
  - Shared Secretを設定 (たぶん不要？)
    ```
    vyos$ generate pki openvpn shared-secret install shared-secret1
      ※ここで表示されたコマンドをconfigureした後で入力する※
    vyos$ configure
    vyos# set pki openvpn shared-secret shared-secret1 key 'blah blah'
    vyos# set pki openvpn shared-secret shared-secret1 version '1'
    vyos# commit
    vyos# save
    ```
  - 証明書をPKIに設定
    set pki ca __PKI CA Name__ certificate '__CA_Certificate_String__[^ca-certificate]'
    set pki certificate __PKI_Certificate_Name__ certificate '__Certificate_String__[^certificate]'
    set pki certificate __PKI_Certificate_Name__ private key `__Private_Key_String__[^private-key]'
    ```
    vyos# set pki ca ca1 certificate 'blahblah'
    vyos# set pki certificate client1 certificate `blahblah`
    vyos# set pki certificate client1 private key `blahblah'
    vyos# commit
    vyos# save
    ```
  - VPN(OpenVPN)を設定
    set interfaces openvpn __VTUN#__ encryption cipher 'aes256'
    set interfaces openvpn __VTUN#__ hash 'sha512'
    set interfaces openvpn __VTUN#__ mode 'client'
    set interfaces openvpn __VTUN#__ persistent-tunnel
    set interfaces openvpn __VTUN#__ protocol 'udp'
    set interfaces openvpn __VTUN#__ remote-host '__VPN_Server_IP/Host__'
    set interfaces openvpn __VTUN#__ remote-port '__VPN_Server_Port#__'
    set interfaces openvpn __VTUN#__ tls ca-certificate __PKI_CA_Name__
    set interfaces openvpn __VTUN#__ tls certificate __PKI_Certificate_Name__
    set interfaces openvpn __VTUN#__ use-lzo-compression
    set interfaces openvpn __VTUN#__ openvpn-option 'fast-io'
    set interfaces openvpn __VTUN#__ openvpn-option 'allow-compression yes'
    set interfaces openvpn __VTUN#__ openvpn-option 'route-nopull'
    set interfaces openvpn __VTUN#__ openvpn-option 'ping-restart 60'
    set interfaces openvpn __VTUN#__ openvpn-option 'persist-tun'
    set interfaces openvpn __VTUN#__ openvpn-option 'persist-key'
    set interfaces openvpn __VTUN#__ openvpn-option 'ping 10'
    set interfaces openvpn __VTUN#__ openvpn-option 'dev __VTUN#'
    set interfaces openvpn __VTUN#__ openvpn-option 'log __Log_File_Path__'
    set interfaces openvpn __VTUN#__ openvpn-option 'remote-cert-tls server'

    :::note info
    ※TLS-Authの設定は、いろいろなところで、openvpn-option 'tls-auth __Path_to_Key__' でできると書いてありましたが、うまく読み込めていなかったようなので外しました。
    :::

    e.g.
    ```shell
    vyos# set interfaces openvpn vtun1 encryption cipher 'aes256'
    vyos# set interfaces openvpn vtun1 hash 'sha512'
    vyos# set interfaces openvpn vtun1 mode 'client'
    vyos# set interfaces openvpn vtun1 persistent-tunnel
    vyos# set interfaces openvpn vtun1 protocol 'udp'
    vyos# set interfaces openvpn vtun1 remote-host '10.0.0.1'
    vyos# set interfaces openvpn vtun1 remote-port '1194'
    vyos# set interfaces openvpn vtun1 tls ca-certificate ca1
    vyos# set interfaces openvpn vtun1 tls certificate client1
    vyos# set interfaces openvpn vtun1 use-lzo-compression
    vyos# set interfaces openvpn vtun1 openvpn-option "fast-io"
    vyos# set interfaces openvpn vtun1 openvpn-option "allow-compression yes"
    vyos# set interfaces openvpn vtun1 openvpn-option "route-nopull"
    vyos# set interfaces openvpn vtun1 openvpn-option "ping-restart 60"
    vyos# set interfaces openvpn vtun1 openvpn-option "persist-tun"
    vyos# set interfaces openvpn vtun1 openvpn-option "persist-key"
    vyos# set interfaces openvpn vtun1 openvpn-option "ping 10"
    vyos# set interfaces openvpn vtun1 openvpn-option "dev vtun10"
    vyos# set interfaces openvpn vtun1 openvpn-option "log /var/log/openvpn.log"
    vyos# set interfaces openvpn vtun1 openvpn-option "remote-cert-tls server"
    ```
  - ファイヤーウォールを設定
    set firewall name __Firewall Name__ rule __Rule#__ destination port __Port#__
    set firewall name __Firewall Name__ rule __Rule#__ action accept
    set firewall name __Firewall Name__ rule __Rule#__ protocol __Protocol Name__
    ```shell
    vyos# set firewall name openvpn rule 999 destination port 1194
    vyos# set firewall name openvpn rule 999 action accept
    vyos# set firewall name openvpn rule 999 protocol udp
    ```
  - SNATを設定
    vyos# set nat source rule __Rule#__ outbound-interface '__vtun#__'
    vyos# set nat source rule __Rule#__ source address '__IP Address Range__'
    vyos# set nat source rule __Rule#__ translation address masquerade
    ```shell
    vyos# set nat source rule 100 outbound-interface 'vtun1'
    vyos# set nat source rule 100 source address '0.0.0.0/0'
    vyos# set nat source rule 100 translation address masquerade
    ```


# おまけ
- rootになる
  ```
  vyos$ sudo su -
  ```
- GuestAdditionsのインストール
  できないのかな･･･？まだ未確認。


[^ca-certificate]: CA証明書ファイルの __-----BEGIN CERTIFICATE-----__ から __-----END CERTIFICATE-----__ の間の文字列を1行にしたもの
[^certificate]: クライアント証明書の __-----BEGIN CERTIFICATE-----__ から __-----END CERTIFICATE-----__ の間の文字列を1行にしたもの
[^private-key]: クライアント証明書の秘密鍵の __-----BEGIN PRIVATE KEY-----__ から __-----END PRIVATE KEY-----__ の間の文字列を1行にしたもの