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


18

発信TCP接続の透過プロキシをサポートするSOCKSプロキシには、Torredsocksの 2つがあります。HTTPプロキシとは異なり、これらのSOCKSプロキシは、暗号化されたプロトコルやメタデータやヘッダーのないプロトコルなど、発信TCP接続を透過的にプロキシできます。

これらのプロキシは両方とも、NATを使用して発信TCPトラフィックをプロキシのローカルポートにリダイレクトする必要があります。たとえばTransPort 9040、ローカルマシンでTorを実行している場合、次のようなiptablesルールを追加する必要があります。

iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 9040

私の知る限り、これは元の宛先IPとポートを127.0.0.19040に置き換えます。これが暗号化されたストリーム(SSHなど)またはヘッダーのないストリーム(whoisなど)である場合、プロキシは元の宛先IPとポートをどのように知っていますか?

回答:


28

ここでは、それはそれをしない方法です。

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


1
素晴らしい答え!つまり、NATを処理しているのと同じコンピューターでプロキシソフトウェアを実行する必要があるということですよね?
hololeap 14年

4
絶対に、@ hololeap。プロキシサーバーをパケットリダイレクタとは異なるシステムで実行する場合は、CiscoのWCCPなどのプロトコルが必要です。
セラダ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.