2 ポイント 投稿者 zxsi2003 12 일 전 | 4件のコメント | WhatsAppで共有

こんにちは。外部サーバー向けの特定ポートのトラフィックだけを一時的に
ローカルで立ち上げた mock サーバーへ
送りたい状況が何度もあったため作ったツールです。(クロードコード活用)

hosts ファイルではポート単位のマッピングができず、プロキシは
アプリケーション側がプロキシを
認識していないと動作しません。detour は1つ下のレイヤー(カーネル)で
パケットを横取りするため、
アプリケーションは自分が元のアドレスに dial したと思ったまま
そのまま動作します。

動作方式

  • WinDivert ドライバーで outbound パケットをカーネルで横取りし、
    userspace で
    destination NAT を実行 → dst を TO に rewrite し、チェックサムを
    再計算してから再注入
  • 応答パケットは src を FROM に再度 rewrite して
    返すため、
    アプリケーションは自分が dial したアドレスが応答したように認識
  • システム全体に適用(PID フィルタリングなし)

構成

  • detour.exe (CLI): --from 1.2.3.4:5000 --to 127.0.0.1:5001 の1行でルールを適用し、
    Ctrl+C で解除
  • detour-gui.exe: トレイアイコン + マルチルールテーブル。
    ルールを %APPDATA%\detour\rules.json に自動保存し、次回
    起動時に復元。
    ルールごとに独立した WinDivert ハンドルのペアが動作するため、複数の迂回を
    同時に運用可能
  • UAC manifest を埋め込み — ダブルクリックすると自動で権限昇格
    プロンプト
  • WinDivert.dll / WinDivert64.sys もバイナリに埋め込み —
    別途ドライバーをインストール
    せず単一の exe で完結

スタック

  • Go 1.23+
  • GUI は lxn/walk(Win32 を直接呼び出し、cgo 依存がないため
    macOS から cross-compile 可能)
  • リリースは GoReleaser で単一 zip(CLI + GUI 同梱)

制限事項 (v1)

  • IPv4 専用(IPv6 非対応)
  • ローカル ↔ ローカル(127.0.0.1)トラフィックは Windows のネットワーキングスタックが
    特別扱いするため、
    一貫しない動作になる可能性あり
  • TCP MSS clamping は未実装 — 迂回経路の MTU が小さいと
    fragmentation の可能性あり

ライセンスは GPLv3(WinDivert は LGPLv3 依存)。
フィードバック / 使用事例 / バグレポートを歓迎します。

4件のコメント

 
kaydash 11 일 전

つまりプロキシってことですか..?

 
zxsi2003 11 일 전

厳密に言えば、プロキシというよりは Destination NAT と見ることができます。上の説明は長すぎるので、私が使ったケースを以下に整理します。

  1. 既にビルドされたクライアントプログラムの宛先(1.2.3.4.:5000)ではなく、自分のローカルPC上のサーバー(172.16.100.201:5000)にリクエストを送りたい。

  2. リクエスト経路がハードコードされており、変更するにはクライアント開発者にリビルドを依頼しなければならないケースが多い。

  3. アプリケーション層ではなく OS カーネル層で、特定の IP、Port(1.2.3.4.:5000)へ向かうトラフィックの宛先・到達先ヘッダーを、望む IP、Port(172.16.100.201:5000)に変更して解決したい。

  4. detour 開発

 
findnamo 11 일 전

ドメインアドレスで入力したリクエストもプロキシできますか?

 
zxsi2003 11 일 전

ドメインアドレスで入力したリクエストの場合、実装時の複雑度が上がると判断したため、そもそも入力できないようにしてあります……。内部テスト用に開発したものなので、汎用的な機能には対応していません。
特定のドメインに対するIPを nslookup で調べて設定することは可能です。

今後のアップデートで反映できるようにしてみます。