私が知っている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
を要求することにより、それをフェッチできます。 。