Windowsのmultipassに同じサブネットのIPを割り当てるには

# はじめに

[multipass](https://multipass.run/)をサーバアプリ開発に利用するには、クライアントからアクセスできるようにネットワークをbridgeする必要がある。そして、bridgeを使用する前提条件として、同じサブネットにDHCPサーバが稼動している必要がある。<sup><a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>

ここでは、bridge設定したmultipassのインスタンス化と、そのインスタンスでのWebサーバの起動手順を説明する。

# Windowsターミナルの起動
スタートメニューからWindowsターミナルを起動する。

# Windowsのネットワークの確認
bridgeに使用するネットワークを確認するため、Windowsターミナルから次のコマンドを実行する。
`multipass networks`
以下に実行例を示す。
![getNetworks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59920/4ecdbbef-3ae0-9d6b-06ff-3816b0ed009a.png)
bridgeの使用時に指定するネットワークは、出力結果のNameカラムの値となる。
PCに複数のネットワークI/Fがある場合、複数のネットワークが表示される。
この場合、DHCPと同じサブネットに接続されているネットワークを選ぶこと。

# multipassインスタンスの起動  
Windowsターミナルから次のコマンドを実行する。
*network-name* には、上記のNameカラムの値を指定すること。
`multipass launch -n` *instance-name* `--network` *network-name*
以下に、CPU:2つ、メモリ:2G、名前:vscodeのmultipassインスタンスの起動例を示す。
![launch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59920/d7efbaee-f0f4-9a2c-a069-7383cb9f50d9.png)

# multipassインスタンスのIPアドレスの確認
 Windowsターミナルから次のコマンドを実行する。
`multipass info` *instance-name*
以下に、上記で起動したmultipassインスタンスの確認例を示す。
![multipassInfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59920/4d7c113b-1c2a-bff8-1a23-e9c3b31b34ef.png)
出力結果から、今回作成したmultipassインスタンス:vscodeにIPアドレスに192.168.0.27が割当てられていることが確認できる。

# windowsユーザの認証鍵の生成
デフォルト状態のmultipassインスタンスは、SSHサーバは公開鍵認証を許可している。そこで、Windowsユーザの公開鍵を作成して、それをmultipassインスタンスとの認証に使用する。公開鍵の作成には、Windowsターミナルで`ssh-keygen`コマンドを実行する。

以下に、RSA 2048ビットの公開鍵を作成するコマンドを示す。Nオプションの引数は、Powershellで実行する場合とcmdプロンプトで実行する場合で異なるので注意されたい。詳細は、[Automated ssh-keygen without passphrase, how?](https://unix.stackexchange.com/questions/69314/automated-ssh-keygen-without-passphrase-how?msclkid=408f4f3bc30011ec9ed53bdccc9bebd2)を参照されたい。
`ssh-keygen -q -t rsa -b 2048 -N '""'`
上記のコマンドを実行すると、鍵の保存場所を聞いてくるで、デフォルトのままとする。
    
    PS C:\Users\takus> ssh-keygen -t rsa -b 2048 -N '""' -q
    Enter file in which to save the key (C:\Users\takus/.ssh/id_rsa):
    
:::note alert
もし、既にRSAの公開鍵を持っている場合、次のような上書きの警告が出る。
この場合、既存の鍵を破壊してしまうので、必ず **n** を押下して公開鍵生成を中止することを勧める。

    PS C:\Users\takus> ssh-keygen -t rsa -b 2048 -N '""' -q
    Enter file in which to save the key (C:\Users\takus/.ssh/id_rsa):
    C:\Users\takus/.ssh/id_rsa already exists.
    Overwrite (y/n)? n
    PS C:\Users\takus>
:::    
以下に、RSA 2048ビットの公開鍵を作成の例を示す。
![sshKeygen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59920/75986d6c-9bd9-6bf5-0312-5d28dc86f288.png)

# multipassインタンスへの公開鍵のコピー
上記で作成した公開鍵は、 `${env:homepath}\.ssh\id_rsa.pub` に保存される。この公開鍵をmultipassインスタンスの`/home/ubuntu/.ssh/authorized_keys` に追記することで、公開認証でのログインが可能となる。
`/home/ubuntu/.ssh/authorized_keys` の追記方法は種々あるが、ここでは1stepでの追記方法を示す。
    
    multipass exec vscode -- sh -c "cat <<EOF >>~/.ssh/authorized_keys
    $(get-content ${env:homepath}\.ssh\id_rsa.pub)
    EOF
    "
    
以下に公開鍵の追記の実行例を示す。
![modifyKeys.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59920/5f828d9b-35c7-2ef6-e341-3c2ac49b7f6a.png)

# multipassインスタンスへのログインとWebサーバ起動
multipassインスタンスへのSSHログインのコマンドを示す。
`ssh` *ubuntu@*`上記のmultipass info`*で確認したIPアドレス*
以下に、sshでログインする例を示す。
![login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59920/39b0ae2a-39a9-8926-4064-66697706c199.png)

## Webサーバのインストール
次に、httpサーバをインストールする例を示す。
`sudo apt install apache2`
![installApache2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59920/10b99762-b0b2-f9c5-4e9d-845059fbe1cf.png)

## mDNS/DNS-SDのインストール
mDNS/DNS-SDであるavahi-daemonをインストールして、*instance-name*.local でアクセスできるようにする。
`sudo apt install avahi-daemon`
![installAvahi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59920/3c029de2-a882-db41-8963-a235c161ffbc.png)

## WindowからのWebサーバのアクセス
最後に、WindowsからFQDNでアクセスした例を示す。
![accessApache2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59920/f5ac76fe-edca-bbba-808f-090de3fea48e.png)

***
<sup><a id="fn.1" href="#fnr.1">1</a></sup> multipassインスタンスでstaticにIPアドレスを設定する場合を除く