独自のトンネリングプラットフォームを構築した
ノート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
