hgot07 Hotspot Blog

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

RouterOS v7.1beta6のWireGuard VPNを試す

RouterOS v7から使えるようになったWireGuard VPNを使って、リモートアクセスVPNを試してみました。設定が少しややこしいですが、速いです!

hAP acでRouterOS v6のOpenVPNを使っていると、ローカルでも30Mbps台で、自宅DSLからだと20Mbps台なので、かなり不満でした。v6のOpenVPNTCPしかサポートしていないというのも不利な点ですが、それにしても、OpenVPNは設定自体がなかなかトリッキーです。MTU問題で痛い目に遭いがち><

自宅VDSL (100Mbps)からセンターのサーバに収容、speedtest.net で測ってみたところ、WireGuardではv6のOpenVPN (TCP)と比較して1.5~2倍のスループットが出ました。本当は50Mbps超えて欲しかったのですが、それでもOpenVPNよりずっと快適になりました。素のVDSLで88Mbps出ている時間帯でこれ↓  (もちっとチューニングできるのでは)

Speed via WireGuard/VDSL.

Speed via WireGuard/VDSL.

 

やりたいこと

  • 高速なリモートアクセスVPNを実現
  • hAP acをLinuxサーバに収容 (サーバ側は設定済み)
  • hAP acのすべてのトラフィックをサーバ側からインターネットに出す。今回の目的は、マネージドな無線LAN基地局を作ることなので、要するに、利用者の無線LANトラフィックをすべてサーバ側から出すようにしたい (基地局設置場所のオーナからトラフィックを保護したい)。
    (= default routeをWireGuard側にする)

 

WireGuardはいいぞ

VPNにも色々ありますが、メジャーどころのIPsecは設定がややこしかったり、接続に相性問題が青々としていたりで、必ずしも使いやすくはありません。リモートアクセスVPNならL2TP/IPsecがメジャーでしょうが、設定がさらに面倒です。あと、アクセラレータがないと、CPUによる処理では速度が出ません。Linuxをサーバにしてちょっと高級な設定をしたい用途では、速度面で不利です。

OpenVPNは、相性問題はないのですが、経験上MTU問題が厄介です。あと、プロトコル上、アクセラレータを作りにくいらしく、CPUパワーがないとショボショボの性能になります。自分の用途では、超小型IoT機器でVPNを使いたいので、まず無理ですね。

さて、WireGuardはというと、CPUによる処理でも効率が高く、しかもサーバ/クライアントとも設定が楽という……、これで人気が出ないはずはありません。実際、多くのプラットフォームに実装されています。すぐにも使いたいのですが、残念ながらRouterOS v6には搭載されず、v7の正式版がなかなか出ないという状況。ぐぬぬ

ところで、後に書きますが、WireGuardも全方位で使いやすいというわけではないので、過度な期待はしないでください。

 

RouterOS v7のWireGuard設定

設定ガイドはここ。本記事の執筆時点で、拠点間接続の例しか書かれていないので、色々と悩むことに……。
10

help.mikrotik.com

hAP acをv7.1beta6にアップグレードして、WireGuard関係のメニューが生えてきたところで、「後は楽勝でしょ!」と思ってしまったのが運の尽き……。最初からこのドキュメントに出会っていれば、少しは楽だったのです。

Linuxでwg0.confをいじったり、OpenWrtのLuCIでWireGuardの設定をしたことのある人は、あれ?と思うかもしれません。RouterOSのWireGuardの設定では、クライアント側のIPアドレスを設定する場所が見当たりません。これ、ドキュメントにあるとおり、WireGuardメニューないしCLIでインタフェースを生やした後、/ip/address の方で手作業でIPアドレスを付与しないといけませんIPアドレス入力欄がWireGuardメニューにないのが落とし穴です。

あと、WireGuardでは、両側のピアが入るローカルサブネットとIPアドレスをあらかじめ決めておく必要があります。クライアント側にDHCP的にアドレスを振るような仕組みは(今のところ)ないようです。これが、多数の利用者を対象にしたリモートアクセスVPNに使いにくいところ。

例えば、サブネットを 172.16.1.0/24、サーバ側アドレスを172.16.1.1、クライアント(hAP ac)側を172.16.1.2にする場合、以下の操作でwireguard1インタフェースが生えて、アドレスが付きます。

> /interface/wireguard/add listen-port=51820 name=wireguard1
> /ip/address/add address=172.16.1.2/24 interface=wireguard1
> /ip/route/add dst-address=172.16.1.0/24 gateway=wireguard1

とりあえず、初見でハマったのはこれぐらいです。あとは、クライアント (hAP ac) の鍵ペアと、サーバの公開鍵、IPアドレス、ポートを設定して、以下のようになればOK。

> /interface/wireguard/print detail
Flags: X - disabled; R - running
0 R name="wireguard1" mtu=1420 listen-port=51820
private-key="<クライアントの秘密鍵>"
public-key="<クライアントの公開鍵>"

> /interface/wireguard/peer/print detail
Flags: X - disabled
0 ;;; wgsrv
interface=wireguard1
public-key="<サーバの公開鍵>"
endpoint-address=<サーバのIPアドレス> endpoint-port=51820
current-endpoint-address=<(ここは自動表示される)> current-endpoint-port=51820
allowed-address=172.16.1.0/24 persistent-keepalive=25s rx=0 tx=0

注: WebFigのWireGuard peer設定でallowed-addressを入力しても、値が入らないことがありました。その場合はCLIの方で設定しましょう。

以上でWireGuardが接続できるはずです。サーバ側から ping 172.16.1.2、クライアント側から ping 172.16.1.1 すれば、互いに応答があるはずです。IF ない GOTO 10

 

WireGuardをdefault routeにする設定

今回の目的である、hAP acに収容した端末のトラフィックをすべてWireGuard側に流し、LANには通さないようにする、そのような設定を行います。

手っ取り早く、WireGuard peerの設定メニューで Add Default Route のチェックボックスを探すわけですが……、ない!_('、3」∠)_

WireGuard peer config.

WireGuard peer config.

「そこになければないですねぇ」

OpenVPN-clientの設定には普通に存在する Add Default Route が、どういうわけかWireGuardにはありません。

仕方がないので、手探りで……。必要な設定は以下のとおり。

  • WireGuardで 0.0.0.0/0 を受け付けられるようにする。
  • サーバのIPアドレスの経路を、hAP acが接続されているLANに向ける (重要)
  • IP routeの設定で 0.0.0.0/0 すなわち default を wireguard1 に向ける。
  • wireguard1に対してmasqueradeを有効にする。
  • 元からある default route を外し、ether1 に流れないようにする。
    (metricを増やすだけでは不十分。default routeを外しにくいならmasqueradeを切る方法もある)

ぇ、簡単?……やってみそ😏 経路の設定・解除方法は、分かりますよね?

wireguard1のallowed-addressを変更する必要があります。

> /interface/wireguard/peers/set 0 allowed-address=0.0.0.0/0

masqueradeは、要するにNAPTですね(コラ)。(サーバ側のNAPTは設定済みと仮定)

こんな感じになるように、wireguard1に対してmasqueradeを設定すればOK。

> /ip/firewall/nat/print
Flags: X - disabled, I - invalid; D - dynamic
0 X ;;; defconf: masquerade
chain=srcnat action=masquerade out-interface=ether1

1 I ;;; lte1 not ready
chain=srcnat action=masquerade out-interface=*A log=no log-prefix=""

2 chain=srcnat action=masquerade out-interface=wireguard1 log=no
log-prefix="" 

 

さて、今回ハマったのがこれ……、トンネルの外側でサーバに直接つながる経路の設定です。サーバへの経路を ether1 に向けるだけでしょと思ったそこの私、ハズレです。

gateway=ether1 に設定すると、wireguard1インタフェースのRx表示がピクリとも動きません。仕方がないので、ether1の代わりに、hAP acを接続したLANのゲートウェイIPアドレスを指定してみます。動きました!

ただ、このように固定アドレスを設定すると、hAP acを持ち運んであちこちのDHCP付きLANにつないで使うといったことができなくなります。というわけで、問題は半分しか解決していません。

MikroTikさん、WireGuardにも Add Default Route ☑ を付けてくださいよ~ 🙏

 

課題

上記のとおり、default routeの扱いに少し難があるので、早急に改善してもらいたいところです。

hAP acをオフにして、再度オンにしたときに、WireGuardの接続が回復しないことがあります。うまく復活することもあります。想定している用途では、接続が回復しないのは致命的です。サーバ側で一度WireGuardをdown/upすると復活できるのですが、他のクライアントも巻き込んでしまう問題があります。解決法が分かる人がいたら、ぜひ教えてください。

 

[2021/8/15追記]  後継のhAP ac2にもv7.1beta6を入れることができたので、同様の設定でWireGuardを試してみました。こちらはなんと80Mbps程度出ました。acがMIPS、ac2がARMで、OpenVPNの性能はac2の方が若干低かったのですが、意外な結果です。残念なことに、現時点でhAP ac2には技適がなく、肝心の無線LANを使用できません。

 

おわり

 

P.S.
何度でも書きますが、hAP acに限らず無線LAN機能のあるものは、US版を掴まないように十分注意しましょう。US版の周波数ロックは解除できないし、当然技適もありません。