これを書いた経緯
以前、Raspberry Pi Zero 2 W に WireGuard サーバを立てた記事を書いた。外出先のスマホから自宅の動画アプリ(192.168.68.68)だけ VPN 経由でアクセスできるようにしたやつ。
あれはあれで便利だったけど、「スマホ1台だけじゃなくて、複数端末をまとめて VPN 配下に置きたい」という欲が出てきた。実家に帰省した際の共有やキャンプ/旅行での家族利用など。
旅行先で持ち歩いてる GL.iNet の Beryl 7(GL-MT3600BE) を WireGuard クライアント兼ルーターとして使えば、これに Wi-Fi 繋いだ端末が全部まとめて自宅 LAN に入れるんじゃないか、と思って試した。
結果:ちゃんと動いた。ただ Beryl 7 側の罠にちょっとハマった。
構成イメージ
既存の構成(スマホ → Pi → 自宅 LAN)はそのまま残して、緑の枠で囲った部分(Beryl 7 とその配下、新しいトンネル)だけを追加した。
ポイントは既存のスマホ用 Peer を一切触らず、Beryl 7 用 Peer を追加するだけで済むこと。
環境
| 項目 | 内容 |
|---|---|
| WireGuard サーバ | Raspberry Pi Zero 2 W |
| OS | Raspberry Pi OS Lite 64bit |
| WireGuard IF | wg0(10.0.0.1/24) |
| 自宅 LAN | 192.168.68.0/22 |
| Pi の LAN 側 IF | wlan0(有線化は別記事で実施) |
| クライアント兼ルーター | GL.iNet Beryl 7(GL-MT3600BE) |
| Beryl 7 の LAN 帯域 | 192.168.8.0/24 |
AllowedIPs ってサーバ側とクライアント側で意味が違う話
これ最初めちゃくちゃ混乱したので先に整理しておく。
| どこに書く? | 何を意味する? |
|---|---|
Pi 側(wg0.conf の [Peer]) |
このクライアントから届くパケットの「送信元として認める IP の範囲」。Beryl 7 の VPN IP と、Beryl 7 配下の LAN 帯域を書く |
Beryl 7 側([Peer]) |
この VPN 経由でルーティングする「宛先の範囲」。自宅 LAN だけなら 192.168.68.0/22、全通信なら 0.0.0.0/0
|
つまり「サーバ側の AllowedIPs = 受け入れる送信元」「クライアント側の AllowedIPs = VPN に流す宛先」、という別物。
Pi 側の作業
バックアップ(絶対やっておく)
sudo cp /etc/wireguard/wg0.conf /etc/wireguard/wg0.conf.bak
Beryl 7 用の鍵ペアを生成
wg genkey | tee /tmp/beryl_private.key | wg pubkey > /tmp/beryl_public.key
cat /tmp/beryl_private.key # Beryl 7 に入れる秘密鍵
cat /tmp/beryl_public.key # Pi の wg0.conf に書く公開鍵
/tmp/beryl_private.key は Beryl 7 に設定し終わったら sudo rm /tmp/beryl_*.key で消すこと。
wg0.conf に Beryl 7 用 Peer を追記
sudo nano /etc/wireguard/wg0.conf
既存の内容はそのまま、末尾に追加するだけ。
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <PI_PRIVATE_KEY>
# 既存のスマホ用 Peer(触らない)
[Peer]
PublicKey = <SMARTPHONE_PUBLIC_KEY>
AllowedIPs = 10.0.0.2/32
# Beryl 7 用 Peer(追加)
[Peer]
PublicKey = <BERYL_PUBLIC_KEY>
AllowedIPs = 10.0.0.3/32, 192.168.8.0/24
192.168.8.0/24 は Beryl 7 配下の LAN 帯域。Beryl 7 の管理画面(192.168.8.1 → Network → LAN)で確認する。
ホットリロード(サービス再起動不要)
sudo wg set wg0 peer <BERYL_PUBLIC_KEY> allowed-ips 10.0.0.3/32,192.168.8.0/24
sudo wg show wg0
Beryl 7 の Peer が表示されれば Pi 側は完了。
Beryl 7 側の作業
管理画面(192.168.8.1)→ VPN → WireGuard クライアント → 手動追加、でテキストモードに切り替えて以下を入力する。
split tunnel 版(自宅 LAN 宛だけ VPN 経由)
[Interface]
Address = 10.0.0.3/24
PrivateKey = <BERYL_PRIVATE_KEY>
DNS = 192.168.68.1
[Peer]
PublicKey = <PI_PUBLIC_KEY>
Endpoint = <DDNSまたはグローバルIP>:51820
AllowedIPs = 192.168.68.0/22
PersistentKeepalive = 25
前回とは違いAllowedIPsはLAN内のCIDRを指定するのがミソ
full tunnel 版(全通信を自宅経由にしたい場合)
Beryl 7 側の AllowedIPs を変えるだけ。
AllowedIPs = 0.0.0.0/0
ただし Pi 側に追加設定が2つ必要。
1. IP フォワーディングを有効化
Raspberry Pi OS Lite はデフォルトで IP フォワーディングが無効になっている。有効化しないと Pi が受け取ったパケットを転送してくれない。
# 永続化
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/90-ip-forward.conf
# 即時適用
sudo sysctl -w net.ipv4.ip_forward=1
2. MASQUERADE ルールを追加
WireGuard 経由で届いたパケットをインターネットに出すために NAT が必要。wg0.conf の PostUp / PostDown に追記しておくと WireGuard 起動時に自動設定される。
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; \
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; \
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; \
iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; \
iptables -t nat -D POSTROUTING -o wlan0 -j MASQUERADE
Pi が Wi-Fi(wlan0)と有線 LAN(eth0)の両方を持つ場合は両方書いておく。どちらがアクティブでも対応できる。
この2つを設定すれば「全通信を自宅経由」の full tunnel が動く。
ハマったところ:Beryl 7 はポリシーモードの設定も必要
ここが一番の罠だった。
WireGuard の設定で AllowedIPs = 192.168.68.0/22 と書いても、Beryl 7 の VPN ダッシュボードがグローバルモードになってると、全通信が VPN 経由になる。
GL.iNet のルーターは WireGuard 設定の上に独自のポリシーエンジンを持っていて、両方を設定しないといけない二段構えになってる。
グローバルモードのまま VPN をオンにしたら、自宅 LAN には繋がるのにインターネット検索ができなくなった。全通信が Pi に流れたものの、Pi 側がインターネット向けに通せていなかったのが原因だと思う(うちは HGW 配下にルーターを挟んだ二重 NAT 構成なので、その辺も絡んでるかも。ちゃんと切り分けはしてない)。
解決方法
VPN ダッシュボード右上の「グローバルモード」→「ポリシーモード」に変更して、ルールをこう設定する。
発信元: 全てのクライアント
宛先: 192.168.68.0/22
経由: HomeVPN(WireGuard)
「その他すべてのトラフィック」→「非 VPN トラフィックを許可」を ON にするのも忘れずに。
これで「自宅 LAN 宛は VPN 経由、それ以外は直接インターネット」という split tunnel が完成する。
ついでに直した:Pi が Wi-Fi から勝手に切れる問題
今回の作業中に「あれ Pi 死んでる?」となる場面があった。電源は入ってるのにネットワークから消えてる状態。
原因は Wi-Fi の省電力モードだった。
iwconfig wlan0 | grep "Power Management"
# → Power Management:on
/etc/NetworkManager/conf.d/wifi-powersave-off.conf を作って永続的に無効化する。
[connection]
wifi.powersave = 2
sudo systemctl restart NetworkManager
これで放置してもネットワークから外れなくなった。VPN サーバを Pi で動かしてる人は要確認。
ロールバック手順
うまくいかなかったときの戻し方。
# wg0.conf を元に戻す
sudo cp /etc/wireguard/wg0.conf.bak /etc/wireguard/wg0.conf
# WireGuard を再起動
sudo systemctl restart wg-quick@wg0
まとめ
- Pi 側は Peer を1つ追加するだけで既存構成を壊さずに済んだ
- Beryl 7 側は WireGuard 設定 + ポリシーモードの2段階設定が必要(ここが罠)
- split tunnel で「自宅 LAN 宛だけ VPN 経由」が実現できた
- full tunnel にしたいときは Beryl 7 側の
AllowedIPsを0.0.0.0/0にする+Pi 側で ip_forward と MASQUERADE の設定が必要(詳細は full tunnel 節を参照)
旅行先や外出先で Beryl 7 に繋いでる端末がまとめて自宅 LAN に入れるようになって、かなり便利になった。同じような構成を考えてる人の参考になれば。
さいごにひとこと
コンパクトな中に沢山の機能が詰まったとてもロマンを感じる製品だった
非常に深い沼です。