WireGuard の OpenWrt での運用

VPN と言えば、以前は OpenVPN だったが、最近のトレンドは WireGuard(言うなれば、Apache に対する nginx のような?)。先日まで OpenVPN の設定を徹底的にやり込んで納得行く状態が確立できたばかりなので、引き続き、VPN のこと自体にある程度フレッシュな知見がある今のうちにと思って、手がけてみることにした。

ソフトウェア

R7800(hnyman ビルド)では、デフォルトで wireguard-tools、kmod-wireguard、luci-app-wireguard、luci-proto-wireguard がインストールされていたので、wireguard のみ、LuCI から追加でインストールした。

鍵ペアの用意


mkdir -p /etc/wireguard
cd /etc/wireguard
wg genkey | tee privatekey | wg pubkey > publickey

/etc/wireguard/privatekey と /etc/wireguard/publickey が生成される。さらに、おまけとして presharedkey も使う場合には:


wg genpsk > presharedkey

/etc/wireguard/presharedkey を生成する。

以上のファイルのパーミッションを念のため、600 にしておく。


chmod 600 *key

ネットワークインターフェースの追加

Network > Interfaces で WireGuard 用の論理ネットワークインターフェースを追加する。プロトコルを WireGuard VPN にするのがポイント。名前は wg0 にしておいた。

OpenWrt では、LuCI では専用のメニューが用意されている OpenVPN と違い、WireGuard はこの Network の Interface としての設定ですべてを管理するようになっているようだ(つまり /etc/config/network に記載される)。

  • Private Key の欄に /etc/wireguard/privatekey の内容をコピー&ペースト
  • Listen port: 51820(標準のポート番号を使うことにした)
  • IP Addresses: 192.168.254.1/24(VPN 用の仮想ネットワークにおける、このサーバーのアドレス)
  • Firewall: lan ゾーンにアサイン
  • Peers: Public Key の欄にクライアント側(後述)の公開鍵をコピー&ペースト
  • Peers: Preshared Key の欄に /etc/wireguard/presharedkey の内容をコピー&ペースト
  • Allowed IPs: 192.168.254.2/32(VPN 用の仮想ネットワークにおける、クライアントのアドレス)

※ネットワークインターフェースを設定したら、Save & Apply だけでなく、インターフェースを Restart する必要がある。

ファイアーウォールで WireGuard 用のパケットを通す

config rule
 option dest_port '51820'
 option src 'wan'
 option name 'Allow-WireGuard'
 option target 'ACCEPT'
 list proto 'udp'

プロトコルは UDP で、ポートは 51820 を使うことにしたので、それを指定している。

以上で、サーバー(OpenWrt ルーター)側の設定は終り。

クライアント側の設定

macOS 用のクライアントアプリを使っている。Add Empty Tunnel から設定を新規作成した。

[Interface]
PrivateKey = (自動でクライアントアプリが生成して記載されている)
ListenPort = 51820
Address = 192.168.254.2/32
DNS = 192.168.254.1

[Peer]
PublicKey = (サーバー側の /etc/wireguard/publickey の内容をコピー&ペースト)
PresharedKey = (サーバー側の /etc/wireguard/presharedkey の内容をコピー&ペースト)
AllowedIPs = 0.0.0.0/0
Endpoint = (サーバーのグローバル IP):51820
  • アプリにクライアント側の公開鍵が記載されているので、それをサーバー側の Peer 情報としてコピー&ペーストして使うことになる。
  • 192.168.254.2/32 はクライアント自身の VPN 仮想ネットワーク上でのアドレスとして決めるものなので、当然これはサーバー側で使う Peer 情報と一致させなければならない。
  • 一方、AllowdIPs に、サーバー側の VPN 仮想ネットワーク上でのアドレス(ここでは 192.168.254.1/24)を指定しないのがミソ。0.0.0.0/0 とすることによって、サーバー側の LAN に自由にアクセスできるようになる。IPv6 にも対応させる場合は 0.0.0.0/0, ::/0 とする。

参考


感想

OpenVPN が安定確立できたので、WireGuard に手を出すことは不要といえば不要なのだが、「鉄は熱い内に打て」で、敢えて流れでやってみたら、いかに WireGuard がスマートかということが具体的に自己経験として熟知できると思ったからだ。デザイン的にサーバー・クライアントモデルの OpenVPN に対し、ピア to ピアモデルの WireGuard ということが、それぞれの設定を記述してみて具体的にわかった。そしてそこに起因する WireGuard の一枚上手さというか。接続のレスポンスの良さ(カーネルモジュール凄すぎ!)にもビックリ(松田優作の「なんじゃこりゃあ!」レベル)。これは確かに、OpenVPN に代って次代のスタンダードになると思う。

コメント

このブログの人気の投稿

OpenWrt での Wi-Fi 設定

シークエンスパパとも 本物の霊能力

シークエンスパパともの先見の明