Bagaimana proksi SOCKS transparan mengetahui IP tujuan mana yang akan digunakan?


18

Ada dua proksi SOCKS yang saya tahu tentang yang mendukung proxy transparan untuk koneksi TCP keluar: Tor dan redsocks . Tidak seperti proksi HTTP, proksi SOCKS ini dapat secara transparan mem - proxy setiap koneksi TCP keluar, termasuk protokol dan protokol terenkripsi tanpa metadata atau header.

Kedua proksi ini memerlukan penggunaan NAT untuk mengalihkan lalu lintas TCP keluar ke port lokal proxy. Misalnya, jika saya menjalankan Tor dengan TransPort 9040di 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.1dan 9040, jadi mengingat ini adalah aliran terenkripsi (seperti SSH) atau yang tanpa header (seperti whois ), bagaimana proksi mengetahui IP dan port tujuan asli?

Jawaban:


28

Inilah cara melakukannya:

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 mengganti alamat tujuan asli tetapi ia mengingat yang lama. Kode aplikasi kemudian dapat mengambilnya dengan meminta opsi soket khusus SO_ORIGINAL_DST,.


1
Jawaban yang luar biasa! Jadi ini berarti Anda harus menjalankan perangkat lunak proksi di komputer yang sama dengan yang menangani NAT, bukan?
hololeap

4
Tentu saja, @hololeap. Jika server proxy dijalankan pada sistem yang berbeda sebagai pengarah paket maka Anda memerlukan protokol seperti Cisco's WCCP .
Celada
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.