Vím o dvou SOCKS proxy, které podporují transparentní proxy pro jakékoli odchozí TCP spojení:Tor a redsocks. Na rozdíl od HTTP proxy mohou tyto SOCKS proxy transparentně zastupovat jakékoli odchozí TCP spojení, včetně šifrovaných protokolů a protokolů bez metadat nebo hlaviček.
Oba tyto proxy vyžadují použití NAT k přesměrování veškerého odchozího TCP provozu na lokální port proxy. Například, pokud používám Tor s TransPort 9040
na svém místním počítači bych potřeboval přidat pravidlo iptables takto:
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 9040
Pokud je mi známo, toto by nahradilo původní cílovou IP a port 127.0.0.1
a 9040
, takže vzhledem k tomu, že se jedná o šifrovaný stream (jako SSH) nebo bez hlaviček (jako whois), jak proxy zná původní cílovou IP a port?
Přijatá odpověď:
Dělá to takto:
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 přepíše původní cílovou adresu, ale pamatuje si starou. Kód aplikace jej pak může načíst dotazem na speciální volbu soketu SO_ORIGINAL_DST
.