WireGuardは良き 〜インストールから導入まで〜

## はじめに
　この記事ではWireGuardの導入方法を解説しています。私も日頃から利用していますが、リモートデスクトップ接続しても概ね安定して利用できています。

### 環境
Ubuntu 20.04 LTS

## インストール
```shell
sudo apt -y update&&sudo apt -y upgrade&&sudo apt -y autoremove
sudo apt -y install wireguard
```
　`apt`コマンドを用いてパッケージの更新をしてから、WireGuardのパッケージをインストールします。

## カーネルパラメーターの設定
　この設定を行わないと、インターネットに接続できなくなってしまいます。
```shell
sudo nano /etc/sysctl.conf
```
```diff_conf:/etc/sysctl.conf
- #net.ipv4.ip_forward=1
+ net.ipv4.ip_forward=1
```
　設定ファイルを書き換えた後は、以下のコマンドで変更を反映します。
```shell
sudo sysctl -p
```

## ファイアウォールの設定
　ufwを有効化していない場合は、以下のコマンドで有効化します。
```shell
sudo ufw enable
```
　私の環境では、IPv6を利用しないのでIPv6を無効化するために設定ファイルを書き換えます。
```shell
sudo nano /etc/default/ufw
```
```diff_conf:/etc/default/ufw
- IPV6=yes
+ IPV6=no
```
　51820ポートをudpで通信するために`ufw`コマンドを用いてそのポートを許可します。もちろん、セキュリティー対策のために適当なポートに変更しても構いません。
```shell
sudo ufw allow 51820/udp
```

## 鍵の生成
　WireGuardでは公開鍵認証を用いて認証します。なので、手動で鍵を生成する必要があります。本来、WireGuardはPeer to Peer(P2P)なのでサーバーとクライアントという概念はないのですが、わかりやすく鍵の名前は`server.key`や`client0.pub`にしています。

### 秘密鍵と公開鍵の生成
```shell
# 分かりやすいように生成した鍵は、以下のディレクトリに入れていくことにします。
sudo mkdir /etc/wireguard/wg0

# サーバー側の持つ公開鍵と認証鍵を生成します。
sudo wg genkey | sudo tee /etc/wireguard/wg0/server.key
sudo cat /etc/wireguard/wg0/server.key | sudo wg pubkey | sudo tee /etc/wireguard/wg0/server.pub

# クライアント側が持つ公開鍵と秘密鍵を生成します。
sudo wg genkey | sudo tee /etc/wireguard/wg0/client0.key
sudo cat /etc/wireguard/wg0/client0.key | sudo wg pubkey | sudo tee /etc/wireguard/wg0/client0.pub
```

### 事前共有鍵の生成
　この鍵を利用するかどうかはオプションになっているみたいです。利用するとより安全になるみたいです。
```
sudo wg genkey | sudo tee /etc/wireguard/wg0/client0-preshared.key
```

## サーバー側の設定ファイルの作成
　先程生成した鍵を利用して設定ファイルを作成します。設定ファイルの名前は、「wg0.conf」にしてください。
```shell
sudo nano /etc/wireguard/wg0.conf
```
```conf:/etc/wireguard/wg0.conf
[Interface]
Address = 192.168.5.1/24
SaveConfig = true
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
PrivateKey = [server.keyの内容]

[Peer]
PublicKey = [client0.pubの内容]
PresharedKey = [client0-preshared.keyの内容]
AllowedIPs = 192.168.5.2/32
```

## クライアント側の設定ファイルの作成
　同じく、先程生成した鍵を利用して設定ファイルを作成します。
```shell
sudo nano /etc/wireguard/client0.conf
```
```conf:/etc/wireguard/client0.conf
[Interface]
Address = 192.168.5.2/24
DNS = [DNSサーバーのIPアドレス]
PrivateKey = [client0.keyの内容]

[Peer]
PublicKey = [server.pubの内容]
PresharedKey = [client0-preshared.keyの内容]
AllowedIPs = 0.0.0.0/0
Endpoint = [サーバーのIPアドレス]:51820
PersistentKeepalive = 25
```

## WireGuardの起動と永続化
```shell
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0
```

## WireGuardの停止と無効化
```shell
sudo wg-quick down wg0
sudo systemctl disable wg-quick@wg0
```

## Windows側の設定をする場合
　「トンネルの追加」ボタンで、作成したクライアント側の設定ファイルを読み込ませた後にしておくと便利な設定があります。それは、右下にある「編集」ボタンで編集ウィンドウ開き、一番下の「トンネルを通らないトラフィックのブロック（キルスイッチ）」のチェックを外すことです。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/82a0e394-11e7-5b81-237e-d4bf7d30508c.png)
　このチェックをそのままにすると、例えば、LAN上にある共有ドライブにアクセスできなくなったりします。

## おわりに
　グローバルIPアドレスを持つサーバーが一台必要になりますが、WireGuardを利用すると外出先から自宅のデスクトップパソコンをアクセスして重い処理するみたいなこともできるようになりますね。

## 参考文献
https://knowledge.sakura.ad.jp/27323/