我が家の光回線を長らく使っていた楽天ひかりからenひかりへと変更しました。
これに伴い回線方式もクロスパスからMAP-e(v6プラス)へと変更したことで、これまで使っていたWireGuardサーバー環境の再構築を行いました。
本記事はMAP-e(v6プラス)環境においてOpenWrtルーターでWireGuardによるリモートVPN環境を構築する忘備録です。
MAP-e(v6プラス)環境におけるWireGuard環境
OpenWrtルーターを使えばWireGuardによる「リモートVPN」や「拠点間(Site-to-Site)VPN」が簡単に構築できます。
WireGuardの環境構築や運用においては鍵の生成や管理が結構面倒なのですが、OpenWrtのWireGuardパッケージを使えばボタンをピコピコおすだけで必要な鍵も自動生成してくれて便利です。
本記事では自宅のOpenWrtルーターにWireGuardインターフェースを構築し、外出先(インターネット側)からパソコンやスマホで自宅ネットワークへWireGuard接続するための定義ファイル(クライアント向け)の作成までの手順を説明していきます。
本記事手順で構築するインターフェース
本記事でのWireGuardリモートVPN環境構築後のインターフェース一覧は以下のようになります。
また、外部(インターネット側)から自宅ルーターへ接続するためのポート転送(フォワーディング)を以下のように設定しています。
以上が本記事手順によるWireGuardリモートVPN環境構築後の完成図となります。
MAP-e(v6プラス)インターフェースについて
なお本記事(および上図完成図)では「すでにMAP-e(v6プラス)環境は構築済」という前提です。
もしMAP-e(v6プラス)環境構築前であれば、以下の記事を参考にまずはMAP-e(v6プラス)の環境を構築してください。
WireGuardリモートVPN環境構築作業の流れ
最初にWireGuardリモートVPNインターフェースの完成状態(構築後)のインターフェースを見てみました。
本記事ではこの完成状態(WireGuardリモートVPN環境)のインターフェースを以下の手順にて構築していきます。
- STEP1MAP-e(v6プラス)で使えるポート番号の確認
MAP-eインターフェースに割り当てられている通信ポート(利用可能なポート番号)を確認します。
- STEP2必要なモジュールのインストール
MAP-e環境構築のための必須ソフトウェアおよびおすすめソフトウェアをインストールします。
- STEP3WireGuardインターフェースの構築
WireGuardが通信に利用するインターフェースを構築します。
- STEP4ピア(接続相手)の定義
ピア(通信相手)に関する情報を定義します。
- STEP5ポートフォワーディング設定
OpenWrtルーターのポート転送(フォワーディング)を設定します。
以上の手順により、自宅のOpenWrtルーター上にWireGuardサーバー機能が構築され、クライアントとなるスマホやパソコン用の定義ファイルを作成できるようになります。
STEP① MAP-eで使えるポート番号の確認
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側)およびピア(接続相手/スマホやパソコン)側を以下のように設定します。
OpenWrt側 | 10.0.1.1/24 |
---|---|
ピア(接続相手)側 | 10.0.1.2/24 |
もしピア(接続相手)が増えていく場合には順次”10.0.1.3″”10.0.1.4″というふうにIPアドレスをインクリメントしていきます。
エンドポイント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.0.1.1/24″ |
ファイアウォール設定
「ファイアウォール設定」タブ画面で以下の設定を行います。
ファイアウォールゾーン | “lanゾーン(緑色のやつ)”を一覧選択 |
---|
上記を設定したらいったん「保存」ボタン押下で画面を閉じます。
設定のシステム反映
インターフェース一覧画面に戻ります。
今作成したWireGuardインターフェースはまだ「保留中」の状態となっています。
「保存&適用」ボタンを押下してシステム反映させておきます。
ここまででサーバー側(通信町受側=OpenWrt側)の設定は完了です。
STEP④ ピア(接続相手)の定義
次に接続相手側(外出先のパソコン/スマホ)である「ピア」の設定を行います。
再度インターフェース一覧から作成したWireGuardインターフェース(本記事では”wg0″)を「編集」ボタンで開きます。
ピア(通信相手)一覧画面より「ピアを追加」ボタンを押下します。
ピア(通信相手)の追加情報設定
ピア(通信相手)の情報を設定していきます。
説明 | ご自由に ※本記事ではWGClient1 |
---|---|
公開鍵 | 自動生成させる(何もしない) |
秘密鍵 | 自動生成させる(何もしない) |
“Generate new key pair”ボタン | 押下して「秘密鍵」「公開鍵」を自動生成させる |
事前共有鍵 | 自動生成させる(何もしない) |
“Generate preshared key”ボタン | 押下して「事前共有鍵」を自動生成させる |
許可されたIP | ピア(通信相手)のWireGuardネットワークIP ※本記事では”10.0.1.2/32″ |
永続的なキープアライブ | 初期値”0″でも良いけどWireGuard推奨値”25″を設定 |
上記の情報を設定後「Generate configuration」ボタンを押下します。
コンフィグファイルの作成
ここまで設定してきたサーバー側情報およびピア情報をもとに、WireGuardの接続定義情報(コンフィグ)を調整していきます。
画面下に表示されるコンフィグファイルを見ながら、最終調整を行います。
Connection endpoint | 待ち受けサーバー側のグローバルIPv4アドレスを一覧選択 ドメイン名指定も可能 |
---|---|
許可されたIP | 今回は初期値のまま(0.0.0.0/0,::/0)とします ※ピアのすべての通信をサーバーへ流す、という設定です |
DNS Server | WireGuardネットワークが利用するDNSサーバーIPアドレス ※とりあえず”1.1.1.1″とか”8.8.8.8″などへ変更しておくのがオススメ |
アドレス一覧 | ピアのWireGuardネットワークIP ※前画面での「許可されたIP」が転記されるのでそのまま |
上記を設定すると画面右下のコンフィグファイルの内容に反映されます。
ピアがパソコンの場合には画面右下のコンフィグ内容をコピペしてファイル保存しパソコンのWireGuardアプリで読み込みます。
ピアがスマホの場合にはスマホのWireGuardアプリで画面左下のQRコードで接続情報を読み込みます。
以上終了したら「Back to peer configuration」ボタンで前画面へ戻り「保存」ボタンでピア情報を保存しておきます。
以上でピア(接続相手)情報の設定は完了です。
STEP⑤ OpenWrtルーターのポートフォワーディング設定
WireGuardの設定は完了しましたが、最後にルーターのポートフォワーディング設定を行います。
ピア(接続相手)が自宅ルーター(OPenWrtルーター)へ接続要求してきた場合にその通信をWireGuardサーバーへ転送するための設定となります。
メニュー「ネットワーク > ファイアウォール」画面の「ポートフォワーディング」タブ画面を開きます。
ポートフォワーディング画面から「追加」ボタンで新しいポートフォワーディングを定義していきます。
ポートフォワーディング一般設定
名前 | ご自由に ※本記事では”UDP61888″ ※待ち受けポートが61888/UDPなので |
---|---|
プロトコル | “UDP” ※一覧から”TCP”のチェックをはずす |
送信元ゾーン | “wan”ゾーンを一覧選択 |
外部ポート | WireGuardの待ち受けポートを設定 ※本記事では”61888″ |
宛先ゾーン | “lan”ゾーンを一覧選択 |
内部IPアドレス | 一覧よりOpenWrtのIPアドレスを選択 |
宛先ポート | WireGuardの待ち受けポートを設定 ※本記事では”61888″ |
以上を設定したら「保存」ボタンで画面を閉じます。
ポートフォワーディング設定のシステム反映
ポートフォワーディング一覧画面に戻ったら「保存&適用」ボタンでシステム反映させておきます。
以上でOpenWrtルーターのポートフォワーディング設定は完了です。
STEP⑥ WireGuard接続確認
サーバー側(OpenWrt側)のWireGuard設定は以上で完了です。
ここからはピア(接続相手)側の設定を行っていきます。
ピアはスマホやパソコンを利用することができます。
ピア用アプリのインストール
パソコン用アプリやスマホ用アプリはWireGuard公式サイトからダウンロード/インストールが可能です。
WireGuard Installation | WireGuard
さまざまなデバイス向けのアプリが提供されているので、ご利用になるデバイス向けのアプリをダウンロード/インストールしてください。
ピアのコンフィグ定義
ピアのアプリ設定が完了したら接続定義(コンフィギュレーションファイル)を読み込んでいきます。
接続定義はOpenWrtのWireGuardインターフェース定義の「ピア」タブ画面から取得します。
ピアのデバイスがスマホの場合には画面左下のQRコードを読み込むことで接続定義が読み込まれます。
パソコンの場合には画面右下の定義ファイルをコピペしてファイル保存し、パソコンのWireGuardアプリに読み込ませます。
以上でピアの設定は完了です。
番外編① リモート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で使ってみましょう。
クライアント(接続する側/スマホやPC)がサーバー(接続待ち受けする側)へ接続要求することでVPN接続が確立します。
つまりサーバー側のグローバルIPv4アドレスをダイナミックDNSを使って登録することになります。
この登録ドメイン(〇〇〇.f5.si)をクライアントからサーバーへ接続するときのエンドポイント情報として設定します。
本記事手順ではクライアント側設定(定義ファイル)もすべてサーバー側の「ピア定義」で定義するため、以下のようにサーバー側のWireGuardインターフェースで定義します。
Connection endpoint | “〇〇〇.f5.si”(ダイナミックDNSの登録ドメイン)を設定 |
---|
上記にドメイン名を登録すると定義ファイルに反映されます。
この定義ファイルをクライアント側インターフェースで再度インポートします。
以上でクライアント側からサーバー側へ接続する場合にドメイン名を使った名前解決が可能となります。
まとめ、OpenWrtルーターでWireGuard構築
以上、本記事ではOpenWrtルーターのMAP-e(v6プラス)環境においてWireGuardのリモートVPN環境を構築してみました。
OpenWrtのWireGuardパッケージを使えばちょっと面倒な鍵の生成・管理やピアのIPアドレス管理もわかりやすくなります。
また、本記事の設定を参考にして拠点間(Site-to-Site)VPNのネットワークを構築することもできます。
MAP-e(v6プラス)環境はDS-Lite環境とことなり制限付きながらも自宅ルーターにグローバルIPv4アドレスが付与されます。
このため、MAP-e(v6プラス)はIPv4 over IPv6環境の中では比較的VPN環境が構築しやすい回線環境と言えます。
MAP-e(v6プラス)環境におけるWireGuard
本記事ではMAP-e(v6プラス)環境においてOpenWrtルーター上にWireGuardサーバーを構築してみましたが、これはわが家がMAP-e(v6プラス)回線だからです。
たとえばIPv4/PPPoE回線やケーブルテレビ回線など完全なIPv4アドレスが利用できる回線環境であっても同じ手順です(ポート番号が異なるだけ)。
MAP-e(v6プラス)回線は自宅ルーターにグローバルIPv4アドレスが付与されるという点におてはIPv4/PPPoEなどと同じですが、ポート番号(通常は全65535個)が240個しか割り当てられないことが最大の違いとなります。
このため「自分が使えるポート番号は?」という点の確認と、さまざまなサーバー機能の設定において「今、何番のポートをどのサービスに使っている?」という管理がちょっと大変ですね。
DS-Lite環境におけるWireGuard
IPv4 over IPv6でMAP-e(v6プラス)と並ぶ回線方式であるDS-Lite(Transix/クロスパスなど)では自宅ルーターにグローバルIPv4アドレスが付与されません。
そのため、IPv4/PPPoEやMAP-e(v6プラス)とは異なり自宅ネットワーク内にサーバーを設置し外部(インターネット側)からアクセスすることはできません。
※つまりWireGuardサーバーも構築できない
DS-Lite方式の回線サービス提供者では並行してIPv4/PPPoEも提供している事業者もあります(楽天ひかりなど)。
この場合は「DS-LiteとIPv4/PPPoEを併用する(どちらも使う)」という環境構築をしたうえで、IPv4/PPPoE回線を使って自宅サーバー(WireGuardなど)を外部公開することが可能です。
この「DS-LiteとIPv4/PPPoEを併用する」という環境構築については以下の記事を参考にしてみてください。
ホームルーター環境におけるWireGuard
工事不要で簡単に設置できるWiMAX/Softbank Air/NTTドコモhome5Gなどのホームルーターサービスが人気です。
また、ホームルーターサービスではありませんが低価格で使い放題の楽天モバイル「最強プラン」を使ってホームルーターの代わりに使う、という使い方も大人気です。
これらモバイルサービス(電波を使ったサービス)では自宅ルーターにグローバルIPv4アドレスを付与しません。
そのため、自宅ネットワーク内にWireGuardなどのサーバーを公開し外部からアクセスできる仕組みを構築することはできません。