2 poin oleh GN⁺ 2024-04-03 | 1 komentar | Bagikan ke WhatsApp
  • 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] dari wg-quick, dapat mengimpor file konfigurasi WireGuard yang ada melalui WGConfig, atau merutekan beberapa peer dengan AllowedIPs
  • Untuk operasional, tersedia health endpoint berbasis --info/-i, dengan /metrics dan /readyz untuk memeriksa status WireGuard dan status kesiapan berbasis CheckAlive

Apa yang dilakukan Wireproxy

  • wireproxy adalah 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
    • -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.2 atau @latest

Model konfigurasi

  • Konfigurasi [Interface] dan [Peer] mengikuti makna yang sama dengan konfigurasi wg-quick
  • Address harus menggunakan subnet /32 untuk IPv4 dan /128 untuk IPv6
  • PrivateKey juga 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 ProxyCommand di openssh
  • 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 CertFile dan KeyFile ditentukan, 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] dengan AllowedIPs yang berbeda serta beberapa TCPServerTunnel
  • Contoh UDPProxyTunnel juga disertakan
    • BindAddress menentukan alamat bind lokal
    • Target menentukan alamat tujuan
    • Jika InactivityTimeout bernilai 0, maka tidak akan timeout
  • [Resolve] mengatur strategi resolusi DNS
    • ipv4: memprioritaskan record A
    • ipv6: memprioritaskan record AAAA
    • auto: nilai default, setara dengan ipv4 jika antarmuka WireGuard hanya memiliki alamat IPv4, dan selain itu setara dengan ipv6
  • Konfigurasi [Peer] tanpa Endpoint dapat memungkinkan peer terhubung ke wireproxy

Health endpoint

  • --info/-i menerima alamat dan port seperti localhost:9080 untuk 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 seperti wg show
    • /readyz: mengembalikan waktu terakhir menerima pong dari IP yang ditentukan di CheckAlive dalam bentuk JSON
  • Jika CheckAlive diatur, ping akan dikirim ke alamat yang ditentukan melalui WireGuard setiap CheckAliveInterval detik
    • Nilai default CheckAliveInterval adalah 5 detik
    • Jika pong tidak diterima dalam CheckAliveInterval detik terakhir ditambah toleransi latensi 2 detik, akan mengembalikan 503
    • Jika syarat terpenuhi, akan mengembalikan 200
  • Jika CheckAlive tidak diatur, /readyz akan mengembalikan objek JSON kosong dan 200
  • Peer yang menerima routing paket ICMP ping ditentukan oleh pengaturan AllowedIPs pada masing-masing peer

1 komentar

 
GN⁺ 2024-04-03
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

    • Baru tahu bahwa multi-account containers mendukung pengaturan proxy per kontainer
      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
    • Saya penasaran kalau ada materi bagus yang menjelaskan cara menyiapkan konfigurasi seperti ini
  • 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/

    • Ini cukup berbeda. wireproxy tampaknya menyertakan implementasi TCP dan WireGuard di user space, sedangkan soks lebih mirip router IP yang hanya bisa menangani TCP
      Alih-alih memakai tabel routing sebagai sarana kendali, tampaknya ia menentukan apakah akan memakai proxy SOCKS5 atau tidak
    • Saya penasaran kenapa yang itu lebih cocok
      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

  • 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

    • Betul. Proxy multiprotokol seperti ini mungkin dibuat untuk melewati Great Firewall China, dan ini ekosistem kecil yang menarik
      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
    • Di sisi closed source, Cloudflare WARP juga bisa berjalan dalam mode proxy. Jika konfigurasi WARP dikonversi menjadi konfigurasi WireGuard biasa, akun gratis pun bisa dipakai seperti ini
    • Yang tampaknya hampir satu-satunya berjalan stabil di China adalah clash + v2ray. Sebagian besar penyedia VPN besar mengklaim bisa dipakai di China, tetapi kenyataannya tidak
      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

    • Saya penasaran apa yang dimaksud dengan SOCKS “vanilla”. Saya tidak tahu ini dibandingkan dengan implementasi SOCKS lain yang mana
      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
    • Akan menarik kalau keduanya dibandingkan. Saat ini saya membuat proxy SOCKS lewat SSH setelah terhubung ke WireGuard, dan ternyata berjalan cukup baik
      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

    • CLI tailscale bisa dipakai sebagai proxy SOCKS: https://tailscale.com/kb/1113/aws-lambda
      Masukkan ini ke image container dan ekspos port SOCKS yang didengarkan tailscale, maka langsung jadi proxy
    • Bisa juga memasang 3proxy atau squid proxy di mesin tempat exit node berjalan. Semua mesin di tailnet dapat melihatnya
  • 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