🚸

【WireGuard】拠点間でVPN接続をしてみた

2024/07/08に公開

はじめに

みなさんは、自身でVPNサーバをお持ちでしょうか。私の環境では、自宅で鯖が動いていますが、その鯖達はNATされていたり、物理的な問題もあって、さくらのVPS上にWireGuardを用いてVPN環境を構築しています。しかし、このような環境であると、自宅のネットワークにはルーティングできず、自宅内のホスト全てにWireGuardをインストールするという手間が発生してしまいます。従って、WireGuard鯖と自宅内にある代表の鯖一台同士を拠点間で接続することにしました。

構成図

構築

VPNサーバ(WireGuard)の構築

今回はWireGuardを管理しやすくするために、wireguard-uiを用いました。

  1. サーバ(192.168.0.253/24)側にインストール
sudo apt update && sudo apt upgrade -y && sudo apt install -y wireguard openresolv
  1. サーバ側(192.168.0.253/24)のコンフィグ作成
    AddressにはVPNサーバ自体のIPアドレスをお好きなもので割り当ててください。
sudo vim /etc/wireguard/wg0.conf
/etc/wireguard/wg0.conf
[Interface]
Address = 192.168.0.253/24
ListenPort = 51820
  1. サーバ側(192.168.0.253/24)で自動起動に設定しつつ起動開始
sudo systemctl enable wg-quick@wg0 --now
  1. クライアント側(192.168.150.253/24)にもインストール
sudo apt update && sudo apt upgrade -y && sudo apt install -y wireguard openresolv
  1. ルーティングをできるようにする
cat <<EOF | sudo tee -a /etc/sysctl.conf
net.ipv4.ipv4_forward=1
EOF
sudo sysctl -p

wireguard-uiの設定

  1. wireguard-ui用のディレクトリ作成
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
  1. 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
  • wgui-worker.service
/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. 3で作成したsystemdの起動
sudo systemctl enable wgui.{path,service,-worker} --now
  1. http://<129.x.y.z>:5000にアクセス
  • Username: admin
  • Password: admin
  1. Global Settingsを編集
    Endpoint AddressをVPNサーバ(今回だと129.x.y.zに値する)のIPアドレスを設定。また、Wireguard Config File Pathではサーバ側のコンフィグファイルを保存した場所が指定されているかを確認してください。
  1. Wireguard Server Settingsを編集
Post Up Script
 iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
Post Down Script
iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o ens3-j MASQUERADE

Wireguard Server SettingsではClientサイドがwg0インターフェイスをリンクアップする際に、iptablesでパケットをルーティングしないといけないため、上記の設定を投入するようにしてください。

  1. Wireguard ClientsよりNewClientでWireguard用のコンフィグを作成する。
  • Name:好きなもの
  • Email:不要
  • IPAllocation: いじらない(WireguardのClientごとに被らないようにする)
  • AllowedIPs: 0.0.0.0/0(ルーティングが必要なためおそらくデフォルトゲートウェイとする必要がありそう)
  • ExtraAllowedIPs: 192.168.150.0/24(自宅内のネットワークをすべてここに追加)

自宅内の代表鯖にて...

  1. 上記の8番で作成したコンフィグをダウンロードして保存する
vim /etc/wireguard/wg0.conf
  1. サーバ側(192.168.150.252/24)で自動起動に設定しつつ起動開始
sudo systemctl enable wg-quick@wg0 --now

終わりに

これにて、自宅のNATされた環境内にVPNでアクセスできるようになりました。VPN鯖に直接GIPを触れないような環境の方とかに役立てればと思います。一方で、構築時の不明点や文章の誤字脱字等あればコメントいただけると幸いです。よろしくお願いいたします。

Discussion