【ITニュース解説】Setting Up a WireGuard VPN Client on Linux
2025年09月28日に「Dev.to」が公開したITニュース「Setting Up a WireGuard VPN Client on Linux」について初心者にもわかりやすく解説しています。
ITニュース概要
WireGuard VPNクライアントをLinuxに設定し、プライバシーとセキュリティを向上させる方法を解説。自宅ネットワーク内外でVPN設定を自動的に切り替え、安全な通信を維持する手順を詳述する。キー生成から設定ファイル作成、自動化スクリプトまでを網羅し、初心者でもVPNクライアントを構築できるよう導く。
ITニュース解説
WireGuard VPNクライアントをLinuxシステムに導入し、自宅ネットワーク内外で設定を自動的に切り替える方法について解説する。この設定は、プライバシーとセキュリティを確保しながら、VPN利用の手間を省くことを目的としている。VPNは、インターネット上で安全な通信経路を確立する技術であり、特にWireGuardは高速でセキュリティレベルの高いオープンソースのVPNプロトコルとして知られている。
VPNの主な利点は多岐にわたる。まず、プライバシーとセキュリティの面では、すべての通信が自宅のIPアドレスから発信されているように見えるため、利用者の実際の場所を隠すことができる。これにより、ウェブサイトやサービスによる追跡から身を守ることが可能となる。また、公共のWi-Fiネットワークなどセキュリティが低い場所でも、VPNトンネルを介して通信することで、データの傍受(パケットスニッフィング)や悪意のある第三者からの攻撃を防ぐことができる。WireGuardはオープンソースであり、そのコードは定期的に監査されているため、透明性と信頼性が高い。
機能面では、自宅に広告ブロックシステムであるPi-Holeを導入している場合、外出先からもその恩恵を受けることができる。VPNを通じて自宅ネットワークに安全にアクセスできるため、カメラやNAS(ネットワーク接続ストレージ)、IoTデバイスといった家庭内の機器を外部に公開することなく利用できる。さらに、WireGuardはその設計により、他の多くのVPNサービスと比較して非常に高速な通信が可能である。実用性についても優れており、ほとんどの現代的なハードウェアで動作し、最新かつ実績のある暗号技術を採用している。また、オープンソースであるため無料で利用でき、将来的な購読料の心配がないのも大きなメリットだ。
この解説は、すでにWireGuard VPNサーバーが設定されており、自宅ルーターでのポートフォワーディングも完了していることを前提としている。サーバー設定が未完了の場合は、まず公式ドキュメントを参照してサーバーを構築する必要がある。WindowsやmacOSには専用のクライアントアプリケーションがあるが、Linuxでの設定はより複雑なため、本ガイドが役立つだろう。クライアントとしてLinuxシステム(特にLinux MintやDebian系)を使用し、sudoコマンドを使用できる権限と基本的なコマンドラインの知識が必要となる。
クライアントシステムの設定は、まずSSH(Secure Shell)キーの生成から始める。これは、クライアントがサーバーに安全にアクセスするための鍵ペアで、ssh-keygen -t ed25519 -C "your-email@example.com"コマンドで生成する。生成された公開鍵をサーバーの~/.ssh/authorized_keysファイルにコピーすることで、パスワードなしで安全にSSH接続できるようになる。この手順は、SSHクライアントがサーバーに直接アクセスできる「簡単な方法」と、他のシステムを経由して公開鍵を手動でコピーする「より確実な方法」がある。
次に、WireGuardのインストールと設定を行う。必要な依存関係をインストールするために、sudo apt updateとsudo apt install wireguard resolvconfコマンドを実行する。その後、WireGuard用の鍵ペアを生成する。これはSSHキーとは異なるもので、cd /etc/wireguardディレクトリでsudo umask 077に設定し、sudo wg genkey | sudo tee privatekey | sudo wg pubkey | sudo tee publickeyコマンドを使って秘密鍵と公開鍵を作成する。これらの鍵はWireGuardサーバーとの安全な通信に使用される。
WireGuardの鍵が生成されたら、クライアント側の設定ファイルである/etc/wireguard/wg0.confを作成する。このファイルには、クライアントの秘密鍵、VPNネットワーク内でのIPアドレス(例: 10.0.0.2/24)、DNSサーバーのアドレス(例: 1.1.1.1)を[Interface]セクションに記述する。[Peer]セクションには、WireGuardサーバーの公開鍵、サーバーのエンドポイント(IPアドレスとポート番号)、そしてどのIPアドレス範囲のトラフィックをVPNトンネル経由でルーティングするかを示すAllowedIPs(例: 0.0.0.0/0で全てのトラフィックをVPN経由にする)を設定する。ここで、サーバーの公開鍵はサーバーから取得する必要がある。クライアントの公開鍵は、サーバー側のWireGuard設定ファイルに追記する必要がある。サーバー側では、クライアントの公開鍵と、サーバーネットワーク内でクライアントに割り当てるIPアドレス(例: 10.0.0.x/32)を[Peer]として追加する。これらの鍵とIPアドレスが正しく設定されていることを確認し、クライアントとサーバーの両方の設定ファイルを最終的に完成させる。
この設定だけでは、クライアントが自宅ネットワークにいる場合にWireGuard VPN接続が失敗してしまう。そこで、自宅と外出先で設定を自動的に切り替える「デュアルWireGuard設定」が必要となる。wg0.confファイルをwg0-away.confとwg0-home.confとして複製し、それぞれ外出先用と自宅用の設定を記述する。wg0-home.confでは、EndpointにサーバーのローカルIPアドレスを設定し、AllowedIPsには自宅ネットワークのIPアドレス範囲(例: 192.168.1.0/24)を指定する。これにより、自宅ネットワーク内でのみVPNを利用し、ローカルアクセスを可能にする。一方、wg0-away.confでは、Endpointにサーバーの外部IPアドレス(自宅ルーターのグローバルIPアドレス)を設定し、AllowedIPsは0.0.0.0/0として、すべてのトラフィックをVPN経由でルーティングするようにする。これらの設定ファイルは、ネットワークの状態に応じてwg0.confに動的にコピーされる。
この自動切り替えを実現するための「検出スクリプト」を/etc/NetworkManager/dispatcher.d/99-wireguard-autoとして作成する。このシェルスクリプトは、ネットワークインターフェースの状態が「up」(接続)または「down」(切断)になったときにNetworkManagerによって実行される。スクリプトは、自宅ネットワークのゲートウェイとWireGuardサーバーのIPアドレスをpingで確認し、クライアントのローカルIPアドレスが自宅ネットワークの範囲内にあるかどうかの三段階のチェックによって、現在のネットワークが自宅ネットワークか外部ネットワークかを判別する。ネットワークが検出されると、現在のWireGuardの状態を確認し、適切な設定ファイル(wg0-home.confまたはwg0-away.conf)を/etc/wireguard/wg0.confにコピーし、WireGuardサービスを再起動する。これにより、手動での切り替えなしに、利用環境に応じたVPN設定が自動的に適用される。スクリプトはsudo chmod +xコマンドで実行可能にする必要がある。
さらに、VPN接続時にDNS解決が正しく行われるよう、DNS設定を調整するためのスクリプトも作成する。/etc/NetworkManager/dispatcher.d/99-wireguard-dns.shとして作成されるこのスクリプトは、WireGuardインターフェースがupになった際に、Pi-Holeなどの特定のDNSサーバーをwg0インターフェースに設定し、他のネットワークインターフェースからのDNS解決を無効化する。これはresolvectl dnsやresolvectl default-routeコマンドを用いて行われ、VPN経由で指定されたDNSサーバーのみが使用されるように強制する。これにより、DNS漏洩を防ぎ、VPNのセキュリティとプライバシーを完全に保護できる。このスクリプトも同様に実行可能にする必要がある。
すべての設定が完了したら、サーバーとクライアントの両方でWireGuardサービスを再起動する。クライアントでは、sudo resolvectl default-route <WiFiインターフェース名> falseコマンドを実行して、初期のVPN優先順位の問題を修正し、sudo systemctl restart wg-quick@wg0でWireGuardを再起動する。これにより、システムが適切にVPN経由でDNSクエリを処理するようになる。
最後に、設定が正しく機能しているかを確認することが重要である。Pi-Holeを導入している場合、nslookup doubleclick.netなどのコマンドを実行し、広告ドメインが0.0.0.0に解決されることを確認する。これは、Pi-HoleがVPN経由で正しく機能していることを示す。もしDNSが機能しない場合は、Pi-Holeサーバーへのping確認、journalctl -u NetworkManager -fでのDNSスクリプト実行ログの確認、sudo systemctl restart systemd-resolvedでのDNSリゾルバーの再起動といったトラブルシューティングを行う。VPNは接続されるがインターネットにアクセスできない場合は、ip route showコマンドでルーティング設定を確認する。また、ネットワーク変更時にスクリプトがトリガーされない場合は、sudo systemctl status NetworkManagerでNetworkManagerの稼働状況を確認し、sudo tail -f /var/log/wireguard-auto.logでスクリプトのログを確認すると良い。これらの手順を踏むことで、セキュアで自動切り替え可能なWireGuard VPNクライアントをLinuxシステムに構築できるだろう。