これまで自宅内でのVPNの環境をどうしていたかというと、単にOpenVPNクライアントに対応したWi-Fiルーターを購入して、契約しているVPNサービスの情報を登録して接続したデバイスをVPNに経由させていただけでした。しかし最近は、通信速度の面でOpenVPNへの不満がたまりがちになり、高速といわれているWireGuardプロトコルを利用したVPNルーターを作ってみることにしました。
用意するもの
- OpenWrtに対応したルーター(またはGL.iNetなどの既成品を買う)
—
SSHでログインし、以下のコマンドでWireGuard関連をインストールする。
opkg update
opkg install ca-bundle curl luci-proto-wireguard
WireGuardの鍵を生成する。
wg genkey | tee privatekey | wg pubkey > publickey
privatekey と publickey という2つのファイルが生成される。 tail privatekey publickey などで内容を確認しておく。
公開鍵を登録するために、VPNサービスごとに定められた手順に従う。Mullvadの場合はcurlでAPIを呼び出す。
curl https://api.mullvad.net/wg/ -d account=ACCOUNTNUMBER --data-urlencode pubkey=PUBLICKEY
(ACCOUNTNUMBER は自分のアカウントの番号、PUBLICKEY は publickey ファイルの内容に置き換える)
内容を確認しておく。
WireGuardインターフェイスの作成
OpenWrtの管理画面 ( http://192.168.1.1/ ) からメニューの「Network」→「Interfaces」に行き「Add new interface…」で新しいインターフェイスを作成する。名前はここでは「WGINTERFACE」とし、プロトコルを「WireGuard VPN」に選択して作成。
- Private Key: 上で生成した privatekey の内容。
- IP Addresses: APIサーバーから返答されたIPアドレス。
「Add peer」をクリックしてピアを以下のように追加する。
- Description: jp1-wireguard.mullvad.net など
- Public Key: WireGuardサーバーの公開鍵
- Allowed IPs: 0.0.0.0/0
- Endpoint Host: WireGuardサーバーのIPアドレスまたはホスト名
- Endpoint Port: 51820 または指定されたポート
「Advanced Settings」タブの「Force link」をチェックし、保存する。
ファイアウォールの設定
メニューの「Network」→「Firewall」に行き、ゾーン一覧から「Add」で新しいゾーンを作成する。ゾーン名は「WGZONE」とする。「Masquerading」「MSS Clamping」にチェックして保存。
lanゾーンの「Edit」をクリックし「Allow forward to destination zones」の「wan」を外し「WGZONE: WGINTERFACE」に変更する。こうすることでVPNのキルスイッチとなり、VPNの接続が解除された際はインターネットに接続できなくなる。
「Save & Apply」で適用。
DNSの設定
VPNサービスによってDNSサーバーは異なるが、ここでは 10.64.0.1 とする。
「Network」→「DHCP and DNS」に行き、「DNS forwardings」のIPアドレスを上のIPに設定し、「Save」で一旦保存。
「Network」→「Interfaces」からlanインターフェイスの編集で「DHCP Server」→「Advanced Settings」→「DHCP-Options」を「6,(上のIP)」に設定し、「Save & Apply」で適用。
ルーターを再起動し、接続を確認。
—
速度について、OpenVPNでは5〜10Mbpsだったが、WireGuardにして20〜30Mbpsは平均して出るようになったので、おおむね満足しています。
その他
当然ながらサーバーは自動選択できないため、一定間隔でサーバーを変更したい場合は、WireGuardサーバーのIPアドレスと公開鍵のリストを持っておき、設定変更&再起動するといったスクリプトを動かすなどが考えられる。
OpenWrtのIPアドレスはデフォルトで 192.168.1.1 に設定されているので、他のルーターとの競合を避けるのであれば「192.168.33.1」などにする。自分の場合は管理画面から設定すると失敗するため、SSHから以下のように設定しました。
uci set network.lan.ipaddr='192.168.33.1'
uci commit
reboot; exit
IPアドレスを変更すると管理画面も変更したIPに変わるので注意。
資料
- WireGuard on a router – Guides | Mullvad VPN
https://mullvad.net/en/help/running-wireguard-router/
ISPは何と契約していますか?
どんなルーター買われましたか?
私もルーター探してるんですがどのルーターがいいのかわからないです
TP-Link
vpnルーターって端末→isp→vpn鯖→インターネット→isp→端末なんですか?普通のコマンドラインやGUIアプリで提供されるものではなくVPNルーターを使うのはなぜなのでしょうか
ルーターのVPNクライアント機能は、本来は疑似専用線として使う場合を想定としたものだと思うが
これを隠匿サービスのVPNに応用するメリットといえば
ズバリ!家中まるごと隠匿できる事でしょう
PCやスマホにクライアント入れても、ソレ以外の端末(家電やゲーム機)が通常接続のママになってしまうからだと思うよ
Cheenaさんが使ってるVPNってMullvadですか?
WireGuardはUDPしか対応してない点や(検証してないが)暗号化アルゴリズム上の関係で必ずVPNサーバーに接続ログが残る点、コード数が少ないが暗号の素人目線では長期観察の点でまだ安全性が証明されてないので見送ってたが最近一気に流行ってきた印象があるよね。
udpしかサポートしてない点の問題はファイルダウンロード時などはhash検証を行えばいいだけだが…
https://protonvpn.com/support/wireguard-privacy/
接続ログの問題はフェイクだったみたいすまん:)
cheena君がNordVPNがNAT制御でこの問題を解決してるかは知らないけど少なくともProtonVPNはNAT制御で解決できてるらしいね。