ラズパイでWireGuard(+wireguard-ui)の構築
はじめに
放置されているラズパイ(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よりも高いパフォーマンスを謳っています。
wireguard-uiとは
wireguard-uiとはWireGuardの設定を管理するためのWebユーザーインターフェースです。
WireGuardのインストールと設定
WireGuardのインストール
- 恒例行事
sudo apt update && sudo apt upgrade
- WireGuardのインストールする
sudo apt install wireguard
他のOSの場合には以下を参照していただくとダウンロードできます。
WireGuardの設定の前に
wireguard-uiを使わない場合のWireguardの設定も付属で載せています。
wireguard-uiを使わない場合のWireGuardの設定はこちら
wireguard-uiのインストール
ではここから、wireguard-uiを使ったWireGuardの設定を記載します。
任意のディレクトリで行ってください。今回は/opt/wireguard
で行います。
- ディレクトリの作成と移動を行う
sudo mkdir /opt/wireguard
cd /opt/wireguard
- 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から各自環境にあったものをダウンロードしてください。
Wireguardの設定
- wireguard-uiを自動起動するsystemdを書く
ディレクトリを変更した人は注意して設定してください。
また、wireguard-uiにはいくつかオプションがあるので各自必要なものをExecStartにつけましょう。オプションをつけなくても問題なく動きます。
[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
- serviceの自動起動有効化と起動を行う
sudo systemctl enable wgui-worker
sudo systemctl start wgui-worker
すると/etc/wireguardにwg0.confというコンフィグが自動で作成されます。
- WireGuardサーバを起動する
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
- wireguard-uiから設定が変更されたときWireGuardが再起動するようにsystemdを書く
- 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
[Unit]
Description=Watch /etc/wireguard/wg0.conf for changes
[Path]
PathModified=/etc/wireguard/wg0.conf
[Install]
WantedBy=multi-user.target
- serviceの自動起動有効化と起動を行う
sudo systemctl enable wgui.{path,service}
sudo systemctl start wgui.{path,service}
-
http://<サーバーのIP>:5000にアクセスする
ログイン画面が出てくるのでuser/pass=admin/adminでログインしましょう
-
左側メニューから"Users Settings"を選択後、editでuser/passを変更する
-
左側メニューから"Global Settings"を選択後、必要な設定を変更してsaveを押す
自分の場合Endpoint Addressはデフォルトで自分のグローバルIPが書かれていました。
設定の内容をもとにクライアントのコンフィグが生成されます(Endpoint Addressやdnsは必要に応じて変更してください。)
-
左側メニューから"Wireguard Server"を選択後、"Server Interface Addresses"にWireGuardでの通信で使用するネットワークアドレスを記述してsaveを押す
デフォルトで問題なければそのままでok
クライアントで接続
ここではUbuntuでWireguardに接続します。
OSによって若干違ったりしますが、調べたら出てくると思います。
調べても出てこなそうならGoogleアカウントがあればだれでも使えるGeminiに聞いてみるといいかもしれません。
-
左側メニューから"Wireguard Clients"を選択後、右上New Clientを押していい感じに設定してsubmitを押す
-
右上Apply Configを押してServerにクライアントの情報を保存する
-
クライアントにwireguardをインストールする
sudo apt install wireguard
- wireguard-uiの"Wireguard Clients"のDownloadでクライアントのコンフィグを取得する
- ダウンロードしたコンフィグをクライアントの/etc/wireguard/wg0.confに保存する
- 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はデフォルトでパケットのフォワードが禁止されています。パケットのフォワードを有効にするには以下を行います。
- サーバー側で/etc/sysctl.confの以下の行の#を消してコメントを解除する
net.ipv4.ip_forward=1
- 変更を反映
sudo sysctl -p
-
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
を記述する
-
"Wireguard Clients"でコンフィグのMoreからeditでAllowed IPsに192.168.0.0/24を追記してsaveを押す
-
必ず右上Apply Configを押す
-
再度コンフィグをダウンロードしてClientのコンフィグファイルを上書き(自分で書き換えてもいい)
-
サーバを再起動する (2023/10/11修正)
再起動しないとうまく動かないっぽいです。
まとめ
以上WireGuardとwireguard-uiの構築終了です。
最後の方かなり雑になってしまったので、 わからない、できない、間違っている等ありましたらコメントいただけると幸いです。
A - 付録(wireguard-uiを使わない場合)
A - WireGuardの設定
- 秘密鍵(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
- クライアント側でも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
- サーバー側でコンフィグを作成。 (2024/3/14修正)
[Interface]
PrivateKey = 作成したサーバーの秘密鍵
Address = 10.252.1.0/24
ListenPort = 51820
[Peer]
PublicKey = 作成したクライアントの公開鍵
AllowedIPs = 10.252.1.1/32
秘密鍵や公開鍵はパスではなく、鍵の中身です。
Address: wgの通信で使用されるネットワークアドレス
ListenPort: 使用するUDPのポート
AllowedIPs: クライアントに割り当てるIPアドレス
- サーバーでWireGuardの起動
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
これでip a
をしたときにwg0
が割り当てられていればok
- クライアント側でコンフィグを作成 (2024/3/14修正&修正)
[Interface]
PrivateKey = クライアントの秘密鍵
Address = 10.252.1.1/32
[Peer]
PublicKey = サーバーの公開鍵
EndPoint = サーバーのIPアドレス:51820
AllowedIPs = 10.252.1.0/24
Address: クライアントのインターフェイスに割り当てるIPアドレス
AllowedIPs: WireGuardを経由して通信する先のIPアドレス
- クライアントから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はデフォルトでパケットのフォワードが禁止されています。パケットのフォワードを有効にするには以下を行います。
- サーバー側でsysctl.confの以下の行の#を消してコメントを解除
net.ipv4.ip_forward=1
- 変更を反映
sudo sysctl -p
- サーバー側のwg0.confの[Intarface]にIPマスカレードを行うiptablesのルールを追記。
eth0は各自環境によって置き換えてください。
[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]
省略
- WireGuardを再起動
sudo systemctl restart wg-quick@wg0
- クライアント側のwg0.confのAllowedIPsに追記 (2024/3/14修正)
[Interface]
省略
[Peer]
省略
AllowedIPs = 10.252.1.0/24, 192.168.0.0/24
- クライアント側でVPN再接続
sudo wg-quick down wg0
sudo wg-quick up wg0
Discussion
記事ありがとうございます。以下typoかと思います。
PublickKey
->PublicKey
クライアント側の
/etc/wireguard/wg0.conf
の先頭の[Interface]
が必要と思います。コメントありがとうございます。
修正させていただきました。
PublickKey
は完全にtypoですね(笑)クライアント側の
/etc/wireguard/wg0.conf
の先頭の[Interface]
も抜けてました。ありがとうございます。
大変参考になりました。ありがとうございました。
wireguard-uiのv0.6.2を使用する手順の場合、最初に
/etc/wireguard/wg0.conf
を作成するとwireguard-uiにログインする際に下記の問題が起きました。こちらは作成せずに、wireguard-uiで生成されるものを使用したほうがよさそうです。