multipassとremote.it(remot3.it)で仮想マシンのネットワークを快適にする

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

Ubuntuが便利でCentOSを使わなくなって随分経つのですが、Ubuntuには仮想マシン管理ツールとして、multipassというおおよそ仮想マシン管理ツールとは思えない名前のコマンドがあります。

中身としてはKVM(QEMU)で、コマンド一発で仮想マシンを動かしてくれるというとても有り難いツールです。

以下のようにコマンド一つで簡単起動します(multipassが既にインストールされているとします)。

```bash
$ multipass launch --name hogehoge 20.04 -c 2 -m 8g
```

上記のコマンドでUbuntu 20.04が2コアの8GBで起動して仮想マシン名は `hogehoge` です。
クラウドに慣れてしまった身としてはVMwareのGUIとか見たくないレベルなのでコマンド一つで簡単に動かせるのは非常に有り難いです。

しかし、一つ問題があります。ネットワークです。
multipassは、仮想マシンが動くだけでネットワーク的な手当を何にもしてくれません(今、ネットワークインターフェースにブリッジ設定できるようにしようとしているそうです)。

multipassで起動した仮想マシンには、`10.192.86.xxx/24`というIPアドレスは自動で付きますがルーティングしてあげたりする必要があります。とすると、接続するにはIPアドレスで接続しなければなりませんし(DNSとか利用できない)、管理も大変です。multipass内でのVMへのルーティングは複雑なネットワーク上で行うのは大変です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/20462a9b-7d30-9d32-fd1a-919c0ad47647.png)


multipassへのルーティングについては以下に書きました。
Linux上のMultipassの仮想マシンへ外部ネットワークから接続する - Qiita
https://qiita.com/ynott/items/be8810f83d1db6f4540b

そこで、remote.itというサービスと組み合わせてanytime Multipassな環境を作ってみたら便利なのではないかと思いました。

remote.itについては、以下のサイトをご覧下さい。

remote.it - remote.it
https://remote.it/jp/

簡単に言うとP2Pで仮想的にネットワークを組む仕組みで、グローバルIPやVPNゲートウェイなしでも独自ネットワークを組むことができるツールです。以下の記事が分かりやすいです。

これは魔法か？！ インバウンドポートを全閉したAWSのサーバに接続する方法
https://qiita.com/tkhmhiroc/items/0724d4b1d6bc688aa474

* 簡単仮想マシン起動のMultipass
* 簡単仮想ネットワークのRemote.it

組み合わせると以下のようにお手軽に仮想マシン環境ができるのでは？という算段です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/5ede4e68-b0aa-fc5f-e995-e71d05ad697b.png)


# 1. multipass で Ubuntu 20.04を起動

以下のコマンド一発です(お好みに応じてCPUやメモリサイズを変更してください)

```bash
$ multipass launch --name hogehoge 20.04 -c 2 -m 8g
```

# 2. 起動したらログイン

起動した仮想マシンにログインします。

```
$ multipass shell hogehoge
Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-42-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Wed Aug 12 15:01:58 JST 2020

  System load:  0.07              Processes:             105
  Usage of /:   29.6% of 4.67GB   Users logged in:       0
  Memory usage: 20%               IPv4 address for ens4: 10.192.86.207
  Swap usage:   0%


1 update can be installed immediately.
0 of these updates are security updates.
To see these additional updates run: apt list --upgradable


The list of available updates is more than a week old.
To check for new updates run: sudo apt update

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

```

# 3. remote.itパッケージをインストール

こちらも以下のコマンドで入ります。
詳しいインストール方法は以下を参照してください(といっても3行ですが)。

remote.itを使用したAWSへのセキュアなリモートアクセス - Qiita
https://qiita.com/masa-e/items/321d2962886931593ad4

```bash
$ curl -LkO https://downloads.remote.it/cli/latest/remoteit_linux_x86_64
$ sudo cp remoteit_linux_x86_64 /usr/bin/remoteit
$ sudo chmod +x /usr/bin/remoteit
$ remoteit version
1.6.14
```

# 4. remote.itをセットアップ

このままでは、remote.itサービスから認識されないのでセットアップします。

## 4-1. remote.itサービス(agent)を自動起動する設定を入れる

```bash
$ sudo remoteit agent install
 ✓ Installed and started system service successfully
```

関連バイナリーもインストールしておきます。

```
$ sudo remoteit tools install
 ∘ Installing tools
 ✓ Tools installed to: '/usr/bin'
```

## 4-2. ログイン
ID/PWでログインします。

```bash
$ sudo remoteit signin
Username: xxxxxxxx@example.jp  # [remote.itアカウントを入力]
Password: XXXXXXX  # [remote.itアカウントのパスワードを入力]
 ∘ SIGNIN in progress ...
 ✓ Login with remote.it account
 ✓ Download & install dependencies
 ✓ NEXT-ACTION: run 'remoteit register' to register this device into your remote.it account
```

## 4-3. 仮想マシンを登録

パスワードが通ったら、このMultipassで動いている仮想マシンを一意に識別する名前を付けRemote.it側に登録してます。`hogehoge`としておきましょう。

```
$ sudo remoteit register
Device name: hogehoge
 ∘ REGISTER in progress ...
 ✓ Login with remote.it account
 ✓ Register device 'hogehoge'
 ✓ Applying config
 ✓ NEXT-ACTION: run 'remoteit add' to add services to this device
```

## 4-4. 外部から参照されるアプリケーション(サービス)を登録

このMultipassで動かしていて、外から接続するアプリケーションを選択します。
SSHで外部からログインしたいので、SSHサービスを参照できるサービスとして登録します

(現在、動いている必要はありません)後から追加、変更も可能です

`remoteit add`でアプリケーションを追加します
サービスタイプを`ssh`でポート番号を`22`で、サービス名を`ssh`にしましょう。

```bash
$ sudo remoteit add --name ssh --port 22 --type ssh --enable
 ∘ ADD in progress ...
 ✓ Login with remote.it account
 ✓ Creating service named 'ssh' at '127.0.0.1:22'
 ✓ NEXT-ACTION: run 'remoteit add' to add more services
```

以上で、ターゲットデバイスとサービスの登録が完了しました。
次に、クライアントから登録されたターゲットとデバイスを確認して接続を行います。

# 5. remote.itクライアントで接続

remote.itクライアントを起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/6f22541e-9575-b420-2dbf-19778d8e676c.png)

`CONNECT`ボタンを押して接続します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/23b0583d-cac8-2716-26da-ebb6b854c039.png)

`CONNECT`ボタンが青色になれば、通常のSSHクライアントでKVMのVMに接続できます。

青丸で囲ったクリップボードマークをクリックすると接続設定情報がクリップボードに入ります。
今回入っていた内容は、以下の通りでした。

`localhost:33002`

ですので、これにSSHプロトコルの接続を追加して以下のようにします

`ssh -i ./id_rsa ubuntu@localhost:33002`

# 6. TeraTermで接続

ホストを5でコピーした内容にします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/afb8edda-243f-bdd8-894c-0310dd5bc7af.png)

SSH鍵接続にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/bc0dc0fe-a006-f1c6-2c55-44a1106687ab.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/ea7ff3b6-82fe-b9b3-c44e-c5f1721b478b.png)

# 7. まとめ

multipassのKVMのIPアドレスを気にせずログインできるようになるのは便利です。
ローカルホストで接続するポート(今回だと30002)が変わってしまうところが惜しい。