detour - Go से बना CLI + GUI, जो Windows में किसी खास IP:PORT ट्रैफिक को पारदर्शी रूप से दूसरे destination पर reroute करता है
(github.com/LeeJeKyun)नमस्ते। यह एक ऐसा टूल है जिसे मैंने इसलिए बनाया, क्योंकि बार-बार ऐसी स्थिति आती थी जहाँ बाहरी सर्वर की ओर जाने वाले सिर्फ किसी खास पोर्ट के ट्रैफिक को थोड़ी देर के लिए
लोकल पर चल रहे mock सर्वर पर
भेजना होता था। (Claude Code का उपयोग)
hosts फ़ाइल पोर्ट-स्तर की mapping नहीं कर सकती, और proxy तभी
काम करता है जब application
proxy को पहचानता हो। detour एक लेयर नीचे (kernel) में
packet को intercept करता है, इसलिए
application को यही लगता है कि उसने मूल address पर ही dial किया है
और वह वैसे ही काम करता रहता है।
काम करने का तरीका
- WinDivert ड्राइवर से outbound packet को kernel में intercept करके
userspace में
destination NAT किया जाता है → dst कोTOमें rewrite किया जाता है, checksum
फिर से calculate करके दोबारा inject किया जाता है - response packet में src को फिर से
FROMमें rewrite करके
वापस भेजा जाता है, इसलिए
application को ऐसा लगता है जैसे उसी address ने response दिया है जिस पर उसने dial किया था - पूरे system पर लागू (कोई PID filtering नहीं)
संरचना
detour.exe(CLI):--from 1.2.3.4:5000 --to 127.0.0.1:5001एक ही लाइन में rule लागू,
Ctrl+C से हटाएँdetour-gui.exe: tray icon + multi-rule table।
rules को%APPDATA%\detour\rules.jsonमें अपने-आप save करता है और अगली
बार चलाने पर restore करता है।
हर rule के लिए अलग WinDivert handle pair चलता है, इसलिए कई reroute
एक साथ चलाए जा सकते हैं- UAC manifest embed किया गया है — double-click करने पर अपने-आप privilege elevation
prompt आता है - WinDivert.dll / WinDivert64.sys भी binary में embed हैं —
अलग driver install किए
बिना एक single exe से काम हो जाता है
स्टैक
- Go 1.23+
- GUI के लिए
lxn/walk(सीधे Win32 call, cgo dependency नहीं, इसलिए
macOS से cross-compile संभव) - release के लिए GoReleaser से single zip (CLI + GUI साथ में)
सीमाएँ (v1)
- सिर्फ IPv4 (IPv6 सपोर्ट नहीं)
- local ↔ local (127.0.0.1) ट्रैफिक को Windows networking stack
विशेष रूप से handle करता है, इसलिए
यह असंगत तरीके से काम कर सकता है - TCP MSS clamping लागू नहीं है — अगर reroute path का MTU छोटा हो
तो fragmentation हो सकती है
लाइसेंस GPLv3 है (WinDivert, LGPLv3 dependency पर आधारित है)।
फ़ीडबैक / उपयोग के मामले / bug report का स्वागत है।
4 टिप्पणियां
यानी यह एक proxy ही है..?
सख्ती से कहें तो इसे proxy से ज़्यादा Destination NAT कहना सही होगा। ऊपर की बात बहुत लंबी हो गई थी, इसलिए मैंने अपना इस्तेमाल का case नीचे संक्षेप में整理 किया है।
पहले से built client program के destination (1.2.3.4.:5000) की बजाय अपने local PC के server (172.16.100.201:5000) पर request भेजना चाहता था।
request path hardcoded होने के कारण, इसे बदलने के लिए कई बार client developer से rebuild का अनुरोध करना पड़ता था।
application layer पर नहीं, बल्कि OS kernel layer पर, specific IP, Port (1.2.3.4.:5000) की ओर जाने वाले traffic के destination और arrival header को मनचाहे IP, Port (172.16.100.201:5000) में बदलकर समस्या हल करना चाहता था।
detour development
क्या domain address के रूप में दिए गए अनुरोधों को भी proxy किया जा सकता है?
अगर अनुरोध domain address के रूप में दर्ज किया गया हो, तो हमें लगा कि implementation की complexity बढ़ जाएगी, इसलिए शुरू से ही ऐसा input नहीं देने दिया गया है... यह आंतरिक टेस्टिंग के लिए विकसित किया गया था, इसलिए यह सामान्य-उपयोग वाली सुविधाओं का समर्थन नहीं करता।
किसी विशेष domain के लिए IP को
nslookupसे खोजकर सेट करना संभव है।इसे हम आगे के update में लागू करने की कोशिश करेंगे.