高速で設定が簡単なVPNとしてWireGuardがでています。これまでは自宅のQNAP NASでOpen VPN を利用していましたが、xubuntuのバージョンが22.04に上がってから、接続できない事態に陥ったため回避策を色々検討していたところ、QNAPのNASにWireGuardが標準で準備されていることが判明。設定してみると以外に簡単にできたので、備忘録もかねて記録しておきます。
WireGuardとは
フリーかつオープンソースのルーティング又はブリッジで安全なポイント・ツー・ポイント接続を作成するための技術であるVirtual Private Network (VPN) の実装であり、アプリケーション及び通信プロトコルである。Linuxカーネル内のモジュールとして実行され、IPsecやOpenVPNよりも優れた性能を目指している。WireGuardはJason A. Donenfeldによって書かれ、GNU GPL v2の下で配布されている。~中略~
WireGuardは鍵共有(英語版)にはCurve25519、暗号化にはChaCha20、データ認証(英語版)にはPoly1305、ハッシュテーブル鍵にはSipHash(英語版)、ハッシュにはBLAKE2sを利用する。ネットワーク層のIPv4及びIPv6の両方に対応し、4in6(英語版)及び6in4(英語版) (カプセル化) にも対応している。
https://ja.wikipedia.org/wiki/WireGuard
WireGuardは4000行くらいのコード(OpenVPNなどの1%程度)で書かれており、最新の暗号方式を利用しているため非常に単純で高速なVPN接続が可能になっています。Linuxカーネルと統合したため、OSの標準機能として使えます。また、UDPで通信で行うことでパフォーマンスを上げてます。
しかし、まだ開発されて日も浅く発展途上というところで若干気になるところもありますが、今後の成長を考えると十分利用できるものだと思います。
設定について
設定イメージ
設定イメージを図に表しています。IP等は適宜、読み替えてください。
設定のポイント
設定は単純ですが、最初は用語等がごちゃごちゃになってわからなくなりますので、設定のポイントをまとめました。
- 厳密にはサーバーとクライアントの違いはありません。Peer to Peer接続です。
- 便宜上、サーバー(QNAP NAS)とクライアント(接続する端末)に分けます。
- 秘密鍵(Private key)と公開鍵(Public key)を両方で生成し、公開鍵(Public key)を交換します。
※接続されるサーバー側(QNAP NAS)では、すべてのクライアント(接続する端末)の公開鍵を所持します。 - listen(リッスン)するポート番号(デフォルトで51820)はサーバー(QNAP NAS)で指定し、UDPを利用して通信します。そのため、Firewall等でもUDPのポート番号の通信を許可する必要があります。
- VPNのIPアドレスはホスト毎(サーバー、クライアント毎)に固定で割当てる必要があります。
用語
- Interface(インターフェース)
設定しようとしているサーバー、或いはクライアントの接続点(の設定)
- Peer(ピア)
接続しようとしている相手方(の設定)
Peer とは
ある通信プロトコルでデータを交換する2台の装置の対のこと。または、片方の装置から見た相手側の装置のこと。
https://eow.alc.co.jp/search?q=peer
設定手順
サーバーの設定
QNAPのQVPNでWireGuard VPNサーバーを有効化し、必要な項目を入力する。以下がサーバーのInterface(インターフェース)設定です。
- サーバー名:適当な名称(QWGSV01など)
- プライベートキー:キーペアの生成ボタンで自動生成される
- パブリックキー:キーペアの生成ボタンで自動生成される
- IPアドレス:サーバーに割り当てるIPアドレス(198.28.7.1/24)
- リッスンポート:サーバーと通信するためのUDPポート番号(デフォルトで51820)
接続する端末(クライアント)での設定後に追加するピア(Peer)
接続する端末(クライアント)にWireGuardを入れて秘密鍵、公開鍵を生成してから、サーバー側(QNAP NAS)で、ピアを追加し、接続する端末(クライアント)の公開鍵を設定します。
ピアテーブルに、VPNへ接続する端末(クライアント)を設定する
事前共有キーは必要に応じて、エンドポイントは空白で構いません。
参考情報
Allowed IPs(許可されているIP)の設定について
上記画面では、許可されているIP(そのまんまですが・・・)と訳されています。そこ(サーバー側のピア設定の中)には、クライアントのVPN用IPアドレスが入力されています。
次のクライアントの設定で記載しますが、クライアント(接続する端末)側でもAllowed IPsを設定する箇所があり、例えば、VPNネットワーク(198.28.1.0/24)と家庭内のローカルネットワーク(192.168.0.0)を設定すれば、VPN接続した時に、ローカルネットワークへも通信できるようになります。
そして、Allowed IPsに0.0.0.0/0を指定することで、Web閲覧などのすべての通信をVPN経由にして通信を暗号化することができます。
簡単に書きましたが、ここのところは奥が深そうなので、きちんと設定しないとセキュリティ上のリスクになりそうです。
QNAP NAS上のWireguradのパス
QNAP NAS上のサーバー側の設定はQVPNアプリ上で簡単に設定できます。実際のディレクトリを確認すると、うちの環境では下記のディレクトリに格納されていることがわかりました。
/mnt/HDA_ROOT/.config/qvpn/wireguard
sshで接続し、wireguardのディレクトリを確認すると以下のような構成になっています。
[/mnt/HDA_ROOT/.config/qvpn/wireguard] # ll
total 32K
drwxr-xr-x 2 admin administrators 4.0K 2022-11-13 09:37 ./
drwxr-xr-x 3 admin administrators 4.0K 2022-11-11 18:06 ../
# 設定した事前共有鍵(Pre-sharedkey)ファイル(ピアの設定ファイルに記載はない)
-rw-rw-rw- 1 admin administrators 44 2022-11-13 09:35 peer_psk1
-rw-rw-rw- 1 admin administrators 44 2022-11-13 09:36 peer_psk2
# 追加したピアの設定ファイル
-rw-rw-rw- 1 admin administrators 435 2022-11-13 09:36 server_peers.conf
-rw-rw-rw- 1 admin administrators 44 2022-11-13 09:36 tmp_server_privatekey
-rw-rw-rw- 1 admin administrators 45 2022-11-13 09:36 tmp_server_publickey
# VPNインタフェース(サーバー側)の設定ファイル
-rw------- 1 admin administrators 508 2022-11-11 18:06 wg0.conf
※adminユーザでないとアクセス出来ず、wgコマンドの実行等はできません。そのため、adminユーザを無効化していたら、有効化してssh接続する必要があります。
QNAP NASでの事前共有鍵(pre-sharedkey)の設定方法
わざわざQNAP NASでする必要性はないかもしれませんが、一応できることは確認しましたので記載しておきます。
まずは、adminユーザーでQNAP NASへssh接続します。
# wg genkey | sudo tee /etc/wireguard/cl1_pre.key
※事前共有鍵の内容が出力される
上記コマンドで事前共有鍵(pre-sharedkey)を作成し、サーバー側のピアに入力します。後で、その事前共有鍵(pre-sharedkey)をクライアントのピアにも設定する必要があります。
※後で、NASのディレクトリを見ると設定した事前共有鍵(pre-sharedkey)がファイルで作成されていたので、事前にteeコマンドでファイルに吐き出す必要はないかもしれません。
次回は、クライアント(接続する端末)の設定についての手順を説明します。