Wireguard（その１）＆久しぶりにGNS3（その40）

# Wireguardを試す
Linuxでサイト間VPN（+暗号化）を試そうと調べていたところ、WireguardがEasyらしいということがわかり、試してみることにした。シリーズ投稿中の「Network Namespace」で実現したかったのであるが、まずは確実なGNS3のVM環境でトライ。

## 情報
下記サイトをもとに設定。
- [WireGuard VPN site-to-site](https://ubuntu.com/server/docs/wireguard-vpn-site-to-site)
- [オープンソースVPN 「WireGuard」とは？ホワイトペーパーから読み解く仕組みや実用性](https://ascii.jp/elem/000/004/125/4125073/)
- [WireGuardとOpenVPNの比較：違いの全て](https://qiita.com/pseudonym2/items/0c9bfab3f0ded35f0cfc)

## ネットワーク環境
下記環境。

![Topology1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/aefd8893-1846-a15b-e11b-074af0d244d1.png)

- WireguardによるVPNをRouter1-Router2間で確立
    - Router1およびRouter2ネットワーク：172.16.1.0/24
    - Wireguardトンネルネットワーク：10.1.1.0/24
    - 両端ネットワーク192.168.10.0/24および192.168.20.0/24がトンネル対象ネットワーク

## 設定
Router1およびRouter2での設定である。

### ルーティング
```shell:/etc/sysctl.conf
net.ipv4.ip_forward=1
```

### Wireguard
#### 秘密鍵と公開鍵の作成
Router1での設定（Router2でも同様）。

```shell
$ wg genkey | sudo tee /etc/wireguard/wg1.secret | wg pubkey | sudo tee /etc/wireguard/wg1.public
```

- wg1.secret：秘密鍵
- wg1.public：公開鍵（Router2に渡す）

#### 鍵情報やIPアドレスの設定
こちらもRouter1での設定（Router2でも同様）。

```shell
Router1:~$ sudo cat /etc/wireguard/wg1.conf
[Interface]
PrivateKey = 2Cd38b+7RDpOG7MjDNaWQ1Hi9n7/pgqohxtcQDsbZ1M=
Address = 10.1.1.1/30
ListenPort = 61000

[Peer]
PublicKey = uPvlAwRi5m1XJ7sZMnyOfDTqUKWI5IPYQEXK+pK6k1Q=
AllowedIPs = 10.1.1.2/32,192.168.20.0/24
Endpoint = 172.16.1.2:61000
```

- [Interface]：自身の設定
    - PrivateKey：秘密鍵
    - Address：VPNとしてのIPアドレス
    - ListenPort：待ち受けするUDPポート
- [Peer]：相手の設定
    - PublicKey：公開鍵
    - AllowedIPs：VPN対象とする相手側のIPアドレス
    - 相手のIPアドレスおよび接続ポート

#### 鍵や設定情報を置く場所
同じくRouter1の情報。/etc/wireguardに配置。

```shell
Router1:~$ sudo ls -l /etc/wireguard/
total 16
-rw-r--r-- 1 root   root   245 Dec 10 10:54 wg1.conf
-rw-r--r-- 1 root   root    45 Dec  9 08:27 wg1.public
-rw-r--r-- 1 root   root    45 Dec  9 08:27 wg1.secret
-rw-r--r-- 1 debian debian  45 Dec  9 08:33 wg2.public
```
自明（wg1.publicは、Router1では不要）。

## 検証
### 起動
まずはWireguardを起動。下記はRouter1での様子。

```shell
Router1:~$ sudo wg-quick up wg1
[#] ip link add wg1 type wireguard
[   98.400558] wireguard: WireGuard 1.0.0 loaded. See www.wireguard.com for information.
[   98.406853] wireguard: Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
[#] wg setconf wg1 /dev/fd/63
[#] ip -4 address add 10.1.1.1/30 dev wg1
[#] ip link set mtu 1420 up dev wg1
[#] ip -4 route add 192.168.20.0/24 dev wg1
```

- wg1というトンネルネットワークインターフェースを作成
- IPアドレスアサイン
- MTU設定（Wireguardは80(=1500-1420)バイトのヘッダサイズ？）
- 対向トンネルネットワークのスタティックルート設定

### 終了
念のため終了も記載。

```shell
Router1:~$ sudo wg-quick down wg1
[#] ip link delete dev wg1
```

- トンネルネットワークインターフェース削除

### 末端PCどうしの疎通＆パケット確認
左端PCから右端PCへのping実行。

```shell
PC1> ping 192.168.20.2

84 bytes from 192.168.20.2 icmp_seq=1 ttl=62 time=46.837 ms
84 bytes from 192.168.20.2 icmp_seq=2 ttl=62 time=9.248 ms
84 bytes from 192.168.20.2 icmp_seq=3 ttl=62 time=10.382 ms
84 bytes from 192.168.20.2 icmp_seq=4 ttl=62 time=3.290 ms
84 bytes from 192.168.20.2 icmp_seq=5 ttl=62 time=12.983 ms
```

この時のWiresharkデータを見る。

#### 基本シーケンス
![1_Wireguard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/de09fae8-f46c-9bc0-2ef9-b97f727cd3c9.png)

- WireguardはUDPパケット上でやりとりされている
- Handshake
    - Initiation
    - Response
- Transport Data
    - ここでは、上記ping5回分のデータのようだ
- Keepalive

IPsec/IKEと比べるとネゴシエーションが少ない。

#### ポート番号に依存せず、解釈してくれる？
ここは、Wiresharkの話。設定ファイルでポート61000を指定しても（下記）、

![2_Port61000+Init.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/6509a226-5b6e-139b-e1d5-fe1eb5f5fe88.png)

ポート番号31000を指定しても（下記）

![3_Port31000+CryptDataのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/fa89ead6-6a1e-1f01-bca8-b26816a5db5f.png)

Wiresharkでは、Wireguardと把握してくれる。スマート。

なお、上記は、Handshake InitiationおよびTransportパケットの詳細でもある。内容は割愛。

参考までに、他のパケットの詳細も紹介。こちらは、Handshake Response。

![HandshakeResponse.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/1557b1dd-3d38-4101-012b-51f14e8d0956.png)

こちらはKeepalive。

![4_Port61000+KeepAlive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/6f2607f6-81c8-8c54-a32c-28b7d5a21447.png)

#### Router2とPC2との間
参考までに、Wireguard通過（デコード）後のWiresharkデータも紹介。

![5_pingBetweenR2andPC2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/0af820c7-c0b3-fbfe-53d5-f4a05fb86d30.png)

当然だが、生データが見える。

EOF