独自のトンネリングプラットフォームを構築した

ノートPCで3日間かけてウェブアプリを磨き上げました。見た目は完璧でした。しかし、いざスマートフォンでテストしようとしたところ、すべてが崩壊してしまいました。

2台目のデバイスが必要になると、ローカル開発は厄介になります。ファイアウォールやHTTPS証明書の問題により、ローカルIPを共有することはできません。

Ngrokを試してみました。動作はしますが、無料プランでは接続が切断されます。また、URLもひどいものです。a1b2-34-56.ngrok-free.appのようなランダムな文字列は、クライアントやチームと共有するには不向きです。

きれいで読みやすいURLを持つトンネルが欲しかったので、自作することにしました。

カスタムトンネルとURL短縮機能を組み合わせました。さらに、スマートなスラッグを生成するためにAIを導入し、セキュリティ保護機能も組み込みました。

技術スタック: • Tunnel / Proxy: Django Channels, Daphne, WebSockets, Python & Node.js CLI • Frontend: Next.js, TailwindCSS, Shadcn/UI • Backend: Django 5, Graphene GraphQL • Database: PostgreSQL (Neon) • Auth: JWT, bcrypt • AI: Google Gemini • Security: MaxMind GeoLite2, Google Safe Browsing API

仕組み:

  • 双方向WebSocketトンネリング。ローカルのCLIエージェントがDjangoサーバーに接続し、HTTPリクエストを転送します。
  • レースコンディション(競合状態)対策。分析の正確性を保つため、DjangoのF()式を使用してアトミックな更新を行っています。
  • ノンブロッキングなテレメトリ。低レイテンシを維持するため、位置情報やOSの照会はバックグラウンドスレッドで実行されます。
  • AIスラッグ。GeminiがターゲットURLを読み取り、ランダムなテキストではなく意味のあるスラッグを生成します。
  • プロアクティブなセキュリティ。プライベートIP範囲をブロックし、リンクを保存する前にGoogle Safe Browsingによるチェックを実行します。

バックエンドとトンネリングのロジックは安定しています。フロントエンドはまだ開発中です。

現在、IITMでの試験に向けて勉強しています。勉強に集中するため、新機能の開発は一時停止しています。コードを放置するのではなく、レビューのために公開することにしました。

いくつかフィードバックをいただきたいことがあります:

  • レイテンシ:大規模な環境でリダイレクトを10ms未満に抑えるにはどうすればよいでしょうか?
  • セキュリティ:SSRF対策を強化するための最善の方法は何でしょうか?
  • スケーラビリティ:長時間維持されるトンネルには、WebSocketとTCPのどちらを使うべきでしょうか?
  • オブザーバビリティ(観測性):トンネルの健全性を監視するために、どのメトリクスを追跡すべきでしょうか?

プロキシワーカーやシステムデザインの経験がある方は、ぜひ意見を聞かせてください。

システム設計の詳細な内訳: [Link] コードベース: [Link]

ローカル開発中にモバイルの権限テストをどのように行っていますか?サードパーティのトンネルを使用していますか、それともカスタムツールを使用していますか?

出典: https://dev.to/zallu/my-ngrok-urls-got-so-ugly-i-built-my-own-tunneling-platform-instead-59d