🐉

ラズパイでWireGuard(+wireguard-ui)の構築

に公開
3

はじめに

放置されているラズパイ(3B+)があったのでラズパイ上にWireGuardのサーバとwireguardのコンフィグをいい感じに生成してくれるwireguard-uiを立ててみました。

変更履歴

  • 2023/10/11
    • 再起動を追記しました
  • 2024/3/14
    • コメントに対する修正を行いました
      • PublickKey -> PublicKey typoを修正しました
      • クライアント側の/etc/wireguard/wg0.confの先頭に[Interface]を追記しました
  • 2025/5/11
    • コメントに対する修正を行いました
      • wireguard-uiによって生成されるコンフィグを使用するように修正しました
    • 全体的な修正を行いました
      • タイポの修正
      • 写真の変更
      • 流れの修正
      • 文章の修正
    • wireguard-ui v0.6.1 arm64での検証を行いました

環境

Hardware: Raspberry Pi 3 Model B+
OS: Ubuntu Server 22.04.3 LTS(64-bit)
wireguard-ui: v0.5.2 arm64 v0.6.1 arm64

WireGuardとは

WireGuardとは、最先端の暗号技術を利用した、極めてシンプルかつ高速な最新のVPNです。WireGuardは、汎用VPNとして設計されており、当初はLinuxカーネル向けにリリースされたが、現在はクロスプラットフォーム(Windows、macOS、BSD、iOS、Android)で広く展開されています。

また、WireGuardは非常にシンプルながらも、OpenVPNやIPsecよりも高いパフォーマンスを謳っています。

https://www.wireguard.com

wireguard-uiとは

wireguard-uiとはWireGuardの設定を管理するためのWebユーザーインターフェースです。

https://github.com/ngoduykhanh/wireguard-ui

WireGuardのインストールと設定

WireGuardのインストール

  1. 恒例行事
sudo apt update && sudo apt upgrade
  1. WireGuardのインストールする
sudo apt install wireguard

他のOSの場合には以下を参照していただくとダウンロードできます。
https://www.wireguard.com/install/

WireGuardの設定の前に

wireguard-uiを使わない場合のWireguardの設定も付属で載せています。
wireguard-uiを使わない場合のWireGuardの設定はこちら

wireguard-uiのインストール

ではここから、wireguard-uiを使ったWireGuardの設定を記載します。
任意のディレクトリで行ってください。今回は/opt/wireguardで行います。

  1. ディレクトリの作成と移動を行う
sudo mkdir /opt/wireguard
cd /opt/wireguard
  1. wireguard-uiのダウンロードして展開する
sudo curl -fsSLO https://github.com/ngoduykhanh/wireguard-ui/releases/download/v0.6.1/wireguard-ui-v0.6.1-linux-arm64.tar.gz
sudo tar xvf wireguard-ui-v0.6.1-linux-arm64.tar.gz wireguard-ui

ダウンロードに関しては以下のURLから各自環境にあったものをダウンロードしてください。
https://github.com/ngoduykhanh/wireguard-ui/releases

Wireguardの設定

  1. wireguard-uiを自動起動するsystemdを書く
    ディレクトリを変更した人は注意して設定してください。
    また、wireguard-uiにはいくつかオプションがあるので各自必要なものをExecStartにつけましょう。オプションをつけなくても問題なく動きます。
/etc/systemd/system/wgui-worker.service
[Unit]
Description=wireguard web ui
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/wireguard
ExecStart=/opt/wireguard/wireguard-ui
Restart=always

[Install]
WantedBy=multi-user.target
  1. serviceの自動起動有効化と起動を行う
sudo systemctl enable wgui-worker
sudo systemctl start wgui-worker

すると/etc/wireguardにwg0.confというコンフィグが自動で作成されます。

  1. WireGuardサーバを起動する
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
  1. wireguard-uiから設定が変更されたときWireGuardが再起動するようにsystemdを書く
  • wgui.service
/etc/systemd/system/wgui.service
[Unit]
Description=Restart WireGuard
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart wg-quick@wg0.service

[Install]
RequiredBy=wgui.path
  • wgui.path
/etc/systemd/system/wgui.path
[Unit]
Description=Watch /etc/wireguard/wg0.conf for changes

[Path]
PathModified=/etc/wireguard/wg0.conf

[Install]
WantedBy=multi-user.target
  1. serviceの自動起動有効化と起動を行う
sudo systemctl enable wgui.{path,service}
sudo systemctl start wgui.{path,service}
  1. http://<サーバーのIP>:5000にアクセスする
    ログイン画面が出てくるのでuser/pass=admin/adminでログインしましょう

  2. 左側メニューから"Users Settings"を選択後、editでuser/passを変更する

  3. 左側メニューから"Global Settings"を選択後、必要な設定を変更してsaveを押す
    自分の場合Endpoint Addressはデフォルトで自分のグローバルIPが書かれていました。
    設定の内容をもとにクライアントのコンフィグが生成されます(Endpoint Addressやdnsは必要に応じて変更してください。)

  4. 左側メニューから"Wireguard Server"を選択後、"Server Interface Addresses"にWireGuardでの通信で使用するネットワークアドレスを記述してsaveを押す
    デフォルトで問題なければそのままでok

クライアントで接続

ここではUbuntuでWireguardに接続します。
OSによって若干違ったりしますが、調べたら出てくると思います。
調べても出てこなそうならGoogleアカウントがあればだれでも使えるGeminiに聞いてみるといいかもしれません。

  1. 左側メニューから"Wireguard Clients"を選択後、右上New Clientを押していい感じに設定してsubmitを押す

  2. 右上Apply Configを押してServerにクライアントの情報を保存する

  3. クライアントにwireguardをインストールする

sudo apt install wireguard
  1. wireguard-uiの"Wireguard Clients"のDownloadでクライアントのコンフィグを取得する
  2. ダウンロードしたコンフィグをクライアントの/etc/wireguard/wg0.confに保存する
  3. VPNに接続する
sudo ln -s /usr/bin/resolvectl /usr/local/bin/resolvconf
sudo wg-quick up wg0

LAN内へのルーティング

インターネットから家庭内へのVPNの確立は成功します。しかし、この設定だけではWireGuardのネットワーク内(今回の例では10.252.1.0/24)でしか通信できないので、WireGuardのネットワークから内部ネットワーク(ここではLAN eth0 192.168.0.0/24とします)へのルーティングを行います。

Ubuntuはデフォルトでパケットのフォワードが禁止されています。パケットのフォワードを有効にするには以下を行います。

  1. サーバー側で/etc/sysctl.confの以下の行の#を消してコメントを解除する
/etc/sysctl.conf
net.ipv4.ip_forward=1
  1. 変更を反映
sudo sysctl -p
  1. http://<サーバーのIP>:5000にアクセスして"Wireguard Server Settings"を開く
    Post Up Scriptにiptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    Post Down Scriptにiptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
    を記述する

  2. "Wireguard Clients"でコンフィグのMoreからeditでAllowed IPsに192.168.0.0/24を追記してsaveを押す

  3. 必ず右上Apply Configを押す

  4. 再度コンフィグをダウンロードしてClientのコンフィグファイルを上書き(自分で書き換えてもいい)

  5. サーバを再起動する (2023/10/11修正)
    再起動しないとうまく動かないっぽいです。

まとめ

以上WireGuardとwireguard-uiの構築終了です。
最後の方かなり雑になってしまったので、 わからない、できない、間違っている等ありましたらコメントいただけると幸いです。

A - 付録(wireguard-uiを使わない場合)

A - WireGuardの設定

  1. 秘密鍵(server.key)と公開鍵(server.pub)を作成する
wg genkey | sudo tee /etc/wireguard/server.key
sudo cat /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub
sudo chmod 600 /etc/wireguard/server.key /etc/wireguard/server.pub
  1. クライアント側でもWireGuardのインストールと鍵を作成する
sudo apt install wireguard
wg genkey | sudo tee /etc/wireguard/client.key
sudo cat /etc/wireguard/client.key | wg pubkey | sudo tee /etc/wireguard/client.pub
sudo chmod 600 /etc/wireguard/client.key /etc/wireguard/client.pub
  1. サーバー側でコンフィグを作成。 (2024/3/14修正)
/etc/wireguard/wg0.conf
[Interface]
PrivateKey = 作成したサーバーの秘密鍵
Address = 10.252.1.0/24
ListenPort = 51820

[Peer]
PublicKey = 作成したクライアントの公開鍵
AllowedIPs = 10.252.1.1/32

秘密鍵や公開鍵はパスではなく、鍵の中身です。
Address: wgの通信で使用されるネットワークアドレス
ListenPort: 使用するUDPのポート
AllowedIPs: クライアントに割り当てるIPアドレス

  1. サーバーでWireGuardの起動
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

これでip aをしたときにwg0が割り当てられていればok

  1. クライアント側でコンフィグを作成 (2024/3/14修正&修正)
/etc/wireguard/wg0.conf
[Interface]
PrivateKey = クライアントの秘密鍵
Address = 10.252.1.1/32

[Peer]
PublicKey = サーバーの公開鍵
EndPoint = サーバーのIPアドレス:51820
AllowedIPs = 10.252.1.0/24

Address: クライアントのインターフェイスに割り当てるIPアドレス
AllowedIPs: WireGuardを経由して通信する先のIPアドレス

  1. クライアントからVPNへの接続
sudo ln -s /usr/bin/resolvectl /usr/local/bin/resolvconf
sudo wg-quick up wg0

同様にip aをしたときwg0が割り当てられていればok

A - LAN内へのルーティング

インターネットから家庭内へのVPNの確立は成功します。しかし、この設定だけではWireGuardのネットワーク内(今回の例では10.252.1.0/24)でしか通信できないので、WireGuardのネットワークから内部ネットワーク(ここではLAN eth0 192.168.0.0/24とします)へのルーティングを行います。

Ubuntuはデフォルトでパケットのフォワードが禁止されています。パケットのフォワードを有効にするには以下を行います。

  1. サーバー側でsysctl.confの以下の行の#を消してコメントを解除
/etc/sysctl.conf
net.ipv4.ip_forward=1
  1. 変更を反映
sudo sysctl -p
  1. サーバー側のwg0.confの[Intarface]にIPマスカレードを行うiptablesのルールを追記。
    eth0は各自環境によって置き換えてください。
/etc/wireguard/wg0.conf
[Interface]
省略
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]
省略
  1. WireGuardを再起動
sudo systemctl restart wg-quick@wg0
  1. クライアント側のwg0.confのAllowedIPsに追記 (2024/3/14修正)
[Interface]
省略
[Peer]
省略
AllowedIPs = 10.252.1.0/24, 192.168.0.0/24
  1. クライアント側でVPN再接続
sudo wg-quick down wg0
sudo wg-quick up wg0

Discussion

t at a

記事ありがとうございます。以下typoかと思います。
PublickKey -> PublicKey

クライアント側の /etc/wireguard/wg0.conf の先頭の [Interface] が必要と思います。

k175k175

コメントありがとうございます。
修正させていただきました。

PublickKeyは完全にtypoですね(笑)
クライアント側の/etc/wireguard/wg0.confの先頭の[Interface]も抜けてました。
ありがとうございます。

h.yh.y

大変参考になりました。ありがとうございました。
wireguard-uiのv0.6.2を使用する手順の場合、最初に/etc/wireguard/wg0.confを作成するとwireguard-uiにログインする際に下記の問題が起きました。
こちらは作成せずに、wireguard-uiで生成されるものを使用したほうがよさそうです。
https://github.com/ngoduykhanh/wireguard-ui/issues/523