一世を風靡したVPNプロトコル「OpenVPN」をすっかり過去のものとしてしまった最新のVPNプロトコルが「WireGuard」です。
軽量・高速で高セキュリティのVPN「WireGuard」はOpenWrtルーターで簡単に利用することができます。
OpenWrtルーターでWireGuardを使うことで、「外出先のパソコンから本店へ接続する」「本店ネットワークと実家(帰省先)ネットワークを拠点間接続する」というVPN環境を構築することができます。
本記事ではOpenWrtルーター2台を使い「拠点間VPN」環境を構築してみます。
本記事では2台のOpenWrtルーターを使い、それぞれ「本店ルーター」「支店ルーター」を想定して「本店・支店間の拠点間VPN環境」を構築していきます。
拠点間VPN接続したい!本記事の前提
本記事では2台のOpenWrtルーターおよびOpenWrt上で利用可能なWireGuardパッケージを使って拠点間(Site-to-Site)VPNの環境を構築していきます。
拠点間(Site-to-Site)VPNとは「本店と支店のネットワークを接続」「自宅と仕事場のネットワークを接続」などの接続形態になります。
※テレワークなどで使用する「パソコンを会社のネットワークへ接続」という接続形態はリモートVPNとして本記事とは別の接続形態になります。
WireGuard構築に必要な回線環境
WireGuardは「ピア-to-ピア型VPN」と言われており「サーバー/クライアントの関係はない」と言われています。
いったんVPNトンネルが確立したらその通りなのですが、実際の仕組み上は「接続を待ち受ける側」と「接続しに行く側」の機能分担があるため、本記事では「接続を待ち受ける側をサーバーとし、「接続しに行く側」をクライアントと表記します。
本記事ではIPv4によるVPN構築を行います。
このため、サーバー側(接続を待ち受ける側)にはグローバルIPv4アドレスが必要です。
今回、我が家の環境においてサーバー側の回線はMAP-e(v6プラス)環境として構築していきますが、IPv4/PPPoEなどグローバルIPv4アドレスが付与される回線環境であれば同じ手順で構築できます。
※DS-Lite/ホームルーターなどグローバルIPv4アドレスが付与されない回線はサーバー側として使えません(クライアント側としては使えます)。
拠点間(Site-to-Site)VPN環境構築の前提
本記事で構築する拠点間(Site-to-Site)VPNの環境、および本記事記載名称は以下のようになります。
サーバー | クライアント | |
---|---|---|
本記事記載名称 | サーバー/本店 | クライアント/支店 |
拠点機能 | 接続待ち受け | 接続しに行く |
回線環境 | MAP-e(v6プラス) | IPv4/PPPoE |
WireGuard ネットワークIP |
10.1.1.1 | 10.1.1.3 |
拠点ネットワーク | 192.168.21.0/24 | 192.168.11.0/24 |
使用機器 (ルーター) |
OpenWrt 23.05 | |
WXR-2533DHP | WZR-HP-AG300H |
拠点間(Site-to-Site)VPN環境構築手順のポイント
OpenWrtのWireGuardパッケージではWireGuardを管理するGUIが提供されています。
このGUIは「サーバー側でピア(クライアント)の情報も管理する」という仕組みになっています。
具体的には以下の機能を持っている(連携している)ということです。
- ピア(クライアント側)の鍵をサーバー側で作成してくれる
- ピア(クライアント側)のIPアドレス情報をサーバー側で管理する
つまりピア(クライアント)情報もすべてサーバー側で定義し管理する仕組みです。
この仕組みを使って拠点間(Site-to-Site)VPNを構築するわけなので、以下の点が構築手順としてポイントになります。
- ピア(クライアント側)の定義もサーバー側のWireGuard GUIで定義する。
- ピア(クライアント側)の定義ファイルもサーバー側で作成する
- ピア(クライアント側)のWireGuardインターフェースではそれをインポートするだけ
つまり設定に関するほぼすべての作業は本店側(サーバー側)のOpenWrtルーターで行い、支店側(ピア側)のOpenWrtルーターでは本店側で作成した定義ファイルをインポートするだけ、という手順です。
本記事記載の作業手順において、本店側での作業と支店側での作業を間違えないようにしてください。
本記事の前提
WireGuardは「つながりやすい/構築しやすい」と言われています。
実際、あまり面倒な設定もなくサーバー側/クライアント側の定義は簡単ですが、接続のキモはコンフィグ定義になります。
[Interface]
PrivateKey = aOwA*******************************j2mH/Hmw=
Address = 10.1.1.3/32
DNS = 1.1.1.1
[Peer]
PublicKey = 3saZ4e*****************************DagfB2F0=
PresharedKey = XoL*****************************FZoZ6g1/ofs=
AllowedIPs = 10.1.1.1/32, 192.168.21.0/24
Endpoint = 14.***.***.***:52498
PersistentKeepalive = 25
こんな感じのコンフィグ定義を行うわけですが、このコンフィグ定義の設定項目/内容については詳しく説明しません。
本記事は「OpenWrtルーター上のWireGuardパッケージを使用し拠点間(Site-to-Site)VPNを構築する手順書」という位置づけとし、WireGuardによるVPN接続の経験者を対象とします。
※すみませんね、定義ファイル内容を説明しだすと教科書みたいになるし私もよくわかってないので・・・
STEP① MAP-eで使えるポート番号の確認
本記事で構築する拠点間(Site-to-Site)VPNのサーバー側(通信を待ち受ける側)の回線環境はMAP-e(v6プラス)です。
MAP-e(v6プラス)回線では通常IPv4アドレスで使える全65535個の通信ポートのうち240個の通信ポートしか使えません。
よって、事前に自分が使える通信ポート番号を調べておく必要があります。
MAP-e(v6プラス)はIPv6通信パケットの中にIPv4通信パケットをカプセル化(内包)して通信する、つまり通信自体はIPv6通信となります。
MAP-eは1個のIPv4アドレスを複数人契約で分割利用することでIPv4アドレスを節約する仕組みであり、自分のIPv4アドレスには0番~65534番までの全65535個のうち240個のポート番号が付与されます。
この「付与される240個の通信ポート」は選べないため(自動的に配布)「自分のルーターで使える通信ポート番号」を把握しておく必要があります。
MAP-e構築に必要なパラメーター
では「自分のIPv4アドレスは?」「自分が使えるポート番号は?」という情報が必要ですが、これらはすべてVNEから付与されるIPv6アドレスの中に情報として持っている、という仕組みになります。
よって、MAP-eなどの規格に詳しい人ならIPv6アドレスを元にIPv4アドレス/使えるポート番号/各種設定パラメータを自分で計算することができるのですが、普通の人にはそんなの無理です。
MAP-eパラメーター自動計算サイト
そのために、ネット上ではこれらをIPv6アドレスから自動計算してくれるありがたいサイトが公開されています。
上記サイトで自分のルーターに付与されているIPv6アドレスを設定(コピペ)することで、自分のIPv4アドレス/使えるポート番号/MAP-eパラメータを自動計算してくれます。
このサイトに自宅ルーター(OpenWrt)に付与されているIPv6アドレスを入力(コピペ)して「計算」ボタンを押下することで、自動的にルーターに付与されているポート番号を計算・表示してくれます。
MAP-e(v6プラス)では以下のように「AAAA-BBBB」のように16個の連続ポート番号が1セットとなり、15セット配布されます。
※一例です、自分のポート番号セットは自動計算サイトで確認のこと!
連続1セットで16ポート、それが15セットなので合計240個の通信ポートが使える、ということになります。
WireGuard通信に必要なポート番号
WireGuardでは通信の待ち受け側は標準で”51820″の通信ポートで待ち受けしますが、任意のポート番号に変更可能です。
MAP-e(v6プラス)環境の場合、偶然にもこの”51820″ポートが付与されているとうれしいのですが、付与されていない場合には別途付与されている任意のポート番号を”51820″の代わりに使います。
我が家は付与されているポート番号の中で、”51820″に比較的近いポート番号を1個選んで待ち受けポート番号としました。
本記事では上記ポート番号セットの中で付与されたポート番号のうち、今回は”61888″を使って待ち受けすることにします。
その他、事前に決めておくこと
本環境はMAP-e(v6プラス)でありMAP-e(v6プラス)では利用可能な通信ポートが240個(本来のIPv4は65535個)であることから、使えるポート番号を事前に確認しWireGuardの待ち受けポートを決定しました。
本記事では先述のように”61888″ポートを利用します。
それ以外に(ポート番号以外)にWireGuard設定のために事前に決めておくことを整理します。
WireGuardネットワークIPアドレス
WireGuardはL3(Layer3)VPNなのでVPNトンネルの始点・終点にWireGuard通信専用のIPアドレスが必要です。
このIPアドレスは自宅ネットワークのIPアドレス(192.168.***.***/24)とかMAP-e(v6プラス)に付与されているグローバルIPv4アドレスとは全く関係ない、そしてそれらと重複しないIPv4アドレスを決めておく必要があります。
本記事ではWireGuardネットワークIPアドレスは”10.0.1.0/24″とし、待ち受け側(OpenWrt側)およびピア(接続相手/スマホやパソコン)側を以下のように設定します。
サーバー側 | 10.1.1.1/24 |
---|---|
クライアント側 | 10.1.1.3/24 |
もしピア(接続相手)が増えていく場合には順次”10.1.1.4″”10.1.1.5″というふうにIPアドレスをインクリメントしていきます。
※現在我が家ではすでにリモートVPN接続で「10.1.1.2」を使っているため「10.1.1.3」としています。
エンドポイントIPアドレスの確認
エンドポイントIPアドレスとはピア(接続相手)がOpenWrt側のWireGuardに接続する場合のグローバルIPv4アドレスになります。
なのでMAP-e(v6プラス)で付与されているMAP-eインターフェース(本記事では”wan”インターフェース)のIPv4アドレスとなります。
また、ダイナミックDNSなどを使って名前解決の仕組みがある場合にはIPアドレスではなくドメイン名でもかまいません。
本記事では(面倒なので)直接MAP-eインターフェースに付与されているIPv4アドレスを使います。
STEP② 必要モジュールのインストール
OpenWrtルーターでWireGuardを利用するためには追加でWireGuardモジュールのインストールが必要です。
OpenWrtでのソフトウェア管理はメニュー「システム > ソフトウェア」画面より行います。
- 「リストを更新」ボタンでパッケージ一覧を更新
- 「フィルター」欄でパッケージ名で絞り込む
- 「インストール」ボタンでパッケージをインストール
必須ソフト”luci-proto-wireguard”モジュール
- luci-proto-wireguard
WireGuardの環境構築に必須のモジュールが”luci-proto-wireguard”モジュールです。
必ずインストールしてください。
関連する他のモジュールも同時にインストールされます。
なお、インストール後にルーターを再起動しないと有効になりません。
おすすめソフト”ttyd”モジュール
- luci-app-ttyd(英語モード)
- luci-i18n-ttyd-ja(日本語モード)
本記事ではMAP-e環境構築の手順として一部コマンド操作が必要な場合があります。
通常はteratermなどのsshソフトウェアやOSのSSHコマンドで利用することもできますが、”luci-i18n-ttyd”モジュールをインストールすることでLuCIインターフェース上でTTY画面(ターミナル画面)が利用できるようになります。
TTYDモジュールをインストールすると、メニュー「サービス > ターミナル」からターミナル画面を利用することができるようになります。
お好みソフト”luci-i18n-ddns-ja
- luci-i18n-ddns-ja
外出先から自宅のWireGuardへ接続する場合に直接IPv4アドレス指定ではなくドメイン名アクセスができると便利です。
“luci-i18n-ddns-ja”モジュールはOpenWrtが提供するダイナミックDNSクライアントモジュールであり、インストールするとさまざまなダイナミックDNSサービスに対して自宅ルーターのIPv4アドレスを登録できます。
“luci-i18n-ddns-ja”モジュールをインストールすると、メニュー「サービス > ダイナミックDNS」画面が提供されます。
さまざまな世界中の有料/無料のダイナミックDNSサービスが利用できる定義ファイルが標準提供されています。
また、標準で提供されていないダイナミックDNSサービスについても、簡単な定義ファイルを作成することで利用可能となります。
これからダイナミックDNSを使ってみよう!と思っている方は利用を検討してみるとよいでしょう。
STEP③ WireGuardインターフェースの構築
ではここからWireGuardのインターフェースを構築していきます。
なお、WireGuardに必要なソフトウェアインストール後に一度ルーター(OpenWrt)を再起動しておく必要があります。
インターフェースの新規作成
メニュー「ネットワーク > インターフェース」画面から「新規インターフェースの作成」ボタン押下でインターフェースを作成します。
プロトコルの選択
名前 | ご自由に ※本記事では”wg0″ |
---|---|
プロトコル | “WireGuard VPN”を一覧選択 |
上記を設定し「インターフェースを作成」ボタンを押下します。
一般設定
「一般設定」タブ画面で以下の設定を行います。
秘密鍵 | 自動生成させる(何もしない) |
---|---|
公開鍵 | 自動生成させる(何もしない) |
“Generate new key pair”ボタン | 押下して「秘密鍵」「公開鍵」を自動生成させる |
リッスンポート | WireGuardの通信待ち受けポート番号(初期値:51820) ※本記事では”61888″ ※MAP-eなので使えるポートへ変更 |
IPアドレス | WireGuardネットワーク上のサーバーIPアドレス ※本記事では”10.1.1.1/24″ |
ファイアウォール設定
「ファイアウォール設定」タブ画面で以下の設定を行います。
ファイアウォールゾーン | “lanゾーン(緑色のやつ)”を一覧選択 |
---|
上記を設定したらいったん「保存」ボタン押下で画面を閉じます。
設定のシステム反映
インターフェース一覧画面に戻ります。
今作成したWireGuardインターフェースはまだ「保留中」の状態となっています。
「保存&適用」ボタンを押下してシステム反映させておきます。
ここまででサーバー側(通信町受側=OpenWrt側)の設定は完了です。
なお、WireGuardのインターフェースは「保存&適用」を行ってもインターフェースを再起動しないと反映されない項目があります。
よって、WireGuardインターフェースを修正した場合「保存&適用」と「再起動」はセットで行うようにしたほうが良いと思います。
STEP④ ピア(接続相手)の定義
次に接続相手側(支店/クライアント)である「ピア」の設定を行います。
再度インターフェース一覧から作成したWireGuardインターフェース(本記事では”wg0″)を「編集」ボタンで開きます。
ピア(通信相手)一覧画面より「ピアを追加」ボタンを押下します。
ピア(通信相手)の追加情報設定
ピア(通信相手=支店/クライアント)の情報を設定していきます。
説明 | ご自由に ※本記事ではSiten-B |
---|---|
公開鍵 | 自動生成させる(何もしない) |
秘密鍵 | 自動生成させる(何もしない) |
“Generate new key pair”ボタン | 押下して「秘密鍵」「公開鍵」を自動生成させる |
事前共有鍵 | 自動生成させる(何もしない) |
“Generate preshared key”ボタン | 押下して「事前共有鍵」を自動生成させる |
許可されたIP | ピア(通信相手=クライアント)からのネットワークIP ※”10.1.1.3/32″(クライアントのWireGuardIP) ※”192.168.11.0/24″(支店のネットワーク) |
許可されたIPのルート | チェックする |
永続的なキープアライブ | 初期値”0″でも良いけどWireGuard推奨値”25″を設定 |
上記の情報を設定後「Generate configuration」ボタンを押下します。
「許可されたIP」設定について
「許可されたIP」欄の設定はご自分の環境に合わせて設定します。
この設定は通信相手(つまりサーバーから見てクライアント)から「どの通信パケットを許可(通信OK)」「どの通信パケットを拒否(通信NG)」の設定となります。
本記事冒頭で示した通り本記事での本店(サーバー)/支店(クライアント)のネットワークは以下の通りです。
サーバー | クライアント | |
---|---|---|
本記事記載名称 | サーバー/本店 | クライアント/支店 |
拠点機能 | 接続待ち受け | 接続しに行く |
回線環境 | MAP-e(v6プラス) | IPv4/PPPoE |
WireGuard ネットワークIP |
10.1.1.1 | 10.1.1.3 |
拠点ネットワーク | 192.168.21.0/24 | 192.168.11.0/24 |
使用機器 (ルーター) |
OpenWrt 23.05 | |
WXR-2533DHP | WZR-HP-AG300H |
つまり、サーバー側から見て「許可」すべきIPアドレスは以下の2つとなります。
クライアントの WireGuard IPアドレス |
本記事では”10.1.1.3/32 |
---|---|
クライアントの ネットワークIPアドレス |
本記事では”192.168.11.0/24 |
ご自分のネットワーク構成に合わせて登録してください。
ピア(つまりクライアント側用)定義ファイルの作成
前節の「ピア」定義は「サーバー側から見たピア(クライアント)定義」となります。
この画面(Generate configuration)はサーバー定義に基づく「ピア(クライアント側)の定義ファイル作成」となります。
※視点がかわるということです。
ここまで設定してきたサーバー側情報およびピア情報をもとに、WireGuardの接続定義情報(コンフィグ)を調整していきます。
画面下に表示される定義ファイル(赤枠部分)を見ながら、最終調整を行います。
それでは画面項目を設定していきます。
Connection endpoint | 待ち受けサーバー側のグローバルIPv4アドレスを一覧選択 ドメイン名指定も可能 |
---|---|
許可されたIP | ちょっと面倒(要注意)なので後述 |
DNS Server | WireGuardネットワークが利用するDNSサーバーIPアドレス ※とりあえず”1.1.1.1″とか”8.8.8.8″などへ変更しておくのがオススメ |
アドレス一覧 | ピア(クライアント)のWireGuardネットワークIP ※本記事では”10.1.1.3/32″ |
上記を設定すると画面右下のコンフィグファイルの内容に反映されます。
本記事では上記の設定後に定義ファイルは以下のようになっています。
[Interface]
PrivateKey = kEEu9TrpCQsVqyBgU6yFPLy3qCiubyHExxn5FPKxh2I=
Address = 10.1.1.3/32
# ListenPort not defined
DNS = 1.1.1.1
[Peer]
PublicKey = 3saZ4eq0cC5/SCZS69RBUBMk5Y1b1UBZWlODagfB2F0=
PresharedKey = J+4oSQSy8F5CabJsrBsEaj0PezkcjagvEfztwzcwSMw=
AllowedIPs = 10.1.1.1/32, 192.168.21.0/24
Endpoint = 14.***.***.***:61888
PersistentKeepAlive = 25
ピアがパソコンの場合には画面右下のコンフィグ内容をコピペしてファイル保存しパソコンのWireGuardアプリで読み込みます。
ピアがスマホの場合にはスマホのWireGuardアプリで画面左下のQRコードで接続情報を読み込みます。
以上終了したら「Back to peer configuration」ボタンで前画面へ戻り「保存」ボタンでピア情報を保存しておきます。
以上でピア(接続相手)情報の設定は完了です。
「許可されたIP」設定について
「許可されたIP」欄の設定はご自分の環境に合わせて設定します。
本画面(インターフェース>wg0>Edit Peer>Generate Configuration)は「ピア(クライアント)から見たサーバーへの通信」を定義するファイルです。
つまり、この設定はピア(クライアント)から見て「どの通信パケットをサーバーへ流すか」の設定となります。
本記事冒頭で示した通り本記事での本店(サーバー)/支店(クライアント)のネットワークは以下の通りです。
サーバー | クライアント | |
---|---|---|
本記事記載名称 | サーバー/本店 | クライアント/支店 |
拠点機能 | 接続待ち受け | 接続しに行く |
回線環境 | MAP-e(v6プラス) | IPv4/PPPoE |
WireGuard ネットワークIP |
10.1.1.1 | 10.1.1.3 |
拠点ネットワーク | 192.168.21.0/24 | 192.168.11.0/24 |
使用機器 (ルーター) |
OpenWrt 23.05 | |
WXR-2533DHP | WZR-HP-AG300H |
つまり、クライアントから見て「サーバーへ流すべき通信パケット」は以下の2つとなります。
サーバーの WireGuard IPアドレス |
本記事では”10.1.1.1/32 |
---|---|
サーバーの ネットワークIPアドレス |
本記事では”192.168.21.0/24 |
ご自分のネットワーク構成に合わせて登録してください。
定義ファイルの確認
本記事で設定した結果の定義ファイルは以下のようになりました。
[Interface]
PrivateKey = kEEu9TrpCQsVqyBgU6yFPLy3qCiubyHExxn5FPKxh2I=
Address = 10.1.1.3/32
# ListenPort not defined
DNS = 1.1.1.1
[Peer]
PublicKey = 3saZ4eq0cC5/SCZS69RBUBMk5Y1b1UBZWlODagfB2F0=
PresharedKey = J+4oSQSy8F5CabJsrBsEaj0PezkcjagvEfztwzcwSMw=
AllowedIPs = 10.1.1.1/32, 192.168.21.0/24
Endpoint = 14.***.***.***:61888
PersistentKeepAlive = 25
定義ファイル内容は確認し、おかしいところは調整してください。
Interface | PrivateKey | 手を加えない(そのまま) |
---|---|---|
Address | クライアントのWireGuard IPアドレス ※本記事では”10.1.1.3/32″ ※修正は「アドレス一覧」 |
|
DNS | WireGuardネットワークが参照するDNSサーバー ※本記事では”1.1.1.1″ ※修正は「DNS Servers」 |
|
Peer | PublicKey | 手を加えない(そのまま) |
PresharedKey | 手を加えない(そのまま) | |
AlowedIP | 本画面の「許可されたIP」 ※本記事では「10.1.1.3/32″,”192.168.21.0/24″ ※修正は「許可されたIP」 |
|
Endpoint | サーバー側のグローバルIPv4アドレスとポート番号 ※本記事では14.***.***.***:61888 ※IPアドレス修正は「Connection endpoint」 |
|
PersistentKeepAlive | 本記事では”25″ ※修正は |
STEP⑤ OpenWrtルーターの設定(サーバー側)
サーバー側のOpenWrtルーターにポートフォワーディング(転送)とスタティックルーティングの設定を行います。
ポートフォワーディング
サーバー側のOpenWrtルーターにはポートフォワーディングの設定を行います。
サーバー側はクライアントからの接続要求を待ち受け、接続要求があったらその通信パケットをWireGuardサーバーへ転送する、という設定です。
メニュー「ネットワーク > ファイアウォール」画面の「ポートフォワーディング」タブ画面を開きます。
ポートフォワーディング画面から「追加」ボタンで新しいポートフォワーディングを定義していきます。
ポートフォワーディング一般設定
名前 | ご自由に ※本記事では”UDP61888″ ※待ち受けポートが61888/UDPなので |
---|---|
プロトコル | “UDP” ※一覧から”TCP”のチェックをはずす |
送信元ゾーン | “wan”ゾーンを一覧選択 |
外部ポート | WireGuardの待ち受けポートを設定 ※本記事では”61888″ |
宛先ゾーン | “lan”ゾーンを一覧選択 |
内部IPアドレス | 一覧よりOpenWrtのIPアドレスを選択 |
宛先ポート | WireGuardの待ち受けポートを設定 ※本記事では”61888″ |
以上を設定したら「保存」ボタンで画面を閉じます。
ポートフォワーディング設定のシステム反映
ポートフォワーディング一覧画面に戻ったら「保存&適用」ボタンでシステム反映させておきます。
以上でOpenWrtルーターのポートフォワーディング設定は完了です。
スタティックルーティング
拠点間(Site-to-Site)VPNなのでサーバー側のルーター(OpenWrt)ではピア(接続先=クライアント)への通信パケットをWireGuardへ流す必要があります。
本記事ではサーバー側から見てクライアント側のネットワークは「192.168.11.0/24」なのでそれをWireGuardサーバー(192.168.12.1)へ流すという設定です。
メニュー「ネットワーク > ルーティング」画面の「IPv4静的ルーティング」タブ画面を開きます。
「追加」ボタンでルーティング情報を設定していきます。
ターゲット | ピア(通信相手=クライアント側)のネットワークセグメント ※本記事では”192.168.11.0/24″ |
---|---|
ゲートウェイ | サーバーWireGuard IPアドレス ※本記事では”192.168.21.1/24″ ※OpenWrt上に構築しているのでOpenWrtのIP |
上記を設定し「保存」ボタンで画面を閉じます。
「IPv4静的ルーティング」一覧画面に戻ったら「保存&適用」ボタン押下でシステム反映させておきます。
以上でスタティックルーティングの設定は完了です。
スタティックルーティングの必要性
本記事はOpenWrtルーター上にWireGuardインターフェースを構築しています。
このため、WireGuardインターフェースのIPアドレスはデフォルトゲートウェイであるOpenWrtルーターと同じIPアドレスになります(当たり前)。
このため、スタティックルーティングの設定を行わなくても動くわけです(笑)
でもまぁ、一応作法というかスタティックルートを設定しておいたほうが良いかな?と思います。
STEP⑥ WireGuardインターフェース構築(クライアント側)
では次にクライアント側のOpenWrt上にWireGuardインターフェースを構築していきます。
ここからはクライアント側のOpenWrt上での作業となります。
作業前提として「すでにWireGuardモジュールをインストール済み」「ルーター再起動済」とします。
インターフェースの新規作成
メニュー「ネットワーク > インターフェース」画面から「新規インターフェースの作成」ボタン押下でインターフェースを作成します。
プロトコルの選択
名前 | ご自由に ※本記事では”wg0″ |
---|---|
プロトコル | “WireGuard VPN”を一覧選択 |
上記を設定し「インターフェースを作成」ボタンを押下します。
一般設定
「一般設定」タブ画面では「Load configuration」ボタンを押下します。
「Import configuration」画面が表示されるので、サーバー側で作成した定義ファイルをコピペします。
コピペしたら「Import settings」ボタンを押下して画面を閉じます。
サーバー側で定義した定義ファイルの内容が「一般設定」タブ画面の各項目にセットされます。
ファイアウォール設定
「ファイアウォール設定」タブ画面で以下の設定を行います。
ファイアウォールゾーン | “lanゾーン(緑色のやつ)”を一覧選択 |
---|
上記を設定したらいったん「保存」ボタン押下で画面を閉じます。
ピア(接続相手=サーバー)の情報設定
「ピア」タブ画面を開きます。
インポート(コピペ)した定義ファイルにってピア(サーバー)のピア情報が既に登録されていますが、ちょっと追加修正を行いますので「編集」ボタンを押下します。
「Edit peer」画面で以下の修正を行います。
許可されたIPのルート | チェックする |
---|
以上を修正したら「保存」ボタン押下で画面を閉じます。
「ピア」タブ画面に戻ったらまた「保存」ボタンで画面を閉じます。
設定のシステム反映
インターフェース一覧画面に戻ります。
今作成したWireGuardインターフェースはまだ「保留中」の状態となっています。
「保存&適用」ボタンを押下してシステム反映させておきます。
ここまででサーバー側(通信町受側=OpenWrt側)の設定は完了です。
なお、WireGuardのインターフェースは「保存&適用」を行ってもインターフェースを再起動しないと反映されない項目があります。
よって、WireGuardインターフェースを修正した場合「保存&適用」と「再起動」はセットで行うようにしたほうが良いと思います。
クライアント側インターフェースの注意点
このように、クライアント側(接続しに行く側)のWireGuardインターフェースはクライアントのOpenWrt上で定義せず、サーバー側(接続を待ち受ける側)のWireGuardインターフェースで作成した「ピア定義」をインポートすることで環境構築します。
これは初期構築の作業手順ではなく、クライアント側インターフェースを修正する場合においても「サーバー側ピア定義を変更し、クライアント側でピア定義をインポートする」という手順になります。
これは拠点間(Site-to-Site)VPNの環境でサーバー側とクライアント側の整合性を保つうえで徹底が必要かと思います。
STEP⑦ OpenWrtルーターの設定(クライアント側)
クライアント側のOpenWrtルーターにスタティックルーティングの設定を行います。
スタティックルーティング
拠点間(Site-to-Site)VPNなのでクライアント側のルーター(OpenWrt)ではピア(接続先=サーバー)への通信パケットをWireGuardへ流す必要があります。
本記事ではクライアント側から見てサーバー側のネットワークは「192.168.21.0/24」なのでそれをWireGuardサーバー(192.168.11.1)へ流すという設定です。
メニュー「ネットワーク > ルーティング」画面の「IPv4静的ルーティング」タブ画面を開きます。
「追加」ボタンでルーティング情報を設定していきます。
ターゲット | ピア(通信相手=クライアント側)のネットワークセグメント ※本記事では”192.168.21.0/24″ |
---|---|
ゲートウェイ | サーバーWireGuard IPアドレス ※本記事では”192.168.11.1/24″ ※OpenWrt上に構築しているのでOpenWrtのIP |
上記を設定し「保存」ボタンで画面を閉じます。
「IPv4静的ルーティング」一覧画面に戻ったら「保存&適用」ボタン押下でシステム反映させておきます。
以上でスタティックルーティングの設定は完了です。
スタティックルーティングの必要性
本記事はOpenWrtルーター上にWireGuardインターフェースを構築しています。
このため、WireGuardインターフェースのIPアドレスはデフォルトゲートウェイであるOpenWrtルーターと同じIPアドレスになります(当たり前)。
このため、スタティックルーティングの設定を行わなくても動くわけです(笑)
でもまぁ、一応作法というかスタティックルートを設定しておいたほうが良いかな?と思います。
STEP⑧ 拠点間(Site-to-Site)VPN接続確認
ここまでの設定作業によりサーバーおよびクライアントはWireGuardによる拠点間(Site-to-Site)VPNで相互接続されています(うまく設定できていれば・・・)。
では、サーバー/クライアント間の拠点間(Site-to-Site)VPNが確立されているか?を確認してみましょう。
ハンドシェイクの確認
まず最初にハンドシェイクの確認をしてみましょ。
サーバー側OpenWrtからメニュー「状態 > WireGuard」画面を開きます。
クライアントからサーバーへのハンドシェイクが成功していれば上記のように接続相手(ピア=クライアント)の情報が表示されます。
ここで「最新のハンドシェイク」の(〇〇秒前)が直近であればたぶんハンドシェイクは成功し拠点間VPNも確立しています(まだわからないけど)。
同様にクライアント側OpenWrtからメニュー「状態 > WireGuard」画面でも接続相手(ピア=サーバー)の情報が表示されます。
両方(サーバー側/クライアント側)の状態を確認してください。
ハンドシェイクが確立していない場合
ハンドシェイクが確立していない場合は「クライアントからサーバーへの通信ができていない」状態です。
以下の原因が考えられます。
- クライアント側で定義した「サーバー側IPアドレス(またはドメイン名)が間違っている
- サーバー側の待ち受けポート(リッスンポート)が間違っている
- サーバー側ルーター(OpenWrt)のポートフォワーディングが間違っている(または未定義)
クライアント側のWireGuardからサーバー側のWireGuardに接続が確立できていない状態であり、上記を確認してください。
PINGでの疎通確認
ハンドシェイクが確立していれば「たぶん・・・」拠点間VPNも機能しています。
これをpingコマンドで確認してみましょう。
サーバー側OpenWrtのSSH(またはTTY)からクライアント側へpingコマンドを打ってみます。
まず接続相手(ピア=クライアント)のWireGuard IPおよびOpenWrtルーターのIPアドレスへPingを打ってみます。
root@OpenWrt:~# ping 10.1.1.3
PING 10.1.1.3 (10.1.1.3): 56 data bytes
64 bytes from 10.1.1.3: seq=0 ttl=64 time=25.113 ms
64 bytes from 10.1.1.3: seq=1 ttl=64 time=25.263 ms
64 bytes from 10.1.1.3: seq=2 ttl=64 time=25.314 ms
^C
--- 10.1.1.3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 25.113/25.230/25.314 ms
root@OpenWrt:~# ping 192.168.11.1
PING 192.168.11.1 (192.168.11.1): 56 data bytes
64 bytes from 192.168.11.1: seq=0 ttl=64 time=24.863 ms
64 bytes from 192.168.11.1: seq=1 ttl=64 time=25.173 ms
64 bytes from 192.168.11.1: seq=2 ttl=64 time=25.925 ms
^C
--- 192.168.11.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 24.863/25.320/25.925 ms
上記のようにサーバー側からクライアント側へのWireGuardアドレス(本記事では10.1.1.3)のPingが通ります。
またクライアント側のネットワーク(本記事では192.168.11.0/24ネットワーク)へのPingも通ります。
同じように、クライアント側のSSH(またはTTY)からサーバー側のWireGuard IPアドレスおよびサーバー側ネットワークへPingを疎通を確認してみます。
サーバー/クライアントの双方からピア(相手)へのPingが通れば拠点間VPNは確率されています。
Pingが疎通しない場合
サーバー側およびクライアント側の双方からのPingが成立しない場合、(たぶん)VPNのルーティングが設定されていません。
サーバー側およびクライアント側のWireGuardインターフェースのピア設定から「許可されたIPのルート」がチェックされているかどうかを確認してみてください。
サーバー側/クライアント側の両方にチェックが必要です。
番外編① 拠点間(Site-to-Site)VPNでダイナミックDNSを使う
ここまでの手順ではピアから自宅OpenWrtへの接続先情報(エンドポイント)としてMAP-e(v6プラス)インターフェースへ割り当てられたIPv4グローバルアドレスを直接指定してきました。
ダイナミックDNSサービスを使えばこれを直接IPv4アドレス指定ではなく、ダイナミックDNSサービスが提供するドメイン名で接続することができます。
本記事では「STEP② モジュールのインストール」のおすすめモジュールとしてダイナミックDNSクライアント”luci-i18n-ddns-ja”をお勧めしています。
ここからは、このOpenWrtのダイナミックDNSクライアントモジュールを使って自宅へドメイン名アクセスできる仕組みを構築してみます。
おすすめのダイナミックDNSサービス
ここからの前提として、使用するダイナミックDNSサービスは「DDNS Now!」というフリーのダイナミックDNSサービスを利用させていただきます。
海外の有名どころのダイナミックDNSサービスは定期的に公式サイトへのログインが必須だったり、大量の広告メールが送られてきたりします。
「DDNS Now」は無料で使えるうえに「知らないうちに解約されてた」「広告が送られてくる」などが一切ない非常に使い勝手の良いダイナミックDNSサービスであり超おすすめです。
登録も利用も無料なのでぜひ使ってみてください。
本記事では「DDNS Now!」による「〇〇〇.f5.si」というドメインを前提に説明していきます。
ダイナミックDNSモジュールの使い方
OpenWrtのダイナミックDNSクライアントパッケージ”luci-i18n-ddns-ja”をインストールすると、メニュー「サービス > ダイナミックDNS」が利用できるようになります。
このダイナミックDNSクライアントは非常に多くの世界中のダイナミックDNSサービス(有料/無料)に対応していますが、残念ながら「DDNS Now!」は標準対応していません。
よって、「新規サービスを追加」による設定の前に「DDNS Now」向けの設定がちょっと必要です。
カスタムDDNSクライアント定義
「DDNS Now」は本モジュールの標準対応のダイナミックDNSサービスではないので、「カスタムダイナミックDNS」として「DDNS Now」向けの定義ファイルを設定する必要があります。
具体的には「/usr/share/ddns/default/」ディレクトリに以下の定義ファイルを配置します。
{
"name": "ddnsnow",
"ipv4": {
"url": "http://f5.si/update.php?domain=[USERNAME]&password=[PASSWORD]&ip=[IP]"
},
"ipv6": {
"url": "http://v6.f5.si/update.php?domain=[USERNAME]&password=[PASSWORD]&ip=[IP]"
}
}
ファイル名は何でもよいのですが、本記事では「ddnsnow.json」というファイル名にします。
上記定義ファイルを見るとわかるように、「DDNS Now」のIPアドレス更新サイトへ問い合わせ(IPアドレスの通知)を行うだけの定義ファイルです。
上記ファイルを指定ディレクトリへ配置します。
配置後には以下のようになります。
root@OpenWrt:~#
root@OpenWrt:~# cd /usr/share/ddns/default/
root@OpenWrt:/usr/share/ddns/default# ls -l ddnsnow.json
-rw-r--r-- 1 root root 218 May 9 16:05 ddnsnow.json
root@OpenWrt:/usr/share/ddns/default#
以上で「DDNS Now」用のカスタム定義ファイルは完了です。
ダイナミックDNSの設定
最初にカスタム定義をシステム反映させるために「DDNSサービスリストを更新」ボタンを押下しておいてください。
ではメニュー「サービス > ダイナミックDNS」画面よりダイナミックDNSの設定を行っていきます。
画面「新規サービスを追加」ボタンを押下し、新しいダイナミックDNS登録を行います。
名前 | ご自由に ※本記事では”ddnsnow_ipv4″ |
---|---|
IPアドレスのバージョン | “IPv4アドレス”を一覧選択 |
DDNSサービス・プロバイダー | “ddnsnow”を一覧選択 |
以上を設定し「サービスを作成」ボタンを押下します。
ルックアップするホスト名 | 〇〇〇.f5.si ※利用登録したDDNS Nowのドメイン名 |
---|---|
DDNSサービスプロバイダー | ddnsnow |
ドメイン | 〇〇〇 ※DDNS Nowへ登録した時のサブドメイン名部分 |
ユーザー名 | 〇〇〇 ※DDNS Nowへ登録した時のサブドメイン名部分 |
パスワード | DDNS Nowへ登録した時のパスワード |
以上を設定したら「保存」ボタンで画面を閉じます。
サービス一覧画面に戻ったら「保存&適用」ボタン押下でシステム反映させます。
以上で設定は完了、しばらく放っておくと勝手に(定期的に)IPv4アドレスの問い合わせ(登録)が行われますが「リロード」ボタンを押下すると即時に問い合わせが行われます。
ダイナミックDNSを拠点間VPNで使う
ここまでの手順で「DDNS Now!」のダイナミックDNSを使って「〇〇〇.f5.si」というドメインを利用可能となります。
では、このドメインを本記事で構築した拠点間VPNで使ってみましょう。
拠点間VPNはクライアント(接続する側)がサーバー(接続待ち受けする側)へ接続要求することでVPN接続が確立します。
つまりサーバー側のグローバルIPv4アドレスをダイナミックDNSを使って登録することになります。
この登録ドメイン(〇〇〇.f5.si)をクライアントからサーバーへ接続するときのエンドポイント情報として設定します。
本記事手順ではクライアント側設定(定義ファイル)もすべてサーバー側の「ピア定義」で定義するため、以下のようにサーバー側のWireGuardインターフェースで定義します。
Connection endpoint | “〇〇〇.f5.si”(ダイナミックDNSの登録ドメイン)を設定 |
---|
上記にドメイン名を登録すると定義ファイルに反映されます。
この定義ファイルをクライアント側インターフェースで再度インポートします。
以上でクライアント側からサーバー側へ接続する場合にドメイン名を使った名前解決が可能となります。
まとめ
本記事ではOpenWrtルーターを使って拠点間(Site-to-Site)VPNを構築してみました。
OpenWrtルーターなら高額な業務用ルーターでしかできないようなことも1,000円程度の出費で実現できてしまいます。
拠点間(Site-to-Site)VPNの構築
本記事では拠点間VPN環境を構築してみました。
拠点間VPNとは「本社と支社のネットワークを接続」「自宅と仕事場のネットワークを接続」などのネットワーク同士の接続形態を言います。
WireGuardで拠点間VPNを構築するためにはサーバー側(待ち受け側)にグローバルIPv4アドレスが必要です。
※グローバルIPv6アドレスでもいいのですが・・・
「拠点間VPNを構築したいけどグローバルIPv4アドレスがない!」という場合でも拠点間VPNを構築できるVPNもあります。
グローバルIPv4アドレスのない環境でVPN構築できるソリューションとして「tailscale」や「SoftEther VPN」があります。
これらは「NATトラバーサル」という機能を使って「サーバーとクライアントの接続情報をマッチングする」という仕組みがあるため、サーバー/クライアントにグローバルIPv4アドレスがなくてもVPN構築することが可能です。
tailscaleを使って拠点間VPNを構築する手順は以下の記事を参考にしてみてください。
リモートVPN環境
テレワークなどの「自宅のパソコンを会社のネットワークへ接続」という接続形態は「リモートアクセスVPN」と言われています。
OpenWrtルーターとWireGuardを使ってリモートアクセスVPN環境を構築する手順はこちらの記事を参考にしてみてください。
また、WireGuardによるサーバー構築にはサーバー側回線にグローバルIPv4アドレスが必要ですが、DS-Lite回線やホームルーター回線などグローバルIPv4アドレスが付与されない回線環境でのVPNサーバー構築にはtailscaleがおすすめです。
OpenWrtルーターとtailscaleを使ってVPNサーバー環境を構築する手順はこちらの記事を参考にしてみてください。
余談ですが、なんかこれメチャ速いぞ!
さて、現在私は仕事都合で単身赴任しております。
普段はミニPC上に構築した仮想マシンでWireGuardサーバーを構築し、自宅と赴任先を拠点間VPN接続しています。
そして、今回そのWireGuard環境をOpenWrt上へ移行してみた・・・ということになるのですが、なんかこれ今までよりメチャ速いです(気のせいかな?)!
ブラウザでの管理画面切り替えもビシバシ決まる感じでなんか気持ちい良いです。
同じWireGuardなのでそんなに差が出るとも思えないのですが・・・
次回はOpenWrt上とミニPC仮想環境上のWireGuardで速度測定/比較でもしてみようかしらん・・・