Google Cloud で VyOS を使う

# 目的

Google Cloud で VyOS を使おうと検索すると、以下の方法が見つかりますが、月額 $100 するのでちょっとした検証には使いづらい。

- [VyOS On Google Cloud Platform - VyOS](https://vyos.io/solutions/vyos-on-gcp)

と思って調べると、同じことを思って Google Compute Engine 向けに VyOS 1.3.x (equuleus) のカスタムイメージを公開してくれている人を見つけたのでデプロイまでしてみます。

- [albertogeniola/terraform-gce-vyos](https://github.com/albertogeniola/terraform-gce-vyos)

# ダウンロード

以下のコマンドで約 670 MBのカスタムイメージをダウンロードします。

- [Releases · albertogeniola/terraform-gce-vyos](https://github.com/albertogeniola/terraform-gce-vyos/releases)

```shell
curl -L -o ~/Downloads/vyos-equuleus-gce-image.tar.gz https://github.com/albertogeniola/terraform-gce-vyos/releases/download/20221003124535/vyos-equuleus-gce-image.tar.gz
```

# Google Cloud Storage にアップロード

以下のコマンドで Google Cloud Storage にアップロードします。

```shell
export BUCKET_NAME='YOUR_BUCKET'
gcloud storage cp ~/Downloads/vyos-equuleus-gce-image.tar.gz gs://$BUCKET_NAME
```

# Google Compute Engine へのイメージのインポート

以下のコマンドで Google Compute Engine へイメージをインポートします。

- [4.6. Google Compute Engine へのイメージのインポート Red Hat Gluster Storage 3.5 | Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_gluster_storage/3.5/html/deployment_guide_for_public_cloud/sect-documentation-deployment_guide_for_public_cloud-google_cloud_platform-import_image)

その際に `MULTI_IP_SUBNET` を有効にしておきます。


- [/32 ではないネットマスクを使用する場合に接続の問題が発生する](https://cloud.google.com/vpc/docs/create-use-multiple-interfaces?hl=ja#i_am_having_connectivity_issues_when_using_a_netmask_that_is_not_32)

```shell
gcloud compute images create vyos-equuleus-gce-image-multi-ip-subnet \
--source-uri gs://$BUCKET_NAME/vyos-equuleus-gce-image.tar.gz \
--guest-os-features MULTI_IP_SUBNET
```

> - [Google Cloud （GCP）におけるネットワーキングの必修ポイントとは？ | 株式会社トップゲート](https://www.topgate.co.jp/blog/google-service/24495)
> ちなみに、サブネットの中に作る VM は全て /32 の単位でサブネットマスクが払い出されます。ただし、ソフトウェアの種類によっては /32 では正常に動かない場合がありますが、この時は MULTI_IP_SUBNET を定義することで単位を調整できます。

# カスタムイメージを指定して Google Compute Engine として VyOS をデプロイ

- カスタムイメージを指定する

- [N1 インスタンス](https://cloud.google.com/compute/docs/general-purpose-machines#n1_machines) か [N2 インスタンス](https://cloud.google.com/compute/docs/general-purpose-machines#n2_machines) を選択する

  - > So far, the VyOS image has been tested only on n2 or n1 instance families. Other instance families might not be supported.

以外は、通常の Google Compute Engine のデプロイと同じです。

## コンソール

![image-20230311001058597](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20230311001058597.png)

## `gcloud` コマンド

VM のネクストホップとして機能させるためには `--can-ip-forward` の有効化が必要です。

- https://cloud.google.com/vpc/docs/using-routes#create-vm-canipforward

```shell
### gcloud compute instances create VM_NAME --address=IP_ADDRESS
 
PROJECT='your-project'
ZONE=asia-northeast2-b
SUBNET=kyouhei-osaka-mwan
NAME=kyouhei-osaka-vyos
IPADDR=x.x.x.x
 
gcloud compute instances create $NAME \
--project=$PROJECT --zone=$ZONE \
--machine-type=n1-standard-1 \
--network-interface=address=$IPADDR,network-tier=PREMIUM,subnet=$SUBNET \
--maintenance-policy=MIGRATE \
--service-account=xxx-compute@developer.gserviceaccount.com \
--scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append \
--create-disk=auto-delete=yes,boot=yes,device-name=$NAME,image=projects/$PROJECT/global/images/vyos-equuleus-gce-image,mode=rw,size=10,type=projects/$PROJECT/zones/$ZONE/diskTypes/pd-balanced \
--reservation-affinity=any --can-ip-forward
 
Created 
NAME                ZONE               MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
kyouhei-osaka-vyos  asia-northeast2-b  n1-standard-1               10.202.0.4   xx.xx.xx.xxx  RUNNING
```

# ログインしてデフォルト設定を確認

デプロイ後は `gcloud compute ssh` でログインできます。

```shell
% gcloud compute ssh kyouhei-osaka-vyos
Welcome to VyOs
=========================================================================
Please note the following:
    * This image is integrated with Google Ops Agent and supports metadata
ssh-keys login;
    * You can still manage vyos configuration using the Serial Console,
logging in as vyos credentials: vyos/vyos;
    * Note: vyos ssh plaintext/password is disabled.

Built using https://github.com/albertogeniola/terraform-gce-vyos
=========================================================================
kyouhei@kyouhei-osaka-vyos:~$ 
```

設定作業をするときには `vyos` ユーザに切り替えておこないます。

```shell:
su vyos # パスワードは vyos
```

初期設定は以下のようになっています。

```json
$ show configuration
interfaces {
    ethernet eth0 {
        address dhcp
    }
    loopback lo {
    }
}
service {
    ssh {
        disable-password-authentication
        listen-address 0.0.0.0
        port 22
    }
}
system {
    config-management {
        commit-revisions 100
    }
    conntrack {
        modules {
            ftp
            h323
            nfs
            pptp
            sip
            sqlnet
            tftp
        }
    }
    console {
        device ttyS0 {
            speed 38400
        }
    }
    host-name vyos-gce
    login {
        banner {
            post-login "Welcome to VyOs\n=========================================================================\nPlease note the following:\n    * This image is integrated with Google Ops Agent and supports metadata\nssh-keys login;\n    * You can still manage vyos configuration using the Serial Console,\nlogging in as vyos credentials: vyos/vyos;\n    * Note: vyos ssh plaintext/password is disabled.\n\nBuilt using https://github.com/albertogeniola/terraform-gce-vyos\n========================================================================="
        }
        user admin {
        }
        user vyos {
            authentication {
                encrypted-password ****************
                plaintext-password ****************
            }
        }
    }
    name-server 169.254.169.254
    name-server 8.8.8.8
    name-server 8.8.4.4
    ntp {
        server time1.vyos.net {
        }
        server time2.vyos.net {
        }
        server time3.vyos.net {
        }
    }
    static-host-mapping {
        host-name metadata.google.internal {
            inet 169.254.169.254
        }
    }
    syslog {
        global {
            facility all {
                level info
            }
            facility protocols {
                level debug
            }
        }
    }
}
```

# グローバル IP 確認

- [Cloudflare に対する DNS コマンドメモ - Qiita](https://qiita.com/khayama/items/2f172142141df37d42ef#ipv4-query-5)

```shell
$ curl -4 -s https://cloudflare.com/cdn-cgi/trace | grep ip | awk -F'=' '{print $2}'
xx.xx.xx.xxx
```

# チューニング

エラー表示を抑制するために、以下のコマンドを実行します。

- [sudo: unable to resolve host が表示されたら - Qiita](https://qiita.com/ogomr/items/89e19829eb8cc08fcebb)

```shell
sudo sh -c 'echo 127.0.1.1 $(hostname) >> /etc/hosts'
```

Terraform を使っていないので、以下のサービスは停止・自動起動無効化します。

```shell
sudo systemctl stop conf_reloader.service
sudo systemctl disable conf_reloader.service
```

OS Config agent も無効化します。

- [Disable the OS Config agent  |  Compute Engine Documentation  |  Google Cloud](https://cloud.google.com/compute/docs/manage-os#disable-agent)

```
sudo systemctl stop google-osconfig-agent
sudo systemctl disable google-osconfig-agent
```

# Let's VyOS

ここからは `configure` して `set` コマンドを実行 --> `commit` して `save` するなど、一連の VyOS 設定を実施できます！

自分の書いた懐かしい記事を振り返りつつ、この VyOS を使って Cloudflare Magic WAN に接続する等、進めてみたいと思います。

- [VyOSでIPSec VPNの設定 - Qiita](https://qiita.com/khayama/items/c63d4d5f02abdf348889)
- [VyOS · Cloudflare Magic WAN docs](https://developers.cloudflare.com/magic-wan/tutorials/vyos/)