デフォルトルートにWireguardを使用する

## 目的
デフォルトルートをwireguardのピアに向ける必要性が出てきたので、今回は検証がてら試してみる。

## 構成
今回はnode1のゲートウェイをnode2に向け、node2とnode3間にwireguardで貼っているピアにトラフィックを流す。

![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/1fdf243f-3c7b-20c3-82f5-2af7888222ca.png)

## 環境

各VMは172.24.20.0/24の空間に所属しており、172.24.20.254にゲートウェイがある。node2はGWを10.6.6.1に向けないといけないと思うかもしれないが、wireguard側でallow ipを0.0.0.0/0を指定する事によって自動的にwg側にGWが向く

| node | ip | GW |
| -------- | -------- | -------- |
| node1     | 172.24.20.121    | 172.24.20.122  |
| node2    | 172.24.20.122<br>10.6.6.2/24   | 172.24.20.254  |
| node3    | 172.24.20.120<br>10.6.6.1/24     | 172.24.20.254  |


<br>

## node1の設定
node1で行う事は以下である。
1. networkの設定(ipの割り当て、gatewayの設定)

### networkの設定
/etc/netplan/00-installer-config.yaml

```yml
network:
  ethernets:
    ens160:
      addresses:
      - 172.24.20.121/24
      gateway4: 172.24.20.122
      nameservers:
        addresses:
        - 172.24.2.51
        search: []
  version: 2
root@shoma:/
```

<br><br><br>
## node3の設定
今回は、node3側にwg gen webを構築するため、先にこちらを構築する。node3で行う設定は以下の通りである。

1. ネットワークの設定
2. ルーティングの設定 
3. wireguardの構築
4. wg gen webの構築 
5. node2用のconfigの設定

### networkの設定

```yml
network:
  ethernets:
    ens160:
      addresses:
      - 172.24.20.120/24
      gateway4: 172.24.20.254
      nameservers:
        addresses:
        - 172.24.2.51
        search: []
  version: 2
```

### ルーティングの設定

nano /etc/sysctl.conf

下記を編集

```conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1   ← 行頭の # を消してコメントを解除する
```
sysctlコマンドを実行し、変更を反映します。

```bash
sudo sysctl -p
```

### wireguardの構築
```bash
apt -y update
apt -y install resolvconf wireguard docker docker-compose
```
wireguardの起動
```bash
$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0
```

wg gen webの構築
docker-compose.yml
```yml
version: '3.6'
services:

  wg-gen-web:
    image: vx3r/wg-gen-web:latest
    container_name: wg-gen-web
    restart: unless-stopped
    environment:
      WG_STATS_API: http://172.24.20.120:8182
      WG_CONF_DIR: /data
      WG_INTERFACE_NAME: wg0.conf
      OAUTH2_PROVIDER_NAME: fake
    volumes:
      - /etc/wireguard:/data
    ports:
      - 8080:8080

  wg-json-api:
    image: james/wg-api:latest
    container_name: wg-json-api
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
    network_mode: host
    command: wg-api --device wg0 --listen 172.24.20.120:8182
```

起動
```bash
docker-compose up
```

wg gen webにアクセス
serverの設定に移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/7f305798-03e8-3470-91d8-23b662c52011.png)

設定する項目は以下の通り
- Public endpoint for clients to connect to
- PostUP
- PostDown

endpointの項目には以下の内容を入れる。clientから直接疎通が取れるIPを指定する必要がある。フォワーディング等をしている場合はフォワーディング元を指定する。
```bash
172.24.20.120:51820
```

PostUPの項目には以下の内容を入れる
```bash
iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens160 -j MASQUERADE;iptables -A FORWARD -o wg0 -j ACCEPT
```

PostDownの項目には以下の内容を入れる
```bash
iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens160 -j MASQUERADE;iptables -D FORWARD -o wg0 -j ACCEPT
```

設定するとこの様な形になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/5496a070-b2e0-1261-cfef-5263464b27a4.png)


### node2用のconfigファイルを生成
ADD NEW CLIENTから新しいコンフィグを設定できる。基本的にFriendly nameを指定するだけで良い。wg0という名前が良い。configを生成できたら、ダウンロードしておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/49da3b54-5384-c13b-ddc1-694b993fd15e.png)



### wireguardを再起動
```bash
$ sudo systemctl restart wg-quick@wg0
```


<br><br><br>
## node2の設定
node2の設定は以下の通りである
1. networkの設定
2. wireguardの構築
3. コンフィグファイルのインポート
4. natの設定
5. ルーティングの設定
6. wireguardを起動(ピアを張る) 

### networkの設定
/etc/netplan/00-installer-config.yaml
```yml
network:
  ethernets:
    ens160:
      addresses:
      - 172.24.20.122/24
#      gateway4: 172.24.20.254
      nameservers:
        addresses:
        - 172.24.2.51
        search: []
```
wireguardをインストールするまではgateway4のコメントアウトは外しておいて良い。

### wireguardの構築
```bash
apt -y update
apt -y install resolvconf wireguard
```

### コンフィグファイルのインポート
先ほどダウンロードしたファイルをwg0.confと言う名前で、/etc/wireguard/配下に配置する。

ちなみにwg0.confの中身は以下の様である

```conf
[Interface]
Address = fd9f:6666::1/128, 10.6.6.2/32
PrivateKey = EB2Ge2TvBVX243wKJ02cR0OZ87frxcXlEP5IHf8E0no=
DNS = fd9f::10:0:0:2

[Peer]
PublicKey = ghAxGSjKBOHGLNchHCZscrjTUghXmWj5sy38lRyNUHo=
PresharedKey = JO8TKp9bURiFKCYBxpjJKADdVb4413wAPkMPXOeI04s=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 172.24.20.120:51820
PersistentKeepalive = 16
```

### natの設定

ens160で受け取ったパケットをwg0に流し、wg0でnatをかける設定を入れる。

```bash
root@shoma:/etc# sudo iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
root@shoma:/etc# sudo iptables -A FORWARD -i ens160 -o wg0 -j ACCEPT
```

### ルーティングの設定

nano /etc/sysctl.conf

下記を編集

```conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1   ← 行頭の # を消してコメントを解除する
```
sysctlコマンドを実行し、変更を反映します。

```bash
sudo sysctl -p
```


### wireguardの起動

起動
```bash
$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0
```

ピアを張れているか確認
```bash
root@shoma:/home/shoma# wg show
interface: wg0
  public key: IeNrzdh+fix5VTj29Aoy0sIgLaiHxeA+8I6LKOnc6nE=
  private key: (hidden)
  listening port: 55529
  fwmark: 0xca6c

peer: ghAxGSjKBOHGLNchHCZscrjTUghXmWj5sy38lRyNUHo=
  preshared key: (hidden)
  endpoint: 172.24.20.120:51820
  allowed ips: 0.0.0.0/0, ::/0
  latest handshake: 2 seconds ago
  transfer: 92 B received, 180 B sent
  persistent keepalive: every 16 seconds
```


## 経路の確認
node1から8.8.8.8への経路をmtrコマンドで確認する。gateway(172.24.20.122)から、wireguardを通り10.6.6.1(node3)を到達し、上流へ流れている事が確認出来る。

node1: mtr 8.8.8.8

```bash
                             My traceroute  [v0.95]
shoma (172.24.20.121) -> 8.8.8.8 (8.8.8.8)             2023-11-15T15:39:35+0000
Keys:  Help   Display mode   Restart statistics   Order of fields   quit
                                       Packets               Pings
 Host                                Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. _gateway                          0.0%     4    0.1   0.1   0.1   0.2   0.0
 2. 10.6.6.1                          0.0%     4    0.3   0.3   0.3   0.4   0.0
 3. 172.24.20.254                     0.0%     4    1.2   1.2   1.2   1.3   0.0
 4. 150.99.196.193                    0.0%     4    1.3   1.4   1.3   1.5   0.1
 5. 150.99.10.187                     0.0%     4    1.8   1.8   1.7   1.9   0.1
 6. 210.171.224.96                    0.0%     4    2.0   1.9   1.8   2.0   0.1
 7. 108.170.242.193                   0.0%     4    3.4   3.8   3.4   5.0   0.8
 8. 108.170.227.93                    0.0%     4    2.8   3.2   2.8   3.7   0.4
 9. dns.google                        0.0%     4    2.1   2.6   2.1   4.0   0.9
```