web-dev-qa-db-ja.com

透過SOCKSプロキシはどのように使用する宛先IPを知るのですか?

私が知っている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.19040に置き換えるため、これは暗号化されたストリーム(SSHなど)またはヘッダーのないストリーム( whois )、プロキシはどのようにして元の宛先IPとポートを知るのですか?

18
hololeap

ここ はそれを行う方法です:

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

30
Celada