🐉

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

2023/10/07に公開
3

はじめに

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

変更

2023/10/11修正 再起動を追記
2024/3/14修正1 typoを修正 PublickKey -> PublicKey
2024/3/14修正2 クライアント側の/etc/wireguard/wg0.confの先頭に[Interface]を追記

環境

Hardware: Raspberry Pi 3 Model B+
OS: Ubuntu Server 22.04.3 LTS(64-bit)

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-uiを使ったWireGuardの設定はこちら

wireguard-uiを使わない場合

  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修正1)
/etc/wireguard/wg0.conf
[Interface]
PrivateKey = 作成したサーバーの秘密鍵
Address = 10.0.0.1/24
ListenPort = 51820

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

秘密鍵や公開鍵はパスではなく、鍵の中身です。
Address: サーバーのインターフェイスに割り当てるIPアドレス
ListenPort: UDPです
AllowedIPs: クライアントに割り当てるIPアドレス

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

これでip aをしたときにwg010.0.0.1が降られている。

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

[Peer]
PublicKey = サーバーの公開鍵
EndPoint = サーバーのIPアドレス:51820
AllowedIPs = 10.0.0.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をしたときwg010.0.0.2が降られている。

LAN内へのルーティングを行うには

インターネットから家庭内へのVPNの確立は成功します。しかし、この設定だけではWireGuardのネットワーク内(今回の例では10.0.0.0/24)でしか通信できないので、WireGuardのネットワークから家庭内LAN eth0(今回は192.168.1.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]
省略
PortUp = 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修正2)
[Interface]
省略
[Peer]
省略
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24
  1. クライアント側でVPN再接続
sudo wg-quick down wg0
sudo wg-quick up wg0

WireGuardの設定

ではここから、wireguard-uiを使う場合のWireGuardの設定を記載します。

  1. サーバー側でコンフィグを作成。
    先ほどとは違いPrivateKeyと[Peer]は必要ありません
/etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
  1. サーバーでWireGuardの起動
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
  1. クライアント側でwireguardをインストール
sudo apt isntall wireguard

なんとWireGaurd自体の設定はこれで終わり

wireguard-uiのダウンロードと設定

wireguard-uiのダウンロード

ここからは任意のディレクトリで行ってください。今回は/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.5.2/wireguard-ui-v0.5.2-linux-arm64.tar.gz
sudo tar xvf wireguard-ui-v0.5.2-linux-arm64.tar.gz wireguard-ui

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

wireguard-uiの設定

  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. 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
  1. http://<サーバーのIP>/:5000にアクセスする
    ログイン画面が出てくるのでuser/pass=admin/adminでログインしましょう

  2. 左上のハンバーガーメニューから"Users Settings"を選択後、editでuser/passを変更

  3. 左上のハンバーガーメニューから"Global Settings"を選択後、必要な設定を変更してsave
    自分の場合Endpoint Addressはデフォルトで自分のグローバルIPが書かれていました。

8.左上のハンバーガーメニューから"Wireguard Server Settings"を選択後、"Server Interface Addresses"にWireGuardサーバーのIPアドレスとCIDRでサブネットを記述してsave

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

  2. 右上Apply Configを押してServerにClient情報を保存
  3. DownloadでClient側のコンフィグを取得
  4. ダウンロードしたコンフィグをClientの/etc/wireguard/wg0.confに保存
  5. VPNに接続
sudo ln -s /usr/bin/resolvectl /usr/local/bin/resolvconf
sudo wg-quick up wg0

LAN内へのルーティングを行う

WireGuardの設定の前にを読んでいない人向けに再掲

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

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

  1. サーバー側でsysctl.confの以下の行の#を消してコメントを解除
/etc/sysctl.conf
net.ipv4.ip_forward=1
  1. 変更を反映
sudo sysctl -p
  1. http://<サーバーのIP>/:5000にアクセスして"Wireguard Server Settings"を開く
    PortUpに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

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

  3. 必ず右上Apply Config

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

まとめ

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

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