SOCKS プロキシにホスト名への接続を求めることは、そのホスト名の DNS レコードを返すよう求めることと同じではありません。

プロキシは、要求された接続を確立する一環として名前を解決できます。その処理を別の適切な上流に渡すこともできます。クライアントが受け取るのは接続結果を記述した SOCKS の応答であり、一般的な DNS 応答ではありません。

CONNECT の場合、応答のバインドアドレスとポートは、プロトコルが定義するサーバー側のバインディングを表します。BND.ADDR を、接続先の解決済み IP の約束されたコピーとして扱わないでください。

アプリケーションが接続だけを必要とするなら、プロキシがどの接続先アドレスを選んだかを知らなくても、得られたストリームを使えます。DNS データ自体が必要なら、想定したリゾルバの位置とポリシーを持つ、実際に DNS を扱えるインターフェースを選んでください。

この区別は誤解を招く IP チェックも防ぎます。プロキシのバインドアドレス、接続先の IP、そしてウェブサイトから見える公開出口は別々の値です。同じハンドシェイクに現れたというだけで、一方を他方の名前で呼ぶべきではありません。

関連記事