Wireproxy: Klien WireGuard yang disediakan sebagai proksi HTTP/SOCKS5
(github.com/pufferffish)- Wireproxy adalah klien WireGuard penuh di ruang pengguna yang terhubung ke peer WireGuard lalu diekspos di mesin lokal sebagai proksi SOCKS5/HTTP atau tunnel
- Ditujukan untuk kasus ketika Anda ingin mengirim hanya trafik situs tertentu ke peer WireGuard tanpa menyiapkan antarmuka jaringan baru, atau ketika Anda tidak ingin menggunakan hak akses root untuk mengubah konfigurasi WireGuard
- Fiturnya mencakup perutean statis TCP, proksi SOCKS5/HTTP, dan proksi transparan berbasis TLS SNI, sementara proksi HTTP saat ini hanya mendukung CONNECT
- Konfigurasinya mengikuti makna
[Interface]dan[Peer]dariwg-quick, dapat mengimpor file konfigurasi WireGuard yang ada melaluiWGConfig, atau merutekan beberapa peer denganAllowedIPs - Untuk operasional, tersedia health endpoint berbasis
--info/-i, dengan/metricsdan/readyzuntuk memeriksa status WireGuard dan status kesiapan berbasisCheckAlive
Apa yang dilakukan Wireproxy
wireproxyadalah aplikasi ruang pengguna yang terhubung ke peer WireGuard dan mengekspos proksi SOCKS5/HTTP atau tunnel di mesin lokal- Dapat digunakan saat Anda hanya ingin mengakses situs tertentu melalui peer WireGuard tetapi tidak ingin membuat antarmuka jaringan baru
- Berjalan sepenuhnya terpisah dari antarmuka jaringan, dan tidak memerlukan hak akses root untuk konfigurasi
- Pengguna yang memerlukan fungsi serupa dengan Amnezia VPN dapat menggunakan fork wireproxy-awg
Fitur yang didukung dan yang belum ada
- Fitur yang didukung
- Perutean statis TCP untuk klien dan server
- Proksi SOCKS5/HTTP
- HTTP saat ini hanya mendukung CONNECT
- Proksi TLS transparan yang menggunakan Server Name Indication
- Fitur yang masih menjadi TODO
- Dukungan UDP pada SOCKS5
- Perutean statis UDP
Menjalankan dan memasang
- Format eksekusi dasar adalah
./wireproxy [-c path to config] - Opsi utama
-c,--config: menentukan jalur file konfigurasi- Jalur default adalah
/etc/wireproxy/wireproxy.conf,$HOME/.config/wireproxy.conf
- Jalur default adalah
-s,--silent: mode senyap-d,--daemon: jalankan di latar belakang-i,--info: menentukan alamat dan port untuk mengekspos health status-v,--version: menampilkan versi-n,--configtest: hanya memeriksa validitas file konfigurasi
- Build dilakukan dengan meng-clone repositori lalu menjalankan
make - Contoh instalasi menggunakan
go install github.com/windtf/wireproxy/cmd/wireproxy@v1.1.2atau@latest
Model konfigurasi
- Konfigurasi
[Interface]dan[Peer]mengikuti makna yang sama dengan konfigurasiwg-quick Addressharus menggunakan subnet/32untuk IPv4 dan/128untuk IPv6PrivateKeyjuga dapat merujuk ke variabel lingkungan- Jika sudah memiliki konfigurasi WireGuard, Anda dapat mengimpornya dengan
WGConfig = <path to the wireguard config>
Konfigurasi tunnel dan proksi
TCPClientTunnel- Meneruskan trafik TCP yang diterima di mesin lokal ke target yang ditentukan melalui WireGuard
- Contoh alurnya adalah
<aplikasi LAN> → localhost:25565 → WireGuard → play.cubecraft.net:25565
TCPServerTunnel- Meneruskan trafik TCP yang diterima dari jaringan WireGuard ke target tertentu di jaringan lokal
- Contoh alurnya adalah
<aplikasi jaringan WireGuard> → WireGuard → 172.16.31.2:3422 → localhost:25545
STDIOTunnel- Menghubungkan input dan output standar dari proses wireproxy ke target TCP melalui WireGuard
- Berguna untuk digunakan sebagai parameter
ProxyCommanddiopenssh
Socks5- Membuat proksi SOCKS5 di LAN lokal dan merutekan semua trafik melalui WireGuard
- Jika nama pengguna dan kata sandi ditentukan, autentikasi proksi akan diaktifkan
http- Membuat proksi HTTP di LAN lokal dan merutekan semua trafik melalui WireGuard
- Jika nama pengguna dan kata sandi ditentukan, autentikasi akan diaktifkan
- Jika
CertFiledanKeyFileditentukan, HTTPS akan diaktifkan
SNI- Membuat proksi TLS transparan di LAN lokal, lalu mengirim trafik melalui WireGuard dengan menggunakan SNI sebagai tujuan perutean
Beberapa peer dan perutean
- Dapat menggunakan beberapa peer WireGuard
- Saat menggunakan beberapa peer, AllowedIPs harus ditentukan agar wireproxy tahu ke peer mana trafik harus diteruskan
- Contoh konfigurasi menggunakan beberapa
[Peer]denganAllowedIPsyang berbeda serta beberapaTCPServerTunnel - Contoh
UDPProxyTunneljuga disertakanBindAddressmenentukan alamat bind lokalTargetmenentukan alamat tujuan- Jika
InactivityTimeoutbernilai0, maka tidak akan timeout
[Resolve]mengatur strategi resolusi DNSipv4: memprioritaskan record Aipv6: memprioritaskan record AAAAauto: nilai default, setara denganipv4jika antarmuka WireGuard hanya memiliki alamat IPv4, dan selain itu setara denganipv6
- Konfigurasi
[Peer]tanpa Endpoint dapat memungkinkan peer terhubung ke wireproxy
Health endpoint
--info/-imenerima alamat dan port sepertilocalhost:9080untuk mengekspos server HTTP yang menyediakan metrik health status- Saat ini ada dua endpoint yang diimplementasikan
/metrics: mengekspos informasi daemon WireGuard dan menyediakan informasi yang sama sepertiwg show/readyz: mengembalikan waktu terakhir menerima pong dari IP yang ditentukan diCheckAlivedalam bentuk JSON
- Jika
CheckAlivediatur, ping akan dikirim ke alamat yang ditentukan melalui WireGuard setiapCheckAliveIntervaldetik- Nilai default
CheckAliveIntervaladalah 5 detik - Jika pong tidak diterima dalam
CheckAliveIntervaldetik terakhir ditambah toleransi latensi 2 detik, akan mengembalikan 503 - Jika syarat terpenuhi, akan mengembalikan 200
- Nilai default
- Jika
CheckAlivetidak diatur,/readyzakan mengembalikan objek JSON kosong dan 200 - Peer yang menerima routing paket ICMP ping ditentukan oleh pengaturan AllowedIPs pada masing-masing peer
1 komentar
Komentar Hacker News
Alat kecil, tetapi bagus. Saya memakainya dengan multi-account containers di Firefox untuk memilih hanya tab tertentu, lalu mem-proxy-nya ke router rumah yang mendukung WireGuard tetapi tidak punya proxy lapisan aplikasi atau SSH
Saya kira untuk mengaturnya perlu ekstensi terpisah seperti https://addons.mozilla.org/en-GB/firefox/addon/container-pro..., ternyata tidak, dan sekarang sepertinya salah paham seperti itu pun jadi alasan untuk di-downvote
Untuk hal yang ingin saya lakukan dengan WireGuard, https://github.com/dariost/soks lebih cocok. Fungsinya hampir sama, tetapi memakai ulang interface WireGuard yang sudah ada
Cara pakainya saya tulis cukup detail di artikel ini: https://www.nicoco.fr/blog/2023/09/10/wireguard/
Alih-alih memakai tabel routing sebagai sarana kendali, tampaknya ia menentukan apakah akan memakai proxy SOCKS5 atau tidak
Dulu saya pernah melakukan hal serupa dengan container Docker di Raspberry Pi, tetapi solusi user space terlihat jauh lebih baik karena bisa berjalan di sistem operasi apa pun dan ada jaminan tidak akan tanpa sengaja merusak tabel routing host
Ada juga onetun: https://github.com/aramperes/onetun
Saya penasaran apakah ada juga implementasi server yang sepenuhnya di user space. Untuk melakukannya tanpa perangkat tun/tap sepertinya perlu semacam stack IP user space, meski saya tidak yakin
Dengan mengganti Dialer yang menghubungkan socket di Go, pada dasarnya socket bisa dibungkus dengan WireGuard. Karena berjalan di user space, tun/tap tidak diperlukan. Ini semua dirilis sebagai open source oleh @dpeckett
Dengan basis yang sama, ia juga membuat gateway WireGuard user space yang mencakup resolusi DNS: https://github.com/noisysockets/gateway
https://news.ycombinator.com/user?id=dpeckett
Sejauh yang saya pahami, ini memakai stack TCP/IP user space milik Google
Sepertinya bagus untuk menggantikan tunnel SSH yang biasa saya pakai saat perlu IP lain
Ada juga alat terkait bernama pproxy; salah satu fiturnya adalah bisa “mengonversi” berbagai protokol tunnel dan juga punya fitur routing. Saya pernah memakainya untuk mengubah SSH SOCKS5 menjadi proxy HTTP: https://github.com/moreati/pproxy
Saya sempat berpikir, “Hal seperti ini sepertinya cukup mudah dibuat dengan Go?” dan ternyata memang ditulis dengan Go
Beberapa klien proxy multiprotokol mendukung fitur ini. Contoh open source yang umum adalah sing-box, clash-meta dan klien lain berbasis clash, serta xray
Untuk klien closed source, ada Surge Mac/iOS
Ada banyak kemungkinan routing traffic yang kurang dikenal, dan ada juga implementasi Android. Dulu saya pernah mencobanya untuk membuka hotspot di SIM yang tidak mendukung hotspot dan Android yang tidak di-root
Namun, karena banyak berisi kode yang diambil dari berbagai tempat di internet dan komunitas developernya juga cukup unik karena berbagai alasan, saya selalu bertanya-tanya seberapa bisa dipercaya ini
Saya belum menggali dalam cara kerjanya, tetapi saya suka konsep menentukan domain mana yang di-proxy lewat VPN menggunakan grup aturan
Saya penasaran dengan performanya. Seingat saya, SOCKS “vanilla” sangat mudah disetel, yakni cukup menjalankan SSH dengan opsi yang tepat dan memberi tahu aplikasi untuk memakainya, tetapi cukup lambat
Alat ini sepertinya untuk kasus ketika tidak ada server SOCKS/SSH biasa, tetapi saya penasaran apakah ada keunggulan juga di sisi itu
Dalam pengalaman saya, SOCKS di atas SSH selalu punya performa cukup bagus, dan berbeda dari pendekatan seperti mode TUN OpenSSH yang menumpuk TCP di atas TCP
Meski begitu, saya sangat tertarik dengan solusi ini
Saya baru saja berpikir alangkah baiknya ada alat untuk mem-proxy semua koneksi email Thunderbird melalui Tailscale exit node, tetapi tanpa mengirim seluruh traffic ke exit node
tailscalebisa dipakai sebagai proxy SOCKS: https://tailscale.com/kb/1113/aws-lambdaMasukkan ini ke image container dan ekspos port SOCKS yang didengarkan tailscale, maka langsung jadi proxy
Jika membutuhkan hal seperti ini khusus untuk Mullvad VPN, saya pernah memakai https://github.com/imiric/mullvad-proxy dan hasilnya bagus
Itu bukan proyek saya; saya hanya mem-fork untuk pembaruan. Hal bagusnya adalah ia menyertakan tool CLI Mullvad sehingga sangat mudah berpindah server, dan semuanya terisolasi dari mesin host. Selain itu, karena “hanya” nginx dan beberapa skrip, dukungan SOCKS5 sepertinya juga akan baik-baik saja
https://mullvad.net/en/blog/wireguard-configuration-tool-has...