RouterOS v7から使えるようになったWireGuard VPN を使って、リモートアクセスVPN を試してみました 。設定が少しややこしいですが、速いです!
hAP acでRouterOS v6のOpenVPN を使っていると、ローカルでも30Mbps台で、自宅DSL からだと20Mbps台なので、かなり不満でした。v6のOpenVPN がTCP しかサポートしていないというのも不利な点ですが、それにしても、OpenVPN は設定自体がなかなかトリッキーです。MTU問題で痛い目に遭いがち><
自宅VDSL (100Mbps)からセンターのサーバに収容、speedtest.net で測ってみたところ、WireGuardではv6のOpenVPN (TCP )と比較して1.5~2倍のスループット が出ました。本当は50Mbps超えて欲しかったのですが、それでもOpenVPN よりずっと快適になりました。素のVDSL で88Mbps出ている時間帯でこれ↓ (もちっとチューニングできるのでは)
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.
「そこになければないですねぇ」
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版の周波数ロックは解除できないし、当然技適 もありません。