OpenWrtをスイッチ化してWireGuardを入れた

この記事は、SLP KBIT AdventCalendar2021 24日目の記事です。

多くのメンバーが面白い記事を書いてくれています。ぜひどうぞ。

adventar.org

さて、今年のアドカレでは、最近勉強し始めたRustでシェルでも作ってみようかな、と考えていました。
しかしながら、師走というだけあり、色々と忙しくなってしまい、、できませんでした!(また今度そのうちやります)

ということで、過去に下書きとして残していた記事(というよりメモ)を整えて、今年の僕のアドカレ担当分とします。

作業用BGMに毎年恒例の薪燃え見てます。ずっと見てられる。

live.nicovideo.jp


この記事は、「自宅のOpenWrtルーターをWireGuard用のサーバーとして使っていたが、2重ルーターになってたのとメインのルーターの物理ポートが足りなくなったのでVPNサーバ兼スイッチングハブにした」という内容です。

こんな感じになる:

f:id:yassi-htn:20211225010321p:plain
構成図

使用するルーター: Buffalo WZR-HP-AG300H
OpenWrtのバージョン: OpenWrt 21.02.1

コマンドラインではなく、LuCI(Webインタフェース)を使って操作していきます。

IPv6は使用していません。

switch化

WANポートのインタフェースを消すので、OpenWrtのLANポートと操作用PCをLANケーブルで繋いで作業を行います。

事前準備として、メインルーターとOpenWrtはこの時点では繋がないでおきます。
また、パスワードの設定は済ませておきます。(設定していないと、IPアドレスが変わったときに認証されないようです)

作業場所: Network -> Interfaces

  1. WAN, WAN6を消す
  2. LANをEdit
    • General Settingsタブで
    • Advanced Settingsタブで
      • Use default gatewayにチェックが付いていることを確認する
      • DNS serverを適当に決めたり決めなかったり
    • FW無効化
    • DHCP ServerタブのGeneral SetupタブでIgnore interfaceにチェックを付ける
  3. Networks -> Devicesタブのbr-lanの設定でEnable IPv6のチェックを外してIPv6無効化
    • br-lanのBridge portsにはeth0.1とeth1を指定
  4. Save & Apply
  5. カウントダウンが開始する。残り70sぐらいになったら設定が適用されていると思われるので、以下の操作をカウントダウン中に行う(0になれば失敗します。もう一度チャレンジしましょう)
    1. PCからLANケーブルを抜く
    2. メインルーターとopenWRTのLANポートをLANケーブルでつなぐ
    3. 1.で抜いたLANケーブルをPCに挿し直す
    4. メモしておいたIPアドレスにアクセスする

設定が反映されインターネットに接続できていることを確認できればOK

WireGuardを入れる

WireGuardとは、シンプルでセキュアなVPNです。

  • UDPを利用し、L3トンネルを実現します。
  • 公開鍵を使って認証したPeer同士で通信が可能になります。

作業場所: System -> Software

  1. Update lists... を押してパッケージリストをアップデート
  2. 次のパッケージをインストールします: luci-app-wireguard, luci-proto-wireguard
  3. luci-app-wireguard を入れたら luci-proto-wireguard も一緒に入るかも。
  4. System -> Reboot から 再起動
  5. Networks -> Interfaces -> Add new interface でwireguard用のインタフェースを作成する
    • インタフェース名: wg0
    • protocol: WireGuardVPN
    • port: 51820 (なんでもいい)
    • FW: lanにしてたがなんでもいいと思う
    • Peers: 以下の事項に注意しながら適当に埋める。
      • Allowed_IPsにはVPN接続時に振られるIPアドレスを書く。
      • Route Allowed IPsはチェックを入れるのでよい。
      • Endpoint Hostは、後述するWireGuard用に作成するインタフェースのIPアドレスを指定。使うネットワークのアドレスなので、ここで決めてしまう。
      • Endpoint Portは51820。
      • Persistent Keep Aliveは25にした。

こんな感じになる:

f:id:yassi-htn:20211224225517p:plain
wg0 peer example settings

作成後に設定を変えるときは、Editで編集してSave&ApplyしてインタフェースのRestartをする。

メインルータの設定

ポート変換などの機能で OpenWRTのLANインタフェースのIPUDPポート51820に インターネットから来るUDP 51820 のトラフィックを投げるように設定する。

Client Peerの設定

クライアントにあたるPeerの設定を書く。
Windowsなら、クライアントソフトのAdd Tunel -> Add empty tunnelで作成し、Editで書いていく。

[Interface]
PrivateKey = <PrivateKey>
ListenPort = 51820
Address = wg0のAllowedIPs/32
DNS = <DNS>

[Peer]
PublicKey = <PubKey>
PresharedKey = <PSK>
AllowedIPs = 0.0.0.0/0
Endpoint = <dnshostname>:51820

client peerのpubkeyを先ほどのwg0インタフェースのpeerに登録する。

wgwan用トラフィックルールの作成

WGはどうもNATでないと動作しない(WANに来たトラフィックを見ている?)みたい?なので、wg0がリッスンするNATデバイスをつくってやることにする。

作業場所: Network -> Firewall

Add からゾーン(ここでは wgwan とする)を作成する。
これらのforwardingsなどの設定は、既存のwanゾーンに合わせている。
ただし、wgwanのForwardはAcceptにしている。(もしかしたらrejectでいいかもしれない)

作成したら、Traffic Rules タブに移動する。

Addからルールを作成する。

Incoming IPv4, Protocol UDP, From wgwan To this device, port 51820, Accept input

メモによると、このままだとルータに有線接続した際にipでluciにアクセスできなかったとのことで allow WAN -> device:80,443 とするルールを追加していました。

wg0用NATインタフェースの作成

作業場所: Network -> Interfaces

  • Add new interface でインタフェースを作成
    • Protocol: Static address
    • Device: br-lan
    • IPv4 address: wg0で作成したPeerのEndpoint Hostで決めたIPアドレス
    • netmask, gateway, bloadcast: メインルーターになるように。冒頭で設定したLANインタフェースと同じ。
    • DHCP Serverタブで、DHCPサーバーを使用する。設定はデフォルトでおk。
    • Firewallで、先ほど作成した wgwan を指定する。

Phew!
以上です。

当時の記憶があまりないので色々検証できてないですが、現状動いているので多分これで動きます。
メモをみるとSwitchデバイス(eth0.1あたり)やルーティングテーブルいじったり、迷走してましたね。。。

ちなみに、固定IPはお金がかかるので、DDNS(NoIP)を登録して使っています。

(あ、日付変わってた…メリークリスマス!🎅)