Ada dua proksi SOCKS yang saya ketahui yang mendukung proksi transparan untuk koneksi TCP keluar apa pun:Tor dan redsocks. Tidak seperti proxy HTTP, proxy SOCKS ini dapat secara transparan mem-proxy apa saja koneksi TCP keluar, termasuk protokol dan protokol terenkripsi tanpa metadata atau header.
Kedua proxy ini memerlukan penggunaan NAT untuk mengarahkan ulang lalu lintas TCP keluar ke port lokal proxy. Misalnya, jika saya menjalankan Tor dengan TransPort 9040
di mesin lokal saya, saya perlu menambahkan aturan iptables seperti ini:
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 9040
Sepengetahuan saya, ini akan menggantikan IP dan port tujuan asli dengan 127.0.0.1
dan 9040
, jadi mengingat ini adalah aliran terenkripsi (seperti SSH) atau tanpa header (seperti whois), bagaimana proxy mengetahui IP dan port tujuan asli?
Jawaban yang Diterima:
Begini caranya:
static int getdestaddr_iptables(int fd, const struct sockaddr_in *client, const struct sockaddr_in *bindaddr, struct sockaddr_in *destaddr)
{
socklen_t socklen = sizeof(*destaddr);
int error;
error = getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, destaddr, &socklen);
if (error) {
log_errno(LOG_WARNING, "getsockopt");
return -1;
}
return 0;
}
iptables menimpa alamat tujuan asli tetapi mengingat yang lama. Kode aplikasi kemudian dapat mengambilnya dengan meminta opsi soket khusus, SO_ORIGINAL_DST
.