detour - Go製のWindows向け、特定のIP:PORTトラフィックを別の宛先へ透過的に迂回させるCLI + GUI
(github.com/LeeJeKyun)こんにちは。外部サーバー向けの特定ポートのトラフィックだけを一時的に
ローカルで立ち上げた 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件のコメント
つまりプロキシってことですか..?
厳密に言えば、プロキシというよりは Destination NAT と見ることができます。上の説明は長すぎるので、私が使ったケースを以下に整理します。
既にビルドされたクライアントプログラムの宛先(1.2.3.4.:5000)ではなく、自分のローカルPC上のサーバー(172.16.100.201:5000)にリクエストを送りたい。
リクエスト経路がハードコードされており、変更するにはクライアント開発者にリビルドを依頼しなければならないケースが多い。
アプリケーション層ではなく OS カーネル層で、特定の IP、Port(1.2.3.4.:5000)へ向かうトラフィックの宛先・到達先ヘッダーを、望む IP、Port(172.16.100.201:5000)に変更して解決したい。
detour 開発
ドメインアドレスで入力したリクエストもプロキシできますか?
ドメインアドレスで入力したリクエストの場合、実装時の複雑度が上がると判断したため、そもそも入力できないようにしてあります……。内部テスト用に開発したものなので、汎用的な機能には対応していません。
特定のドメインに対するIPを
nslookupで調べて設定することは可能です。今後のアップデートで反映できるようにしてみます。