GNU/Linux >> Linux の 問題 >  >> Linux

透過的なSocksプロキシは、どの宛先IPを使用するかをどのように認識しますか?

私が知っているSOCKSプロキシには、発信TCP接続の透過プロキシをサポートするTorとredsocksの2つがあります。 HTTPプロキシとは異なり、これらのSOCKSプロキシは任意のを透過的にプロキシできます。 暗号化されたプロトコルおよびメタデータやヘッダーのないプロトコルを含む、発信TCP接続。

これらのプロキシはどちらも、発信TCPトラフィックをプロキシのローカルポートにリダイレクトするためにNATを使用する必要があります。たとえば、TransPort 9040でTorを実行している場合 ローカルマシンでは、次のような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を要求することにより、それをフェッチできます。 。


Linux
  1. Telnetを使用してHTTPプロキシでCONNECTメソッドを使用するにはどうすればよいですか?

  2. Bashは、どのように呼び出されているかをどのように知っていますか?

  3. Python – / usr / bin / envはどのプログラムを使用するかをどのように知っていますか?

  1. エイリアスコマンドで`which`を使用する方法は?

  2. プロキシを永続的に使用するように curl を設定するにはどうすればよいですか?

  3. スワップを使用しているプロセスを知るにはどうすればよいですか?

  1. `sudo`はどのパスを使用して「」を検索しますか?

  2. GccはBoostがインストールされている場所をどのように知っていますか?

  3. 使用されているシリアルポートを見つける方法は?