GL.iNet GL-MT300N-V2、別名Mango使って、Linuxサーバ相手にWireGuardでVPNを張ってみたので、その紹介記事です。
要点
- オフィシャルのFirmware (現在OpenWrt 18.06ベース)では、Linux相手の設定は無理そう。
- MangoにはOpenWrtのファームが焼けるので、そちらを使う。(今回、無線LAN機能は使わない用途)
- カタログ値の50Mbpsは本当。アクセラレータとかない、こんなちっちゃな筐体で、ご立派!
さて、このMangoですが、フリーWi-FiでもVPNで安全な通信ができるという触れ込みで、トラベルルータとして売られているものです。これ、中身がOpenWrtベースなので、前の記事に書いたように、色々と遊べそうです。
Mangoのウリの一つに、他のVPN方式よりも効率がよいとされる、WireGuardの対応が挙げられます。使ったことのある人なら分かると思いますが、OpenVPNは遅いし、高速化が難しいプロトコルです。L2TP/IPsecやIKEv2など、要するにIPsecを使うものは、CPU処理ではOpenVPNより若干速い程度にとどまります。IPsecのアクセラレータを搭載した機器なら、かなりの速度が出せますが、それなりにいいお値段がします。
さて、比較的新しいプロトコルであるWireguard、Linuxに標準で組み込まれているし、OpenWrtでも対応していて、2020年現在、気軽に使えるようになっています。GL.iNetのカタログによると、MangoのWireguardの性能は50Mbps程度とのことです。MikroTik hAP acのL2TP/IPsecやOpenVPNでは30~35Mbps程度だったので、期待できそうです。しかもこのMango、2,000円ちょっとで買えるというから驚き!
下準備
MangoはOpenWrtベースですが、トラベルルータとして一般の人でも使いやすいように、簡略化されたGUIが搭載されています。一応、このGUIでも任意のVPNサーバに接続設定できそうに見えるのですが、どうも入力項目が足りていない感じ。製品のコンセプトとしては、既存のVPNサービスを使うのが前提のようです。
また、Advancedメニューに入るとOpenWrtの標準GUIであるLuCIが使えますが、色々試してみたものの、うまく動きませんでした。sshでCLIからいじってもダメ。
というわけで、簡単設定のGUIとはおさらばして、サクッとOpenWrtの最新版ファームウェアに入れなおすことにします。執筆時点で19.07.5が最新版です。(前の19.07.4では、上りがパケ詰まりして、使い物になりませんでした)
ちなみに、Mangoのオフィシャルのファームウェアはこちらからダウンロードできます。
OpenWrtプロジェクトからのファームウェアはこちらから。
LAN側のアドレスが、Mango標準の192.168.8.1ではなく、192.168.1.1になるようです。オフィシャル版に戻したければ、本体のリセットボタンを使って、ファクトリーリセットからやり直せばOKです (RTFM……おやおや、口が悪い)。
初期設定といっても、Mangoのアドレスにブラウザでアクセスして表示されるLuCIで、管理者パスワードを付けて、使わない無線LAN機能をオフにする程度なので、面倒なことはないです (逸般人を除く)。
Linux側WireGuardサーバの設定
今回openSUSE 15.1を使っていますが、WireGuardのパッケージが提供されているLinuxディストリビューションなら、どれでもよいでしょう。
最初に公開鍵・秘密鍵ペアを作りますが、Mangoの利用者が自分自身なので、クライアント用の鍵ペアもサーバ上で作ってしまいます。.keyが秘密鍵、.key.pubが公開鍵です。
# cd /etc/wireguard
# touch server.key
# chmod og-r server.key
# wg genkey > server.key
# wg pubkey < server.key > server.key.pub
# wg genkey | tee client.key | wg pubkey > client.key.pub
/etc/wireguard/wg0.conf を作ります。wg0は適当な名前でOK。このファイルはchmod og-rしておくこと。中身はこんな感じです。<.>が適宜変更する部分。
[Interface]
PrivateKey = <サーバの秘密鍵>
Address = 172.30.4.1/24
ListenPort = 51820
[Peer]
PublicKey = <クライアントの公開鍵>
AllowedIPs = 172.30.4.34/32
この例では、VPNトンネルのサーバ側のアドレスを172.30.4.1、サブネットを24bit、クライアント側のアドレスを172.30.4.34としています。WireGuardでは標準で51820/udpを使うので、ポート番号にその値を入れてあります。
本当にこれだけなんです、信じてください!><
Linuxの環境によってFirewallの設定が様々なのが面倒くさいところです。各自の環境に合わせて、クライアントのアドレスに対してポート51820/udpを開けましょう。
クライアントのトラフィックをすべてサーバ経由でインターネットに通したい場合は、IP ForwardingとIP Masqueradeも有効にしておかないといけません。これらの設定は、Linux箱をNAPTルータとして設定するときと同じです。
WireGuardのサーバを立ち上げて、ついでにシステムブート時にも立ち上がるようにしておきます。
# wg-quick up wg0
# systemctl enable wg-quick@wg0
ip a や ip route を実行して、WireGuard用のインタフェース(wg0)や経路ができていることを確認します。引数無しでwgコマンドを実行すると、コネクションの状態が見えます。
Mango側WireGuardクライアントの設定
OpenWrtのファームウェアを入れただけでは、WireGuard関係のパッケージが入っていません。System>Softwareメニューで、Update lists...をクリックすると、しばらくしてパッケージリストが更新されます。wireguardをキーワードに検索してみると、関連のパッケージが並ぶので、それっぽいもの()をInstallします。手元ではこんなものを入れてあります。
Network>Interfaceメニューに入り、WireGuard VPN Clientのインタフェースを追加します。名前は適当なもので構いません。
下図のように、必要な項目に入力していきます。
Private Keyは、クライアントの秘密鍵(client.keyの内容)です。
IP Addressesは、クライアント自身のVPNトンネルに付加するアドレスです。
まだSaveはクリックしないで!
Firewallゾーンの設定で、WANが含まれるゾーンを選択します。
Peersのタブの中で、サーバを追加します。
Public Keyはサーバの公開鍵(server.key.pubの中身)をコピペします。
Preshared Keyはここでは不要。
Allowed IPsに、トンネルのサーバ側のアドレスを入力します。Mangoに接続された端末から、すべてのトラフィックをVPN側に流したい場合は、ここに0.0.0..0/0を追加します。Route Allowed IPsにチェックを入れます。これで、WireGuard VPNが接続された状態では、default routeがVPN側に切り替わりることになります。
Endpoint Portは、サーバがListenしているポート番号です。
Persistent Keep Aliveは、お奨めの25にしておけばよいでしょう。
はい、もうSaveをクリックしていいですよ!
Mangoにsshでログインして、/etc/config/networkを除いてみると、こんな感じの行が追加されているはずです。
config interface 'wgvpn'
option proto 'wireguard'
option private_key '<秘密鍵>'
list addresses '172.30.4.34/32'
config wireguard_wgvpn
option description 'wgvpn'
option persistent_keepalive '25'
option endpoint_port '51820'
option route_allowed_ips '1'
option public_key '<サーバの公開鍵>'
list allowed_ips '172.30.4.1/32'
list allowed_ips '0.0.0.0/0'
option endpoint_host '<サーバのIPアドレス>'
WireGuardのクライアント機能が立ち上がっていれば、wgコマンドを引数無しで実行して、何か表示されるはずです。
VPNトンネルのサーバ側アドレスに対してpingを実行し、応答を確認します。
サーバ側からも同様に、クライアント側アドレスに対してpingを実行し、応答を見ます。双方が正しく応答するようならば、VPN接続が正しく確立されています。この状態でrouteを見ると、defaultがwgvpnデバイスを向いているはずです。
どんな経路なの?
WireGuardはL3 VPNで、L2はできません。
当記事の設定によると、Mangoに接続された端末は、MangoのDHCPサーバによってプライベートアドレスを振られます。端末のトラフィックはMangoのNAPTを経由してから、VPNトンネルに流れます。サーバ側で再度NAPTを経由してから、インターネットに出ていくことになります。
それで速度は?
ぎゃぼ……
80Mbps程度の自宅VDSL回線からSINET経由で出て行ったものですが、50Mbps出ていますね。
参考までに、WireGuardをオフにして、MangoのNAPTだけでインターネットに出て行った場合はこんな感じ↓
2,000円ちょっとのハードウェアで、これぐらいのことができるようになったんですねぇ (感動)。
ちなみに、GL.iNetからは他にも色々とOpenWrtベースの製品が出ているのですが、他のモデルでも同様に使えるだろうと思います。GL-AR750 (Creta)でも同様の設定で動作確認済みです。
おわり