detour - CLI + GUI buatan Go untuk mengalihkan trafik IP:PORT tertentu secara transparan ke tujuan lain di Windows
(github.com/LeeJeKyun)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 keTO, menghitung ulang checksum, lalu menyuntikkannya kembali - Untuk paket respons, src ditulis ulang kembali menjadi
FROMlalu 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+Cdetour-gui.exe: ikon tray + tabel multi-rule.
Rule otomatis disimpan ke%APPDATA%\detour\rules.jsondan 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
Maksudnya proxy, kan..?
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.
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).
Karena jalur permintaan di-hardcode, dalam banyak kasus untuk mengubahnya harus meminta developer klien melakukan build ulang.
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.
Mengembangkan detour
Apakah permintaan yang dimasukkan sebagai alamat domain juga bisa diproksikan?
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
nslookuplalu mengaturnya adalah hal yang memungkinkan.Akan kami coba terapkan pada pembaruan berikutnya.