プロキシのローテーションとVPNは公開アドレスを異なる層で変え、その違いが何を漏らすかを決めます。VPNはすべてのパケットをトンネルに入れるため、ターゲットが見る送信元アドレスはトンネルの終点です。プロキシはネットワーク層の上に位置し、出口から見えるのはプロキシ経由で送ったリクエストだけですが、マシン上の他のすべては実際のアドレスを保ちます。この切り分けを正しく行えば、ローテーションはチェック項目から設計判断に変わります。

公開アドレスは実際どこから来るのか

ターゲットが見るアドレスは、あなたのトラフィックが最後に出た先であり、家庭の回線ではルーター上のプロバイダーのアドレスであって、マシンが持つものではありません。ルーターを再起動しても同じリースが返ることがあり、MACアドレスを変えると新しいものが得られることもありますが、どちらも国を選ぶ手段にはなりません。VPNはIP層で送信元アドレスを置き換えるため、DNSやバックグラウンド更新を含むマシンからのすべてのパケットがトンネルの終点から出ます。プロキシは一段上で動き、リクエストを受け取ってターゲットへの独自の接続を開き、そのリクエストだけが出口から見えます。マシン上の他のすべては依然として実際のアドレスを使います。

この切り分けがほとんどの驚きを説明します。プロキシに向けたブラウザ拡張はブラウザが送るものだけを変え、他は何も変えないので、同じホスト上の二つ目のアプリケーションは元のアドレスを漏らし続けます。システム全体のVPNは逆の失敗モードを持ち、ローカルに保ちたかったトラフィックまで覆い、クライアントがそう設定されている場合にだけ閉じます。どちらを選ぶかは、どのトラフィックを動かすかを選ぶことでもあります。

ローテーションは、選んだ層に適用されます。プロキシなら、ローテーションは次のリクエストが別の出口を使うことを意味します。VPNなら、トンネルを破棄して再構築することを意味し、遅く、目に見える再接続として現れます。

HTTPプロキシが読めるもの、読めないもの

平文のHTTPでは、プロキシはリクエスト行の絶対URI、すべてのヘッダー、本文を見て、それらすべてを記録し、どの部分でも書き換えられます。無料プロキシがレスポンスにスクリプトを注入するのは、プロトコルが許すことをそのまま行っているだけです。認証には Proxy-Authorizationを使い、資格情報がないか誤っている場合は接続エラーではなく 407 Proxy Authentication Required を返します。

HTTPSではクライアントが CONNECT host:port を送り、プロキシは生のトンネルを開き、その後は暗号化されたバイトを見ます。プロキシはCONNECT行から、そして通常はTLSハンドシェイクのSNIフィールドからホスト名を知るので、ペイロードが残らなくてもホスト名レベルの記録は残ります。ペイロードを読むには、クライアントが信頼する証明書でTLSを終端する必要があり、それは別のリスクを持つ別の製品です。そして HTTPセマンティクス仕様 はCONNECTをトンネルリクエストとして定義しており、出口が何を見られて何を見られないかの正しい思考モデルです。

curl -v -x http://proxy.example.net:8080 https://example.com 2>&1 | grep -E 'CONNECT|Proxy-'

詳細出力はTLSトラフィックの前にCONNECT行を示し、その瞬間にプロキシはあなたの宛先を知ります。407で応答するプロキシはトンネルを一度も開いていないので、別のTLS設定で再試行しても役に立ちません。

ローテーションの粒度が何を壊すかを決める

リクエストごとに回すのは、最も安全に見えて最も多くを壊す設定です。Cookie、CSRFトークン、サーバー側セッションは単一のIDに結び付いており、ログインと次の呼び出しの間で変わるIDはターゲットにはセッションハイジャックのように見えます。多くのプロバイダーはプロキシのユーザー名にセッションを符号化してスティッキーセッションを提供するので、選んだ時間枠の間は出口が固定されます。

粒度はタスクから選び、プロバイダーの既定値から選ばないでください。独立したページを取得するクローラーはリクエストごとに回せますが、決済フローや認証済みAPIはフロー全体で単一の出口を保つ必要があります。下の二つの呼び出しはスティッキーなユーザー名と単純な回転エンドポイントを示しており、 socks5h スキームは名前をローカルではなくプロキシ側で解決します。

curl -sS -x http://user-session-a1b2:[email protected]:8080 https://ifconfig.me
curl -sS -x socks5h://127.0.0.1:1080 https://ifconfig.me

ローカルDNSは静かな漏えいです。クライアントが接続前に名前を解決すると、HTTPリクエストが別の場所から出ても、リゾルバーは訪れるすべてのホストを知ります。そして socks5h 形式とプロキシ側の解決はそれを避け、使っても何のコストもかかりません。

ターゲットはアドレス以外に何を分類するか

アドレスの評判は複数ある入力のひとつです。ターゲットはASNとそのデータセンターか住宅かのラベル、クライアントのTLSフィンガープリント、HTTP/2設定、ヘッダーの順序、リクエスト頻度、ナビゲーションの形を組み合わせます。ヘッドレスブラウザーが動かす住宅用の出口は、実際のセッションが動かすデータセンターの出口が通るところで失敗することがあります。

出口の種類は、トラフィックについて正直に何を言えるかを決め、それぞれ異なるコストを伴います。

Exit typeWhat the target seesMain cost
Datacenter proxyHosting ASN, cheap, often pre-blockedLow reputation, easy to detect
Residential networkA consumer ISP address belonging to someone elseConsent and terms-of-service exposure
Mobile carrierA carrier NAT address shared by many subscribersPrice, plus shared blame for abuse
Your own cloud egressAn address you are accountable forRecognisable, but defensible

共有の出口は中立ではありません。そのアドレスから動く他のすべては同じ評判のバケツに入り、他のテナントにすでに焼かれたアドレスは、最初のリクエストが読まれる前に失敗します。

ポリシーで説明できる出口を選ぶ

有用な問いは、アドレスをどう隠すかではなく、そこから出るトラフィックの責任が誰にあるかです。タスクごとの自分のクラウド出口、データ処理契約と公開された保持期間を持つ契約プロバイダー、タスクごとに単一のIDを持つ自己ホストVPNは、どれも一文で説明できます。無料のリストはそうではなく、運営者にあなたへの義務がなく記録する動機しかないからです。

自分のレート制限はターゲットが許容する範囲より低く保ち、タスクに必要なフィールドだけを集めて、間違いを小さく保ちます。ブロックから逃れるために速く回すと、たいていはそれを引き起こしたリクエスト頻度が上がります。

書く 選んだ出口、そのローテーション枠、その所有者を 最初の実行前にジョブ設定へ。ブロックが来たとき、そのメモが出口を変えるべきか振る舞いを変えるべきかを教えてくれます。

関連記事