Harada's Diary

WireGuardをいれるなど

AmazonブラックフライデーでChromeBookを買いました。
おしゃれなエンジニア系ブロガーとして近所のカフェでこのブログ記事を執筆することが多いのですが、カフェのフリーWifiを使わせてもらうことがあります。
ただ、情シスに関わる身でもありますので、情報の窃取などは怖いわけでありまして。。

VPC貼れば多少は安全性も高まるだろうと思うのですが、どうせなら自前で用意してもおもしろいのでは?ということで
WireGuardを使ったVPNサーバの設計をしてみました。

環境

Amazon Linux2023 minimal
OS側のFirewallは特に入れてないです(SecurityGroupで制御)

最近気付いたんですが、MinimalイメージというAMIを使うと、最小EBSボリュームが8GiB -> 2GiBで済むらしいです。
フットプリントが少ないシステムだったので、こちらのイメージを使っています。(コストも少ないし)

https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/AMI-minimal-and-standard-differences.html

インストール

sudo dnf -y update
sudo dnf -y install iptables wireguard-tools

AL2023だとそのままWireguardが入ります。

カーネルパラメーターの設定

トラフィックの転送設定を入れます。

sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -p

鍵の生成

WireGuardでは公開鍵認証を用いて認証するので手動で鍵を生成する必要があります。
鍵の名前はserver.keyclient0.pubにしときます。

秘密鍵と公開鍵の生成

# 分かりやすいように生成した鍵は、以下のディレクトリに入れていくことにします。
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」とします。

sudo vi /etc/wireguard/wg0.conf

/etc/wireguard/wg0.conf

[Interface]
Address = 192.168.200.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.200.1/32

クライアント側の設定ファイルの作成

 同じく、先程生成した鍵を利用して設定ファイルを作成します。

sudo vi /etc/wireguard/client0.conf

/etc/wireguard/client0.conf

[Interface]
Address = 192.168.200.2/24
DNS = [DNSサーバーのIPアドレス、8.8.8.8とかでも]
PrivateKey = [client0.keyの内容]

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

WireGuardの起動と永続化

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

WireGuardの停止と無効化

sudo wg-quick down wg0
sudo systemctl disable wg-quick@wg0

サーバ側の設定は以上となります。
先程作成したクライアント側のconf /etc/wireguard/client0.confは、利用する端末にダウンロードしておきましょう。
※外部に漏れないようにだけ注意しましょ。

Windows側の設定をする場合

「トンネルの追加」ボタンで、作成したクライアント側の設定ファイルを読み込ませます。
ちなみに「トンネルを通らないトラフィックのブロック(キルスイッチ)」のチェックを外さないと、LAN上にある共有ドライブにアクセスできなくなったりします。

ChromeBook側の設定をする場合

一部の Chromebook には、WireGuard プロトコルの基本的なサポートが組み込まれています。
しかし、作成したクライアントconfファイルを直接読み込ませる形式ではなく、パラメータを入力する必要があることに注意です。

余談ですが、Chromebook内蔵のWireguardは不安定?らしく、私の環境では開発環境にSSHができないということはありました。
色々調べた結果、ネットワーク・インターフェースのMTUを調整したらSSHできるようになりました。

sudo ip link set dev eth0 mtu 1280

おわり

ちなみにこちらのブログをほぼ丸パクりしたものですので、万が一苦情入ったらこちらは非公開にします、、

https://qiita.com/yuito723/items/13d9ddafe0f10bb8d2b7