web-dev-qa-db-ja.com

プロキシチェーンはどのようにDNSリークを回避しますか?

また、直接関連していますが、プロキシチェーンを使用する場合、DNSサーバーはどのようにクエリされますか? ProxychainsにTorを使用していると仮定します。

Proxychains.confのDNS部分のコメントを外すと、リクエストがTorネットワークに直接送信されると考えられます。この場合、DNS解決はどのように行われますか?どの時点で? confファイルのその行のコメントを外すと、ISPのDNSサーバーへのクエリが回避されますか?

どうもありがとう。

1
4u53r

これの一部は、一般にプロキシチェーンがどのように機能するかということになります。任意のプログラム(プロキシサポートがある場合とない場合がある)からのトラフィックをプロキシするために、proxychainsは_LD_PRELOAD_環境変数を使用して、呼び出されるプログラムに共有ライブラリとして自分自身をロードします。これは「事前」にロードされているため、proxychainsライブラリによって公開される関数は他のものよりも優先されます。 libc。これにより、特定のネットワーク関連機能をフックできます。

たとえば、プログラムがTCPソケットでconnect()を呼び出すと、proxychainsは実際のconnect()関数を独自の関数に置き換え、代わりに構成されたプロキシを介してトラフィックを押し出す。

少し特殊なケースですが、DNSにも同じことが言えます。アプリケーションは、DNS解決を実行するためにgethostbyname()(廃止)またはgetaddrinfo()を呼び出します。 _proxy_dns_オプションが構成ファイルで指定されていない場合、proxychainsは変更されていないlibc関数を呼び出し、システムを介してDNSを正常に解決します。 _proxy_dns_オプションが存在する場合、どちらの関数も最終的にはかなり複雑なgethostbyname()の変更されたバージョンにリダイレクトされます。

この変更されたバージョンは、実際にはDNS解決をまったく行いません。代わりに、予約済みの224.x.x.xまたは225.x.x.xの範囲で偽のIPアドレスを作成し、要求されたホスト名をテーブル内のそれにマップします(例:_224.1.2.3 --> www.example.com_)。これは後で重宝します。

次に、アプリケーションは上記で返された偽のアドレス(224.1.2.3)に接続します。次に、Proxychainのフックされたconnectは、構成されたプロキシへの接続をセットアップします。次に、DNSテーブルで偽のIPアドレスを検索して、要求していた元のホスト名を取得します(プロキシチェーンによると、「224.1.2.3?これは "www.example.com"でした)。使用しているプロキシのタイプに応じて、プロキシ経由で元のホスト名への接続を要求します。プロキシは実際の宛先への接続を行うものであるため、DNS要求を実行します。

具体的には、次のコマンドを実行するとします。

_$ proxychains curl https://example.com
_

Tor SOCKS5サーバーは、次のようなプロキシチェーンからリクエストを受け取ります。

_Hello server! Connect me to www.example.com:443
_

Tor SOCKS5サーバーがすべてを処理します。 DNS解決を実行し、Torネットワーク経由でパケットを送信します。

TL; DR:_proxy_dns_設定が有効な場合、エンドから実際のDNS要求は行われません(または必要ありません)。

ソース: https://github.com/haad/proxychains/ でソースコードを読む

2
multithr3at3d