目次

型落ちノートPCでDockerサービスを公開したい ― WSL2の多段NAT地獄をNebulaで乗り越える

はじめに

部署で余った型落ちのWindows 10ノートPC。捨てるにはもったいないが、業務の第一線で使うにはスペックが心許ない。「WSL2でDockerを動かして、チーム用のForgejoでも立てれば有効活用できるのでは?」と思いついた。専用サーバの稟議を通す必要もなく、手元ですぐ始められる。

お手軽で最高――と思いきや、思わぬ落とし穴があった。多段NATである。

本記事では、WSL2上のDockerコンテナで立てたサービスに、同じフロアの開発メンバーからアクセスできるようにするまでに直面した多段NATの問題と、OSSのメッシュVPN Nebula で気楽に解決した話を紹介する。

WSL2の多段NAT構造

WSL2上のDockerコンテナでサービスを公開しようとすると、ネットワーク的にはこうなる。

[社内LAN上のメンバーPC]
  └─ [ルーター / 社内NW] ← NAT①
       └─ [Windows 10 ホスト]
            └─ [WSL2 仮想ネットワーク] ← NAT②
                 └─ [Docker bridge network] ← NAT③
                      ├─ Forgejo (port 3000)
                      └─ DinD Runner

NATが3重。localhostでは動いているのに、隣の席の同僚からアクセスできない。これが多段NATの厄介さだ。

試行錯誤:どれもしっくりこない

いくつかの方法を試したが、どれも決め手に欠けた。

portproxy(netsh interface portproxy)

Windows標準のポート転送機能。追加ソフト不要で手軽だが、WSL2のIPアドレスが再起動のたびに変わる。起動時にスクリプトで毎回再設定する必要があり、Windows Updateでファイアウォールがリセットされるリスクもある。動くけど、運用が地味に辛い。

Windows 11のミラードネットワーキング

WSL2のネットワークをホストとミラーリングする機能。期待して試したが、Forgejoがうまく動いてくれなかった。そもそも今回の環境はWindows 10なので、この選択肢自体が使えない。

Tailscale

手軽さは抜群。ただしコーディネーションサーバがTailscale社に依存しており、完全なOSSではない。同じフロアの仲間内で使うだけなのに、外部サービスに依存するのは少し大げさに感じた。

ngrok

一時的なデモ共有には便利だが、常時運用には向かない。

Nebulaにたどり着いた

最初にAIに相談したときは、portproxyやTailscaleなど「よくある解決策」しか出てこなかった。そこで方針を変えて、解決策を直接聞くのではなく、問題点を構造的に整理する壁打ちをした。NAT越えの方式を体系的に比較していく中で、Nebula というツールの存在を知った。

Nebulaとは

Nebulaは、Slackのエンジニアが社内インフラ向けに開発し、2019年にOSS化されたオーバーレイネットワークツールだ。

https://slack.engineering/introducing-nebula-the-open-source-global-overlay-network-from-slack/

項目内容
ライセンスMIT(完全OSS)
開発言語Go
対応OSLinux, macOS, Windows, iOS, Android
暗号方式Noise Protocol Framework / AES-256-GCM
NATの扱いUDPホールパンチング + Lighthouse(ディスカバリノード)
本番実績Slackで5万台以上のホストが稼働
GitHub?slackhq/nebula

ざっくり言うと、各マシンにNebulaをインストールして証明書を置くだけで、NATの有無に関係なく仮想的なプライベートネットワークで直接つながる。WSL2の多段NATも、Docker内のNATも、まるごとスキップできる。

仲間内なら証明書管理は怖くない

Nebulaの紹介記事を読むと「自分でCA(認証局)を作って、証明書を発行して…」という説明が出てきて、ちょっと身構えるかもしれない。実際、Nebulaの作者が設立したDefined Networking社は、この証明書管理を自動化する有料サービス(Managed Nebula)を提供しているぐらいだ。

しかし、それは数百〜数千台規模でメンバーの出入りが頻繁な組織の話。同じフロアの気心知れた3人で使うなら、事情はまったく違う。

証明書の有効期限は自分で決められる

デフォルトは1年だが、-duration フラグで自由に設定できる。仲間内で使うだけなら、10年にしておけば実質メンテナンスフリーだ。

発行するのは初回の数枚だけ

3人チームなら発行する証明書はこれだけだ。

# CA(認証局)を作る(10年有効)
nebula-cert ca -name "our-team" -duration 87600h

# 各ホスト用の証明書を発行
nebula-cert sign -name "forgejo-server" -ip "192.168.100.1/24" -duration 87600h
nebula-cert sign -name "member1" -ip "192.168.100.2/24" -duration 87600h
nebula-cert sign -name "member2" -ip "192.168.100.3/24" -duration 87600h
nebula-cert sign -name "member3" -ip "192.168.100.4/24" -duration 87600h

コマンド5つ。1分もかからない。あとはファイルを各メンバーに渡すだけ。USBメモリでもSlackのDMでも、渡し方は何でもいい。同じフロアに座っているのだから。

CAの秘密鍵の管理も気楽でいい

大規模組織なら ca.key は厳重に暗号化して金庫に入れるべきだ。しかし仲間内の3人なら、自分のPCの適当なフォルダに保管しておけば十分だ。万が一漏れたところで、このネットワークにアクセスできるのは同じフロアにいる顔見知りだけである。

メンバーの追加・削除

誰かがチームに加わったら、コマンド1つで証明書を発行して渡すだけ。辞めた人がいたら、その証明書をブロックリストに追加すればいい。3人規模なら、そもそも滅多に発生しないイベントだ。

同一LANならLighthouseも手元でいい

Nebulaのネットワークには、ノード同士がお互いを発見するための Lighthouse(灯台)が必要だ。インターネット越しに使う場合はVPSなどに置く必要があるが、全員が同じ社内LANにいるなら、Forgejoを動かしている型落ちノートPC自身をLighthouseにしてしまえばいい。追加のサーバは不要だ。

構成まとめ

最終的な構成はこうなる。

[社内LAN]
 ├─ 型落ちノートPC (Windows 10)
 │    └─ WSL2
 │         └─ Docker
 │              ├─ Forgejo ── Nebula (192.168.100.1) ← Lighthouse兼用
 │              └─ DinD Runner
 │
 ├─ メンバー1 PC ── Nebula (192.168.100.2)
 ├─ メンバー2 PC ── Nebula (192.168.100.3)
 └─ メンバー3 PC ── Nebula (192.168.100.4)

各メンバーは http://192.168.100.1:3000 でForgejoにアクセスする。NATが何重だろうが関係ない。Nebulaのオーバーレイネットワークがすべてをバイパスしてくれる。

検証:実際にやってみた

注:このセクションは検証後に追記予定

検証環境

項目内容
ホストOSWindows 10 Pro
WSL2Ubuntu 24.04
DockerDocker Engine on WSL2
サービスForgejo + DinD Runner
クライアント同一フロアのPC × 3台

手順の概要

  1. nebula-cert でCAと各ホストの証明書を発行
  2. 型落ちノートPCのWSL2内にNebulaをインストールし、Lighthouse として起動
  3. 各メンバーPCにNebulaをインストールし、証明書と設定ファイルを配置
  4. Nebula起動、Forgejoへの接続確認

検証結果

(検証後に追記)

所感

型落ちノートPCの有効活用という軽い気持ちで始めたが、WSL2の多段NATは想像以上に厄介だった。portproxyのスクリプト化やミラードモードなど、対症療法を繰り返していたら、おそらくどこかで嫌になっていたと思う。

Nebulaは、この問題をオーバーレイネットワークで根本的に解決してくれる。しかもMITライセンスの完全OSSだ。

証明書管理が大変そうに見えるのがNebulaのとっつきにくさだが、仲間内で使う分には有効期限を10年にして最初に数枚発行すれば、あとはほぼ放置でいい。同じフロアの顔見知り同士なら、セキュリティもそこまで神経質にならなくていい。

Nebulaは大規模インフラ向けのイメージが強いが、実は「隣の席の3人でサーバを共有したい」というミニマムな用途にもぴったりハマる。Tailscaleほど知名度はないが、外部依存ゼロで完全に自前で完結するのは大きな魅力だ。

同じようにWSL2のNAT越えで困っている方は、選択肢のひとつとして検討してみてほしい。

補足:もっと本格的に使いたくなったら

Nebulaの作者が設立したDefined Networking社が提供する Managed Nebula というサービスがある。証明書の自動管理、Web UI、SSO連携が付いて、100デバイスまで無料(クレジットカード不要)で使える。チームが大きくなったり、リモートワークで社外からもアクセスしたくなったりしたときの次のステップとして覚えておくと良い。

参考リンク

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS