サブスクリプションはもう不要:NodogsplashとNginxで商用グレードのキャプティブポータルを構築する

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

本番運用から半年:なぜ自作のゲートウェイを構築したのか

毎日50人以上が利用する地元のコワーキングスペースのゲストネットワークを管理してきましたが、ついに年間600ドルもかかるプロプライエタリなコントローラーの使用を止めました。公共Wi-Fiの管理では、多くの場合、選択肢が限られています。高すぎるエンタープライズ向けハードウェアに料金を支払うか、ネットワークを完全に開放して野放しにするかのどちらかです。私は第3の道を選びました。中古のLenovo Tiny PC上でNodogsplashとNginxを使用した、セルフホスト型のゲートウェイです。

このセットアップの目的は、単なる節約ではありません。「所有権」を持つことです。トラフィックのインターセプターとしてNodogsplash(NDS)を使用し、フロントエンドの提供にNginxを使用することで、ブランディング、ユーザーデータ、セッション制限を完全にコントロールできるようになります。ベンダーロックインに陥ることなくプロフェッショナルなネットワークサービスを提供したいのであれば、これこそが習得すべきスタックです。

大きな議論:プロプライエタリ vs オープンソース

この構築に着手する前に、業界標準を評価しました。セルフホスト型のアプローチが、過去に私が導入したハードウェアと比べてどうなのかを以下にまとめます。

1. マネージドルート(Ubiquiti UniFi、MikroTikなど)

ほとんどのITショップはUniFi Dream Machineを選びます。これらは信頼性が高く、「プラグアンドプレイ」の体験を提供してくれます。しかし、スプラッシュページ(ログイン画面)のカスタマイズは、ソフトウェアとの戦いのように感じることがよくあります。多くの場合、基本的なCSSの調整に制限されます。メンバー認証用のカスタムSQLデータベースや、特定のサードパーティAPIを統合する必要がある場合、すぐに限界に突き当たることになります。

2. オープンスタック(Nodogsplash + Nginx)

この方法では、標準的なLinuxマシン(35ドルのRaspberry Pi 4でも可能)を高度なゲートウェイに変貌させます。Nodogsplashは、クライアントトラフィックを捕捉するための低レベルのiptablesルールを処理します。そしてNginxが、モダンでレスポンシブなHTML5ページを表示します。非常に柔軟性が高いですが、ターミナル操作や基本的なIPルーティングの知識が必要になります。

なぜこのセットアップが勝るのか(そして注意点はどこか)

メリット

  • ライセンス料ゼロ: ユーザーごと、あるいはアクセスポイントごとのコストは0円です。20台のAPを持つ小規模ホテルなら、3年間で数十万円を節約できる可能性があります。
  • デザインの自由度: Nginxはログインページを他のWebサイトと同じように扱います。Bootstrap、Tailwind、あるいはReactを使用して、プレミアムなユーザー体験を作成できます。
  • リソース効率: NodogsplashはC言語で書かれています。100人のアクティブクライアントがいてもRAM消費量は15MB未満であり、エッジハードウェアに最適です。
  • データ収集: 私はマーケティングニュースレター用にゲストのメールアドレスを記録する簡単なPythonスクリンスクリプトを統合しました。商用ベンダーは通常、この「機能」に追加料金を課します。

課題

  • 学習曲線: IPフォワーディングやネットワークインターフェースの仕組みを理解する必要があります。
  • メンテナンス: スタック全体をワンクリックで更新する「自動アップデート」ボタンはありません。セキュリティパッチを管理するシステム管理者としての責任が生じます。

設計図:推奨ハードウェア

20人が同時にYouTubeをストリーミングしてもクラッシュしない安定した環境のために、以下のベースラインを使用してください:

  • ハードウェア: デュアルGigabit NICを備えたデバイス。Protectli Vaultや、PCIeイーサネットカードを搭載したPCが最適です。
  • OS: 長期的な安定性のためにDebian 12 (Bookworm) または Ubuntu 22.04 LTS。
  • ソフトウェア: ゲートウェイ用にNodogsplash、Webサーバー用にNginx。

ステップバイステップの導入手順

1. Linuxをルーター化する

Linuxマシンは、Wi-Fiクライアントとインターネットの間でトラフィックをパスさせる必要があります。まず、カーネルでIPフォワーディングを有効にします。

# /etc/sysctl.confを編集し、以下の行のコメントアウトを解除します: 
net.ipv4.ip_forward=1

# 変更を即座に適用します
sudo sysctl -p

2. ソフトウェアスタックのインストール

Nginxは主要なリポジトリで利用可能です。Nodogsplashは、最新の機能とセキュリティ修正を確保するために、ソースからビルドするのが最善です。

sudo apt update
sudo apt install nginx git libmicrohttpd-dev build-essential -y

# Nodogsplashをクローンしてコンパイルします
git clone https://github.com/nodogsplash/nodogsplash.git
cd nodogsplash
make
sudo make install

3. ゲートウェイの設定

/etc/nodogsplash/nodogsplash.confを開きます。ユーザーが接続するインターフェース(LAN側)を指定する必要があります。この例では、eth1がWi-Fiアクセスポイントに接続されているインターフェースです。

# /etc/nodogsplash/nodogsplash.conf
GatewayInterface eth1
GatewayAddress 192.168.10.1
MaxClients 150

# ユーザーをカスタムのNginxページにリダイレクトします
# NDSはこのURLに'authaction'トークンを自動的に追加します
RedirectURL http://192.168.10.1:8080/portal//

4. Nginxスプラッシュページの作成

他の管理ツール用にポート80を空けておくため、Nginxをポート8080で実行します。ポータルファイルを提供するためのシンプルなバーチャルホストを設定します。

# /etc/nginx/sites-available/captive-portal
server {
    listen 8080;
    root /var/www/portal;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

index.htmlには少しのJavaScriptが必要です。NDSがユーザーをリダイレクトするとき、URLに固有のトークンを送信します。「接続」ボタンは、インターネットアクセスを解除するために、そのトークンを持ってユーザーをNDSに送り返す必要があります。

<!-- /var/www/portal/index.html -->
<!DOCTYPE html>
<html>
<head><title>無料ゲストWi-Fi</title></head>
<body>
    <h1>ネットワークへようこそ</h1>
    <a id="login-link" href="#">接続するにはここをクリック</a>

    <script>
        const params = new URLSearchParams(window.location.search);
        const target = params.get('authaction');
        if (target) {
            document.getElementById('login-link').href = decodeURIComponent(target);
        }
    </script>
</body>
</html>

現場で得た苦労の教訓

現代のスマートフォンは非常にシビアです。「キャプティブネットワークアシスタント」(Wi-Fi接続時に表示されるポップアップウィンドウ)が3秒以内にロードされないと、電話は接続を解除して5Gに切り替わることがよくあります。スプラッシュページは軽量に保ちましょう。5MBもある重い背景画像や、ロードにインターネット接続が必要な外部フォントの使用は避けてください。

もう一つの重要な設定は ClientIdleTimeout です。当初はデフォルトのままにしていましたが、ネットワークに「幽霊」のように残っているモバイルデバイスがIPプールを使い果たしていることに気づきました。これを60分に設定することで、建物を去ったユーザーが確実にクリアされ、新しいゲストのためにアドレスが解放されるようになります。

最終的な結論

独自のキャプティブポータルを構築することは、ネットワーク管理者にとっての通過儀礼です。それは単なるハードウェアの消費者から、ネットワークアーキテクトへの転換を意味します。Nodogsplashの軽量なパケットフィルタリングとNginxのWebパワーを組み合わせることで、市販の製品よりも高速で安価、かつカスタマイズ可能なシステムを構築できるのです。

Share: