detour - Go ile yapılmış, Windows'ta belirli IP:PORT trafiğini başka bir hedefe şeffaf biçimde yönlendiren CLI + GUI
(github.com/LeeJeKyun)Merhaba. Dış sunucuya giden yalnızca belirli port trafiğini kısa süreliğine
yerelde ayağa kaldırdığım bir mock sunucuya
göndermek istediğim durumlar tekrarlandığı için yaptığım bir araçtır. (Claude Code kullanıldı)
hosts dosyası port bazlı eşleme yapamaz, proxy ise
uygulamanın proxy'yi
tanıması gerektiğinde çalışır. detour, bir katman aşağıda (çekirdekte)
paketleri yakaladığı için
uygulama, kendisinin hâlâ orijinal adrese dial ettiğini sanarak
aynen çalışmaya devam eder.
Çalışma şekli
- WinDivert sürücüsüyle outbound paketleri çekirdekte yakalayıp
userspace'te
destination NAT uygular → hedefiTOolarak yeniden yazar, checksum'u
tekrar hesaplayıp yeniden enjekte eder - Yanıt paketlerinde kaynak
FROMolarak tekrar rewrite edilip
geri gönderildiği için,
uygulama yanıtın kendi bağlandığı adresten geldiğini sanır - Sistem genelinde uygulanır (PID filtreleme yok)
Bileşenler
detour.exe(CLI):--from 1.2.3.4:5000 --to 127.0.0.1:5001ile tek satırda kural uygular,
Ctrl+Cile kaldırılırdetour-gui.exe: tepsi simgesi + çoklu kural tablosu.
Kuralları%APPDATA%\detour\rules.jsoniçine otomatik kaydeder ve bir sonraki
çalıştırmada geri yükler.
Her kural için bağımsız WinDivert handle çiftleri çalıştığından birden fazla yönlendirme
aynı anda işletilebilir- UAC manifest gömülü — çift tıklayınca otomatik olarak yetki yükseltme
istemi gelir - WinDivert.dll / WinDivert64.sys de ikiliye gömülü —
ayrıca sürücü kurulumu
gerekmeden tek bir exe ile biter
Yığın
- Go 1.23+
- GUI için
lxn/walk(Win32doğrudan çağrılıyor, cgo bağımlılığı olmadığı için
macOS'tan cross-compile mümkün) - Sürümler GoReleaser ile tek bir zip olarak hazırlanıyor (CLI + GUI birlikte)
Sınırlar (v1)
- Yalnızca IPv4 (IPv6 desteklenmiyor)
- Yerel ↔ yerel (127.0.0.1) trafiği Windows ağ yığını tarafından
özel işlendiği için
tutarsız davranabilir - TCP MSS clamping uygulanmadı — yönlendirme yolunun MTU'su küçükse
fragmentation olabilir
Lisans GPLv3'tür (WinDivert, LGPLv3'e bağımlıdır).
Geri bildirim / kullanım örnekleri / hata raporları memnuniyetle karşılanır.
4 yorum
Yani bir proxy, değil mi..?
Kesin konuşmak gerekirse buna proxy'den çok Destination NAT denebilir. Yukarıdaki ifade fazla uzadığı için, benim kullandığım senaryoyu aşağıda özetliyorum.
İstekleri, zaten derlenmiş istemci programının hedefi olan (1.2.3.4.:5000) yerine kendi yerel PC'mdeki sunucuya (172.16.100.201:5000) göndermek istedim.
İstek yolu hardcode edildiği için, bunu değiştirmek adına istemci geliştiricisinden yeniden build almayı istemek zorunda kalınan durumlar sıkça yaşanıyordu.
Uygulama katmanı yerine OS çekirdeği katmanında, belirli bir IP ve Port'a (1.2.3.4.:5000) giden trafiğin hedef/adres başlıklarını istenen IP ve Port'a (172.16.100.201:5000) çevirerek çözmek istedim.
detour geliştirildi
domainadresiyle girilen istekler de proxy üzerinden geçirilebilir mi?Domain adresi olarak girilen isteklerde, uygulama sırasında karmaşıklığın artacağına karar verildiği için en baştan giriş yapılamayacak şekilde tasarlandı... Dahili test için geliştirdiğim bir araç olduğu için genel amaçlı özellikleri desteklemiyor.
Belirli bir alan adına karşılık gelen IP’yi
nslookupile bulup ayarlamak ise mümkün.Bunu ilerideki bir güncellemede uygulamaya çalışacağım.