hgot07 Hotspot Blog

主に無線LANや認証連携などの技術についてまとめるブログです。ネコは見る専。

GL.iNet Mango / OpenWrtのWireGuard VPNをLinuxで受けてみる

GL.iNet GL-MT300N-V2、別名Mango使って、Linuxサーバ相手にWireGuardVPNを張ってみたので、その紹介記事です。

要点

  • オフィシャルの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/IPsecOpenVPNでは30~35Mbps程度だったので、期待できそうです。しかもこのMango、2,000円ちょっとで買えるというから驚き!

Mango routers are cute.

キュートなMango (2個も買ったの誰よ?)

 

下準備

MangoはOpenWrtベースですが、トラベルルータとして一般の人でも使いやすいように、簡略化されたGUIが搭載されています。一応、このGUIでも任意のVPNサーバに接続設定できそうに見えるのですが、どうも入力項目が足りていない感じ。製品のコンセプトとしては、既存のVPNサービスを使うのが前提のようです。

また、Advancedメニューに入るとOpenWrtの標準GUIであるLuCIが使えますが、色々試してみたものの、うまく動きませんでした。sshCLIからいじってもダメ。

というわけで、簡単設定の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します。手元ではこんなものを入れてあります。

WireGuard関連のパッケージを追加

WireGuard関連のパッケージを追加

Network>Interfaceメニューに入り、WireGuard VPN Clientのインタフェースを追加します。名前は適当なもので構いません。

WireGuard VPN Clientのインタフェースを追加

WireGuard VPN Clientのインタフェースを追加

下図のように、必要な項目に入力していきます。

Private Keyは、クライアントの秘密鍵(client.keyの内容)です。

IP Addressesは、クライアント自身のVPNトンネルに付加するアドレスです。

まだSaveはクリックしないで!

WireGuardの設定

WireGuardの設定

Firewallゾーンの設定で、WANが含まれるゾーンを選択します。

Firewallゾーンの設定

Firewallゾーンの設定

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にしておけばよいでしょう。

WireGuardサーバ(peer)の設定

WireGuardサーバ(peer)の設定

はい、もう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を経由してから、インターネットに出ていくことになります。

 

それで速度は?

WireGuard/Mangoの速度

WireGuard/Mangoの速度

ぎゃぼ……

80Mbps程度の自宅VDSL回線からSINET経由で出て行ったものですが、50Mbps出ていますね。

参考までに、WireGuardをオフにして、MangoのNAPTだけでインターネットに出て行った場合はこんな感じ↓

NAPT/Mangoの速度

NAPT/Mangoの速度

2,000円ちょっとのハードウェアで、これぐらいのことができるようになったんですねぇ (感動)。

ちなみに、GL.iNetからは他にも色々とOpenWrtベースの製品が出ているのですが、他のモデルでも同様に使えるだろうと思います。GL-AR750 (Creta)でも同様の設定で動作確認済みです。

 

おわり