Cara Membangun Gateway Proxy ProxyScrape Bersama di Linux dengan Privoxy dan HAProxy
Ubah endpoint ProxyScrape SOCKS5 menjadi satu alamat proxy HTTP yang dapat digunakan seluruh tim Anda, dengan rotasi round-robin di beberapa upstream, pemeriksaan kesehatan, dan kontrol akses jaringan pribadi.
Ikhtisar
Pengaturan proxy per mesin tidak dapat diskalakan. Ketika beberapa orang, beberapa runner CI, dan beberapa kontainer semuanya membutuhkan kumpulan proxy yang sama, kredensial akhirnya disalin ke setiap peluncur dan skrip, dan tidak ada yang tahu lalu lintas mana yang menggunakan upstream mana.
Tutorial ini membangun kebalikannya: satu host Linux yang menyimpan kredensial ProxyScrape Anda sekali dan mengekspos satu alamat proxy HTTP ke jaringan pribadi Anda.
Client apps -> HAProxy (TCP :3128) -> Privoxy instances (127.0.0.1:8118-8120) -> ProxyScrape SOCKS5 -> Internet
Panduan ini menggunakan upstream ProxyScrape SOCKS5 karena front end lokal harus meneruskan nama pengguna dan kata sandi ke upstream, dan Privoxy mendukung kredensial untuk upstream SOCKS5 tetapi tidak untuk upstream HTTP. Jika Anda secara khusus perlu menghubungkan melalui upstream HTTP yang terautentikasi, gunakan alat penghubung yang mendukung autentikasi induk HTTP sebagai gantinya.
| Lapisan | Perangkat Lunak | Fungsinya |
|---|---|---|
| Client edge | HAProxy (mode TCP) | Memberi klien satu host dan port, menyebarkan koneksi baru ke instance proxy lokal, menghapus instance yang berhenti merespons |
| Proxy lokal | Privoxy | Menerima permintaan proxy HTTP dan meneruskan masing-masing ke satu endpoint ProxyScrape SOCKS5 |
| Upstream | ProxyScrape SOCKS5 | Menyelesaikan dan mengambil URL target menggunakan IP proxy dari kumpulan |
Satu konsekuensi praktis dari desain ini: rotasi terjadi per koneksi baru, bukan per permintaan. Klien yang menggunakan kembali koneksi keep-alive tetap berada di instance upstream yang sama sampai terhubung kembali.
Prasyarat
- Host Linux (keluarga Debian/Ubuntu atau RHEL/Fedora) dengan alamat stabil di jaringan pribadi, VPN, atau tailnet. Jangan mengekspos port gateway ke internet publik.
- Detail endpoint ProxyScrape SOCKS5 dari dasbor Anda: host, port, nama pengguna, dan kata sandi.
- Akses sudo, dan izin untuk membuka satu port (3128 dalam contoh di bawah) di jaringan pribadi.
- Keakraban dasar dengan unit systemd dan mengedit file konfigurasi.
Langkah-langkah
Langkah 1: Verifikasi endpoint ProxyScrape SOCKS5 sebelum membangun apa pun
Masukkan kredensial Anda ke dalam variabel shell agar pengujian selanjutnya tetap konsisten:
export PS_HOST="socks5-host-from-your-dashboard"
export PS_PORT="1080"
export PS_USER="your-username"
export PS_PASS="your-password"
Buat satu permintaan melalui endpoint secara langsung:
curl --silent --show-error \
--proxy "socks5h://${PS_USER}:${PS_PASS}@${PS_HOST}:${PS_PORT}" \
https://api.ipify.org
printf '\n'
Skema socks5h:// membuat curl mengirim pencarian DNS melalui proxy, yang Anda inginkan untuk gateway. Jalankan perintah dua atau tiga kali dan catat alamat yang muncul. Jika perintah pertama gagal, perbaiki kredensial atau host dan port sebelum melanjutkan, karena setiap lapisan setelah ini bergantung padanya.
Langkah 2: Instal Privoxy dan HAProxy
Debian dan Ubuntu:
sudo apt update
sudo apt install --yes privoxy haproxy
RHEL, Fedora, dan sistem yang kompatibel:
sudo dnf install --yes privoxy haproxy
Konfirmasi bahwa biner sudah ada dan catat path-nya, karena unit systemd di bawah ini merujuk langsung ke biner Privoxy:
command -v privoxy
command -v haproxy
Langkah 3: Buat satu instance Privoxy per upstream
Privoxy membaca satu file konfigurasi datar, yang memudahkan untuk menjalankan beberapa instance independen, satu per endpoint upstream. Mulailah dengan direktori untuk itu:
sudo mkdir -p /etc/privoxy/instances
Buat /etc/privoxy/instances/instance-1.conf:
confdir /etc/privoxy
logdir /var/log/privoxy
logfile instance-1.log
toggle 0
listen-address 127.0.0.1:8118
forward-socks5t / USERNAME:PASSWORD@HOST:PORT .
Ganti USERNAME, PASSWORD, HOST, dan PORT dengan nilai ProxyScrape SOCKS5 Anda.
toggle 0menonaktifkan penyaringan konten Privoxy. Gateway harus meneruskan lalu lintas tanpa diubah, bukan menulis ulang atau memblokirnya.listen-address 127.0.0.1:8118menjaga instance tetap privat ke host. HAProxy akan menjadi satu-satunya permukaan yang terekspos.forward-socks5tmengirim permintaan ke upstream SOCKS5 dan juga menyelesaikan DNS dari jarak jauh, sehingga nama host tidak diselesaikan dari jaringan Anda sendiri.- Garis miring
/di awal cocok dengan setiap URL dan titik.di akhir adalah bagian dari bentuk aturan penerusan SOCKS yang digunakan dalam dokumentasi Privoxy untuk Tor dan pengaturan serupa.
Amankan file, karena berisi kredensial:
sudo chown root:privoxy /etc/privoxy/instances/instance-1.conf
sudo chmod 640 /etc/privoxy/instances/instance-1.conf
Jika paket distribusi sudah memulai layanan Privoxy pada port 8118, hentikan dulu agar portnya bebas:
sudo systemctl disable --now privoxy
Uji instance di foreground:
sudo privoxy --no-daemon /etc/privoxy/instances/instance-1.conf
Di terminal kedua, kirim permintaan melaluinya:
curl --silent --proxy http://127.0.0.1:8118 https://api.ipify.org
printf '\n'
Jika itu mengembalikan alamat, bagian tersulit sudah selesai. Hentikan proses foreground dengan Ctrl+C dan ulangi file konfigurasi untuk setiap endpoint ProxyScrape tambahan yang ingin Anda gunakan, ubah hanya nama file log dan port listen.
Langkah 4: Jalankan instance sebagai layanan template systemd
Buat /etc/systemd/system/[email protected]:
[Unit]
Description=Privoxy proxy gateway instance %i
Documentation=man:privoxy(8)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=privoxy
Group=privoxy
ExecStart=/usr/sbin/privoxy --no-daemon /etc/privoxy/instances/instance-%i.conf
Restart=on-failure
RestartSec=3
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Jika command -v privoxy mencetak path yang berbeda, sesuaikan ExecStart agar cocok. Lalu aktifkan instance:
sudo systemctl daemon-reload
sudo systemctl enable --now privoxy-gateway@1 privoxy-gateway@2 privoxy-gateway@3
systemctl list-units 'privoxy-gateway@*' --no-pager
Konfirmasi setiap instance mendengarkan di port loopback-nya sendiri:
for port in 8118 8119 8120; do
printf '%s -> ' "$port"
curl --silent --proxy "http://127.0.0.1:${port}" https://api.ipify.org
printf '\n'
done
Setiap baris harus mengembalikan alamat, dan belum tentu alamat yang sama, karena setiap instance berbicara ke upstream-nya sendiri.
Langkah 5: Tempatkan HAProxy di depan sebagai penyeimbang beban TCP
Front end tidak perlu memahami HTTP. Itu hanya perlu meneruskan koneksi TCP, yang membuat mode TCP HAProxy cocok untuk proxy HTTP di depan upstream SOCKS5.
Cadangkan konfigurasi bawaan dan ganti /etc/haproxy/haproxy.cfg dengan yang berikut. Ubah 10.8.0.1 menjadi alamat privat host ini.
global
log /dev/log local0
maxconn 4000
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
defaults
mode tcp
log global
option tcplog
retries 2
timeout connect 10s
timeout client 5m
timeout server 5m
frontend proxy_gateway
bind 10.8.0.1:3128
default_backend privoxy_instances
frontend proxy_gateway_sticky
bind 10.8.0.1:3129
default_backend privoxy_instance_1
backend privoxy_instances
balance roundrobin
server privoxy1 127.0.0.1:8118 check
server privoxy2 127.0.0.1:8119 check
server privoxy3 127.0.0.1:8120 check
backend privoxy_instance_1
server privoxy1 127.0.0.1:8118 check
listen stats
bind 127.0.0.1:8404
mode http
stats enable
stats uri /stats
stats refresh 10s
Beberapa catatan tentang pilihan di sini:
- Port
3128adalah titik masuk rotasi. Setiap koneksi TCP baru dikirim ke instance Privoxy sehat berikutnya. - Port
3129disematkan ke satu instance untuk pekerjaan di mana Anda ingin setiap permintaan keluar melalui upstream yang sama selama durasi proses. - Kata kunci
checkbiasa melakukan pemeriksaan koneksi TCP, sehingga instance yang berhenti menerima koneksi akan otomatis dikeluarkan dari rotasi. - Halaman statistik hanya terikat ke loopback. Akses melalui terowongan SSH atau host lompat internal daripada membuka port 8404 ke jaringan.
Validasi dan muat ulang:
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl restart haproxy
systemctl --no-pager --lines=20 status haproxy
Langkah 6: Batasi akses ke jaringan pribadi Anda
Mengikat HAProxy ke alamat privat, VPN, atau tailnet berarti gateway hanya dapat dijangkau dari dalam jaringan tersebut. Jika host juga memiliki antarmuka publik, tambahkan aturan firewall agar tidak ada yang dapat menjangkau port proxy dari antarmuka itu.
Contoh nftables berikut bersifat opsional dan ditampilkan untuk ilustrasi. Terapkan dari sesi terminal kedua agar kesalahan tidak mengunci Anda dari mesin, dan sesuaikan rentang sumber dengan jaringan Anda sendiri:
sudo nft add table inet proxygw
sudo nft add chain inet proxygw input '{ type filter hook input priority 0; }'
sudo nft add rule inet proxygw input tcp dport { 3128, 3129 } ip saddr != 10.8.0.0/24 drop
Tumpukan ini tidak mengautentikasi klien; kontrol akses berasal dari jaringan tempat gateway terikat. Jika Anda memerlukan kredensial per orang, akhiri akses pengguna di VPN atau tailnet di depan host.
Langkah 7: Verifikasi rotasi secara menyeluruh
Kirim serangkaian permintaan terpisah ke port rotasi:
for i in $(seq 1 6); do
curl --silent --proxy http://10.8.0.1:3128 https://api.ipify.org
printf '\n'
done
Setiap pemanggilan curl membuka koneksi baru, jadi Anda akan melihat sebaran alamat daripada satu alamat yang berulang. Lalu buka halaman statistik (melalui terowongan jika perlu) dan konfirmasi bahwa setiap backend ditandai UP:
ssh -L 8404:127.0.0.1:8404 user@gateway-host
# in the browser on your workstation: http://127.0.0.1:8404/stats
Terakhir, arahkan klien nyata ke gateway, misalnya sesi shell yang menggunakan proxy untuk alat baris perintah:
export http_proxy="http://10.8.0.1:3128"
export https_proxy="http://10.8.0.1:3128"
curl --silent https://api.ipify.org
printf '\n'
unset http_proxy https_proxy
Perilaku rotasi versus sticky
Pilih port front-end yang sesuai dengan pekerjaan. Kedua opsi sudah dikonfigurasi di atas.
- Rotasi (
3128): koneksi baru didistribusikan ke semua instance yang sehat. Default yang baik untuk browser, penjelajahan umum, dan pekerjaan yang sering membuka koneksi baru. - Sticky (
3129): semua lalu lintas menuju satu instance. Baik untuk alur kerja yang harus menampilkan alamat sumber yang konsisten selama sesi. - Isolasi per grup: buat backend kedua dengan subset instance dan arahkan port front-end baru ke sana, sehingga satu tim tidak pernah menghabiskan seluruh kumpulan.
Pemecahan Masalah
| Gejala | Kemungkinan penyebab | Perbaikan |
|---|---|---|
| Privoxy mengembalikan respons 403 | Penyaringan konten diaktifkan dan aturan filter cocok dengan permintaan | Konfirmasi toggle 0 ada dalam konfigurasi instance dan mulai ulang instance tersebut |
| Privoxy mengembalikan 502 atau kesalahan koneksi upstream | Host, port, atau kredensial SOCKS5 salah | Jalankan ulang tes curl --proxy "socks5h://..." langsung dari Langkah 1 |
Semua backend ditampilkan sebagai DOWN di halaman statistik |
Instance Privoxy tidak berjalan atau tidak mendengarkan di tempat yang diharapkan HAProxy | Jalankan systemctl list-units 'privoxy-gateway@*' dan `ss -ltnp |
| Setiap permintaan keluar dari alamat yang sama | Klien menggunakan kembali koneksi keep-alive, atau hanya satu instance yang aktif | Paksa koneksi baru per permintaan, dan konfirmasi semua backend melaporkan UP |
| Nama host diselesaikan dari jaringan Anda sendiri | Instance menggunakan forward-socks5 bukan forward-socks5t |
Beralih ke forward-socks5t agar DNS diselesaikan melalui proxy |
HAProxy gagal memulai dengan kesalahan /dev/log |
Tidak ada soket syslog di host | Hapus baris log /dev/log local0, atau instal dan aktifkan layanan syslog |
| Unduhan besar habis waktu di tengah transfer | Timeout HAProxy default terlalu rendah untuk beban kerja | Naikkan timeout client dan timeout server di bagian defaults |
Ringkasan
Anda sekarang memiliki satu alamat proxy HTTP yang melindungi beberapa endpoint ProxyScrape SOCKS5, dengan pemeriksaan kesehatan otomatis di sisi HAProxy dan rotasi per koneksi pada port 3128. Kredensial berada dalam satu set file konfigurasi milik root daripada disalin ke setiap alat di setiap mesin.
Langkah selanjutnya yang wajar: tambahkan instance dan baris server setiap kali Anda ingin kapasitas upstream lebih, jaga file konfigurasi Privoxy keluar dari kontrol versi, dan rotasi kredensial dengan mengedit konfigurasi instance dan memulai ulang unit template satu per satu sehingga gateway tidak pernah sepenuhnya offline.