私が知っている2つのSOCKSプロキシは、すべての発信の透過プロキシをサポートしていますTCP接続: Tor および redsocks 。HTTPプロキシとは異なり、これらのSOCKSプロキシは透過的にプロキシできますany発信TCP暗号化されたプロトコルおよびメタデータまたはヘッダーのないプロトコルを含む接続。
これらのプロキシは両方とも、NATを使用して、すべての発信TCPトラフィックをプロキシのローカルポートにリダイレクトするために使用する必要があります。たとえば、TransPort 9040
私のローカルマシンでは、次のようなiptablesルールを追加する必要があります。
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 9040
私の知る限り、これは元の宛先IPとポートを127.0.0.1
と9040
に置き換えるため、これは暗号化されたストリーム(SSHなど)またはヘッダーのないストリーム( whois )、プロキシはどのようにして元の宛先IPとポートを知るのですか?
ここ はそれを行う方法です:
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は元の宛先アドレスを上書きしますが、古いアドレスを記憶しています。アプリケーションコードは、特別なソケットオプションSO_ORIGINAL_DST
。