Tech Note Plus

PC から Azure まで幅広い伝道を目指してます

OpenWrt で WireGuard (Point to Site) を試す!

この記事では OpenWrt の WireGuard の P2S 接続に関する設定を記載しています。

WireGuard に求める要件

やりたいこと

私の環境では、To Azure = strongSwan、To 実家 = OpenVPN と既に二つの VPN ソフトウェアを利用してます。 運用面の考慮からこれ以上 VPN ソフトウェアを増やすわけにはいかないので、必然的に To 自宅は OpenVPN になってしまいます。

そのため、WireGuard は現時点では採用の予定がないですが、VPN ソフトウェアとしては先進的なものとも聞いているので試すだけ試して将来に備えます。

OpenWrt における WireGuard の実装方法

OpenWrt では追加のモジュールを導入して設定をすることで、WireGuard を構成できます。 OpenVPN や strongSwan と異なって複数のファイルに分かれて設定が保存されることはなく、インターフェースの設定と統合されています。また、証明書作成以外は GUI ですべて行えます。

WireGuard の設定構造

これは OpenWrt に限ったことではありませんが、WireGuard は「サーバー」と「ピア」という設定構造を持っています。 「サーバー」は自分自身の情報であり「ピア」は接続先の情報となり、これを相手と対にして持つことで接続を行う仕組みです。つまりこうです。

  • 「サーバー」は相手にとっての「ピア」
  • 「ピア」は相手にとっての「サーバー」

この情報 (接続先や証明書等) が一致したときに始めて接続されます。

WireGuard の設定方法 (全体で一回のみ)

WireGuard、管理画面(日本語化含む)
  1. [システム]-[ソフトウェア] フィルターwireguard-tools と入力し、インストール を押します。
    ※ 一度 OS を再起動してしまうとパッケージリストの取り直しが必要なので、その場合は「リストを更新..」を実施してください。
  2. 依存関係の確認が行われるので インストール を押します。
  3. パッケージが読み込まれるので、閉じる を押します。
  4. 1-3 を繰り返します。パッケージ名は luci-app-wireguard です。最近のアップデートなのか言語ファイルは本体のモジュールのインストール時に Suggest ってでて既定でチェック済みなので一緒にインストールしてくれるようになったようです。
  5. インターフェースプロトコル追加となるので再起動します。(これ、再起動以外でもなんとかしたいな・・・)

WireGuard の設定方法 (待ち受けサーバーごとに一回)

証明書の作成
  1. SSH で OpenWrt に接続し、以下を入力します。

    umask go=
    wg genkey | tee wg0server.key | wg pubkey > wg0server.pub
  2. その後、以下を続けて入力して wg0server.key、wg0server.pub の値を控えておきます。

    cat wg0server.key
    cat wg0server.pub
インターフェースの登録
  1. [ネットワーク]-[インターフェース]-[インターフェース] インターフェースを新規作成を押します。
    ※ 画面は作成後ですので本来であればまだ wg0 は存在しない状態です。
  2. 名前:wg0 or wgxプロトコル:WireGuard VPN として、インターフェースを作成を押します。
  3. [一般設定] 以下の設定を行います。

    設定項目 設定値
    秘密鍵 wg0server.key の中身の文字列
    公開鍵 wg0server.pub の中身の文字列
    リッスンポート 任意の数値 (控えておく)

  4. [ファイアウォール設定] ファイアウォールゾーンの作成または割り当てlan に変更し、保存 → 保存&適用を押します。

通信の許可
  1. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール] 追加を押します。

  2. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール]-[一般設定] 以下の設定を行います。

    設定項目 設定値
    名前 定義の名前。わかりやすく
    プロトコル UDP
    送信元ゾーン wan
    宛先ゾーン バイス (入力)
    宛先ポート 前項で定義したものと同一の必要がある

  3. [ネットワーク]-[ファイアウォール]-[トラフィック・ルール]-[詳細設定] アドレスファミリの制限IPv4 のみに変更し、保存 → 保存&適用を押します。

WireGuard の設定方法 (接続クライアント一台ごとに一回)

証明書の作成
  1. SSH で OpenWrt に接続し、以下を入力します。

    umask go=
    wg genkey | tee wg0client1.key | wg pubkey > wg0client1.pub
    wg genpsk > wg0client1.psk
  2. その後、以下を続けて入力して wg0client1.key、wg0client1.pub、wg0client1.psk の値を控えておきます。

    cat wg0client1.key
    cat wg0client1.pub
    cat wg0client1.psk
ピアの設定
  1. [ネットワーク]-[インターフェース]-[インターフェース]-[wg0 (編集)]-[ピア] ピアを追加を押します。
  2. 以下を入力の上、Generate configuration... を押します。

    設定項目 設定値
    説明 接続クライアントの識別のための名前。わかりやすく
    公開鍵 wg0client1.pub の中身の文字列
    秘密鍵 wg0client1.key の中身の文字列
    事前共有鍵 wg0client1.psk の中身の文字列
    許可された IP クライアント側が VPNトンネル内で利用する IP (控えておく) ※
    許可された IP のルート チェック
    永続的なキープアライブ 25

    ※ /32 でも /24 のようにレンジでもよいですが、クライアント側にこの後定義する仮想インターフェースのアドレスはここと一致させる必要があります。

  3. 画面右下の文字列を一度クリップボードにコピーし、# ListenPort not defined. の行を以下の通りに書き直して再度控えておきます。その後、Back to peer configuration を押します。

    [Interface]
    PrivateKey = WPaqqvOSlOn0hqdp5cawdjVlw7ejgo2BRKrLcvldR08=
    Address = 許可された IP で控えた値のレンジ内の IP   
       
    [Peer]
    PublicKey = Wy0q+wRXH5hP6e95X78Zh3PmQHhEHLarfP2gsBuwECA=
    PresharedKey = zpI9as7mLeRWKWaN792NRdYUiMzomzaa9LJyXhwWPJY=
    AllowedIPs = 0.0.0.0/0, ::/0 ※
    Endpoint = xxx.xxx.xxx.xxx:65432
    PersistentKeepAlive = 25

    ※ ちなみに、この例ですとデフォルトルートが WireGuard に向いているため、VPN に関係のない通信まで VPN 経由で通信する設定になります。もし、限定したい場合は、192.168.1.0/24 のように VPN でつなぎたい先のアドレス空間に限定した方がよいでしょう。

  4. 保存 → 保存 → 保存&適用を押します。

WireGuard クライアントの設定 (Windows の場合)
  1. 以下の URL にアクセスしてクライアントモジュールを端末にダウンロードして実行します。特に画面などもなく。 www.wireguard.com

  2. アプリケーションを起動後、空のトンネルを追加を押します。

  3. 名前にわかりやすい定義名を入力後、入力フィールドに前項で控えた値をコピー&ペーストし、トンネルを通らないトラフィックのブロック (キルスイッチ) のチェックは外した上で、保存を押します。

    キルスイッチとは、VPN が切断された場合にすべての通信も一緒に切断することで VPN 無しでインターネット等に接続しないようにする保護機構のことです。

  4. 有効化を押せば VPN に接続され、無効化を押せば VPN から切断されるようになります。

設定のための参考サイト

設定に当たっては、以下の情報を参考にしました。

openwrt.org

OpenWrt の WireGuard 設定を終えて

こうして OpenWrt を使って WireGuard でリモートアクセス可能になりました。確かに接続も早いのでこっちを使いたい・・・。


Note
・ 当ブログは個人主催であり、ブログ中のすべての情報は個人的な観点となります。
・ 情報については正確な内容となるよう努めますが、完全性や正確性、有用性、安全性、最新性について一切保証できかねます。