LinodeでWireGuardを月額5ドルで構築する 

# Linodeとは

Linodeについてはこちらを参照。

https://qiita.com/isss802/items/5313c7a6da1d9ed50a38

# WireGuardとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/19cb5ffa-4ce7-210d-282f-559ffabb60ce.png)
WireGuard®は、最先端の暗号技術を利用した、非常にシンプルかつ高速な最新の VPN です。
IPsecやOpenVPNよりも高速で、シンプルで、高いパフォーマンスを発揮することを目的としています。
サイト間VPNや端末型VPNを低コストでセキュアに構築することができます。
WireGuardは汎用VPNとして設計されており、さまざまなプラットフォームに対応します。
現在はクロスプラットフォーム（Windows、macOS、BSD、iOS、Android）で広く展開されています。


https://www.wireguard.com/


# Linodeで構築するWireGuard

今回はLinode上でWireGuardのサーバーを構築し、WindowsにWireGuardのクライアントをインストールしてVPN接続をする構成となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/822905c6-dfeb-4939-f7e9-ba912894eb5d.png)


この構成では、以下のような様々な用途でWireGuardを利用することができます。

- 送信元IP固定が必要なSaaSなどへアクセスするために利用する
- LinodeのインスタンスにVPN経由でセキュアにアクセスするために利用する
- 接続元IPに地理的なロケーションが必要な要件に利用する

## インスタンスの選定

WireGuardを最小構成で構築する場合、Linode側は Shared CPU(共有)プランのNanode 1GB 月額5ドルから構築することができます。
Nanode 1GBでは、インバウンド40Gbps、アウトバウンド1Gbpsの帯域が確保されており、5ドルのインスタンス費用の中に、ネットワークのアウトバウンド転送量1TB分の料金が含まれています。
1TB分のアウトバウンド転送量の範囲での利用であれば、追加の費用はかかりません。
もし超過した場合には1GBあたり0.01ドルがかかります。インバウンド転送量は無料です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/487e53f3-758a-fbee-5769-fb587b0e2303.png)

今回は、最小構成であるNanode 1GBで構成します。
インスタンスの選定に関しては以下の記事を参照ください。

https://qiita.com/isss802/items/c53315615a7e087cc41a


## リージョンの選定

執筆時点でLinodeは11のリージョンに拠点を展開しています。
今回は、接続元（VPNクライアント側）は日本、接続先となるリージョンはFremontとして構築を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/d9bf80a9-5196-7ddb-3aed-092e96f64313.png)

各リージョンではSpeed Testできる環境を用意しており、リージョンの選定の参考にすることができます。

https://www.linode.com/ja/speed-test/


## Linodeインスタンスの構築

Linodeのコンソールからインスタンスを作成します。

- Ubuntu 最新のLTSを選択
- RegionはFremontを選択
- InstanceはNanode 1GBを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/2c09015c-d9bd-ddbf-bfdc-f8f7de901110.png)

- Private IPにチェック（同一リージョンのインスタンスへ接続するため）
- Create Linodeを選択し、インスタンスを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/6891f867-7bb3-c15a-ba29-428eca8d5b9f.png)

作成された際に表示されるインスタンスのIPアドレスを控えておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/16b18e51-ebf1-493b-9768-f2023b1c157f.png)

## サーバーにWireGuardをインストール

VPNのネットワークから別のネットワークに通信するため、IPフォワーディングを許可する。

```
root@localhost:~# vim /etc/sysctl.conf

net.ipv4.ip_forward=1  # コメントアウトを外す
```

設定を反映する。

```
root@localhost:~# sysctl -p
net.ipv4.ip_forward = 1
```

net.ipv4.ip_forwardが1になっていれば問題ない。

```
root@localhost:~# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
```

WireGuardをインストールします。

```
apt update
apt install wireguard
```

WireGuardで使用する鍵を作成します。
鍵は以下の３種類を用意する必要があります。
- サーバー用のPrivate Key(秘密鍵)とPublic Key（公開鍵）
- クライアント用のPrivate Key(秘密鍵)とPublic Key（公開鍵）
- サーバーとクライアントで利用する、preshared-key(事前共有鍵）

サーバー用のPrivate Key(秘密鍵)を作成。

```
wg genkey | sudo tee /etc/wireguard/server_private.key
chmod 600 /etc/wireguard/server_private.key
```

サーバー用のPublic Key（公開鍵）を作成。

```
cat /etc/wireguard/server_private.key | wg pubkey | tee /etc/wireguard/server_public.key
chmod 600 /etc/wireguard/server_public.key
```

クライアント用のPrivate Key(秘密鍵)を作成。

```
wg genkey | tee /etc/wireguard/client1_private.key
chmod 600 /etc/wireguard/client1_private.key
```

クライアント用のPublic Key（公開鍵）を作成。

```
cat /etc/wireguard/client1_private.key | wg pubkey | tee /etc/wireguard/client1_public.key
chmod 600 /etc/wireguard/client1_public.key
```

preshared-key(事前共有鍵）を作成。

```
wg genkey | tee /etc/wireguard/client1_preshared.key
chmod 600 /etc/wireguard/client1_preshared.key
```

VPN用のインターフェイスの設定を作成。

```
root@localhost:~# cat /etc/wireguard/wg0.conf
[Interface]
PrivateKey = [/etc/wireguard/server_private.key の内容を記載]
Address = 172.16.0.254/24
ListenPort = 51820
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

[Peer]
PublicKey = [/etc/wireguard/client1_public.key の内容を記載]
PresharedKey = [/etc/wireguard/client1_preshared.key の内容を記載]
AllowedIPs = 172.16.0.1/32
```

クライアント用の設定を作成。
今回の場合、VPN接続時に利用するDNSはGoogle Public DNS(8.8.8.8)を指定しています。

```
root@localhost:~# cat /etc/wireguard/wireguard_client1.conf
[Interface]
PrivateKey = [/etc/wireguard/client1_private.key の内容を記載]
Address = 172.16.0.1/24
DNS = 8.8.8.8

[Peer]
PublicKey = [/etc/wireguard/server_public.key の内容を記載]
PresharedKey = [/etc/wireguard/client1_preshared.key  の内容を記載]
EndPoint = [LinodeのIPアドレスを記載]:51820
AllowedIPs = 0.0.0.0/0
```

VPNインターフェイスを起動し、自動起動をするように設定する。

```
wg-quick up wg0
systemctl enable wg-quick@wg0
```

## クライアントにWireGuardをインストール

SCP等を利用して先程作成したクライアント用の設定をダウンロードします。

```
scp root@[LinodeのIPアドレス]:/etc/wireguard/wireguard_client1.conf ./
```

クライアントはWindowsになるため、Windowsのインストーラーをダウンロードしてインストールします。

https://www.wireguard.com/install/

アプリを起動したら「ファイルからトンネルをインポート」を選択し、先程ダウンロードした設定ファイルを読み込みます。

<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/f022e1eb-b259-f007-b115-0384aeae6d4a.png">

「有効化」を選択し、VPNが接続できれば設定は完了です。

<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/6c0f4bb1-0bc1-4791-2344-205a81efc8d8.png">

## クライアントの接続確認

接続元がLinodeのIPになっていることを確認します。
今回は、whatismyipのサイトでFremontとして扱われていることを確認しています。

http://ds.whatismyip.akamai.com/advanced

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/13174bdf-0a6d-b059-7964-b6ddfc52823f.png">


同一リージョンのLinodeインスタンスへ、SSH接続できることを確認します。
コンソールからプライベートIPアドレスを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/fac7ee71-d06f-f36f-ad2b-e5b2a354c6fe.png)

```
ssh root@192.168.211.253

Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-47-generic x86_64)
```

プライベートIPへのSSHの接続がVPN経由で行うことができました。

## ネットワーク転送量の確認

各インスタンスの設定から、「Network」のタブを選択することでネットワーク使用量が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/999d6907-13dd-6984-9247-e2fd88c5f705.png)


「Settings」のタブからは、追加のネットワーク転送料がかかる前に、設定されたしきい値を超えたらメールにてアラートを通知してくれる設定ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/1f924358-b5ea-3313-4a62-554bf5df4c9c.png)


# まとめ

WireGuardをLinodeで利用することで、低コストでVPN環境を構築することができました。
他のインスタンスへ接続する際の接続元としても利用することができ、セキュアなサーバー環境を用意するためにも利用することができます。

# 関連記事

アカマイ・テクノロジーズ合同会社のQiitaではLinode関連など開発者向けの記事を記載しております。

https://qiita.com/organizations/Akamai