2 poin oleh zxsi2003 12 hari lalu | 4 komentar | Bagikan ke WhatsApp

Halo. Ini adalah alat yang saya buat karena saya berulang kali berada dalam situasi di mana saya hanya ingin mengirim sementara trafik pada port tertentu yang menuju server eksternal
ke server mock lokal yang dijalankan di mesin sendiri. (memanfaatkan Claude Code)

File hosts tidak mendukung pemetaan per port, dan proxy
hanya berfungsi jika aplikasi
mengenali penggunaan proxy. Karena detour mencegat paket satu lapis di bawahnya (kernel),
aplikasi tetap
berjalan seolah-olah ia melakukan dial ke alamat aslinya.

Cara kerja

  • Mencegat paket outbound di kernel dengan driver WinDivert, lalu di userspace
    melakukan destination NAT → menulis ulang dst ke TO, menghitung ulang checksum, lalu menyuntikkannya kembali
  • Untuk paket respons, src ditulis ulang kembali menjadi FROM lalu dikembalikan, sehingga
    aplikasi menganggap alamat yang tadi ia dial-lah yang memberikan respons
  • Berlaku untuk seluruh sistem (tanpa filtering PID)

Komponen

  • detour.exe (CLI): menerapkan rule hanya dengan satu baris --from 1.2.3.4:5000 --to 127.0.0.1:5001, lalu dilepas dengan Ctrl+C
  • detour-gui.exe: ikon tray + tabel multi-rule.
    Rule otomatis disimpan ke %APPDATA%\detour\rules.json dan dipulihkan saat dijalankan lagi.
    Karena setiap rule menjalankan pasangan handle WinDivert yang independen, beberapa pengalihan bisa dioperasikan secara bersamaan
  • UAC manifest ditanamkan — klik ganda akan otomatis memunculkan prompt eskalasi hak akses
  • WinDivert.dll / WinDivert64.sys juga ditanamkan ke dalam biner —
    selesai dengan satu file exe tanpa
    perlu instalasi driver terpisah

Stack

  • Go 1.23+
  • GUI menggunakan lxn/walk (memanggil Win32 secara langsung, tanpa dependensi cgo sehingga bisa cross-compile dari macOS)
  • Rilis dikemas sebagai satu file zip dengan GoReleaser (CLI + GUI disertakan)

Batasan (v1)

  • Hanya IPv4 (IPv6 belum didukung)
  • Trafik lokal ↔ lokal (127.0.0.1) bisa berperilaku tidak konsisten karena Windows networking stack menanganinya secara khusus
  • TCP MSS clamping belum diimplementasikan — jika MTU pada jalur pengalihan lebih kecil, fragmentasi bisa terjadi

Lisensinya GPLv3 (WinDivert bergantung pada LGPLv3).
Masukan / contoh penggunaan / laporan bug sangat diterima.

4 komentar

 
kaydash 11 hari lalu

Maksudnya proxy, kan..?

 
zxsi2003 11 hari lalu

Kalau dijelaskan secara ketat, ini lebih tepat disebut Destination NAT daripada proxy. Penjelasan di atas terlalu panjang, jadi saya rangkum kasus penggunaan saya di bawah ini.

  1. Ingin mengirim permintaan bukan ke tujuan program klien yang sudah dibangun sebelumnya (1.2.3.4.:5000), melainkan ke server di PC lokal saya (172.16.100.201:5000).

  2. Karena jalur permintaan di-hardcode, dalam banyak kasus untuk mengubahnya harus meminta developer klien melakukan build ulang.

  3. Ingin menyelesaikannya dengan mengubah header tujuan trafik yang menuju IP dan port tertentu (1.2.3.4.:5000) menjadi IP dan port yang diinginkan (172.16.100.201:5000) di level kernel OS, bukan di level aplikasi.

  4. Mengembangkan detour

 
findnamo 11 hari lalu

Apakah permintaan yang dimasukkan sebagai alamat domain juga bisa diproksikan?

 
zxsi2003 11 hari lalu

Untuk permintaan yang dimasukkan sebagai alamat domain, kami menilai kompleksitas implementasinya akan meningkat sehingga sejak awal input seperti itu memang tidak diperbolehkan... Karena ini dikembangkan untuk pengujian internal, fitur yang didukung tidak bersifat umum.
Menemukan IP untuk domain tertentu dengan nslookup lalu mengaturnya adalah hal yang memungkinkan.

Akan kami coba terapkan pada pembaruan berikutnya.