2 puan yazan zxsi2003 12 일 전 | 4 yorum | WhatsApp'ta paylaş

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 → hedefi TO olarak yeniden yazar, checksum'u
    tekrar hesaplayıp yeniden enjekte eder
  • Yanıt paketlerinde kaynak FROM olarak 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:5001 ile tek satırda kural uygular,
    Ctrl+C ile kaldırılır
  • detour-gui.exe: tepsi simgesi + çoklu kural tablosu.
    Kuralları %APPDATA%\detour\rules.json iç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 (Win32 doğ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

 
kaydash 11 일 전

Yani bir proxy, değil mi..?

 
zxsi2003 11 일 전

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.

  1. İ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.

  2. İ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.

  3. 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.

  4. detour geliştirildi

 
findnamo 11 일 전

domain adresiyle girilen istekler de proxy üzerinden geçirilebilir mi?

 
zxsi2003 11 일 전

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 nslookup ile bulup ayarlamak ise mümkün.

Bunu ilerideki bir güncellemede uygulamaya çalışacağım.