ProxyChains-NG はトンネルを作りません。起動した一つのプログラムの中で、ネットワーク関連の libc 呼び出しを置き換えるライブラリを事前に読み込むので、境界はプロセス内の呼び出しであり、デバイス全体の経路ではありません。この違いが、成功したテストが実際に何を証明するかを決めます。チェーン経由で動く curl が確認するのはフックされた一度の呼び出しであり、名前解決や UDP、すべての子プロセスが同じ経路を通ったことではありません。以下の手順は三段階で範囲を検証し、その後フックが届かないものを挙げます。

事前読み込みが接続に届くまで

起動時に、ランチャーは libproxychains を LD_PRELOAD に入れてから対象プログラムを実行します。ライブラリは本物の libc シンボルを解決し、connect や getaddrinfo といった関数を自前の版に差し替えます。それらのシンボルを通る呼び出しは、設定ファイルの SOCKS または HTTP プロキシへ書き換えられます。別の経路をたどる呼び出しはフックにまったく出会わないので、保証は呼び出し単位であり、マシン単位ではありません。

参加するのは動的リンクされたプログラムだけで、安全な実行下の setuid バイナリは事前読み込みを完全に無視します。子プロセスは環境を継承しますが、ランチャーがそれを保持している間だけです。

そのプロセスにライブラリが読み込まれていることを確認する

リクエストを開始し、起動したシェルではなく稼働中のプロセスを調べます。maps ファイルには、その時点でプロセスにマップされている共有オブジェクトがすべて表示されます。

proxychains4 -q curl -sS --max-time 8 https://example.com/ -o /dev/null &
pgrep -a curl
grep libproxychains /proc/$(pgrep -n curl)/maps

一致すればフックされたライブラリの存在は確認できますが、それは必要であって十分な条件ではありません。空の結果は通常、ランチャーより前に起動したインスタンスに URL を渡したブラウザなど、別のプロセスを調べたことを意味します。ほかを追う前に ldd でバイナリが動的リンクかどうかを確かめてください、なぜなら静的ビルドは事前読み込みをまったく読み込めないからです。次に、ランチャーが実際に使った設定のプロキシ一覧を読んでください、古いパスや閉じたポートではフックは働いてもチェーンが働かないからです。

プロセスから出ていく接続を追跡する

ライブラリの存在はすべての呼び出しが書き換えられたことを証明しないので、システムコールを追います。トレーサーの下でリクエストを一度実行し、ソケットが実際どこへ行ったかを読みます。

strace -f -e trace=connect -o /tmp/pc.trace proxychains4 -q curl -sS https://example.com/ -o /dev/null
grep -o "sin_port=htons([0-9]*)" /tmp/pc.trace | sort -u

トレースには自分のプロキシ宛ての接続だけが現れ、ポートは設定ファイルの項目と一致するはずです。対象サイトの宛先アドレスがトレースに直接現れるなら、その呼び出しはフックを迂回しており、それこそ探していた所見です。ファイル名を信じるのではなくポート番号をプロキシ一覧と比較してください、別プロジェクトの設定が残っているのは静かな直接アクセスのよくある原因だからです。トレースは受け入れ記録のために残してください、数秒で終わり範囲についての議論を決着させます。

フックが覆えないものを決める

proxychains-ng プロジェクトはリダイレクトを TCP に限定し、スクリプト、バックグラウンドプロセス、読み込まれたモジュールは本体と違う振る舞いをしうると警告しています。UDP と ICMP はこの仕組みの外にあるので、それらに頼るものには独自の対応経路が必要です。DNS は proxy_dns の設定とアプリケーション自身のリゾルバの挙動に従うため、HTTPS リクエストが一度成功しても名前解決については何も分かりません。証明書の検証も本来の場所に置いてください、プロキシ経由でサーバーに届くことは身元確認を切る理由にはなりません。

直接のフォールバックを不可能にしなければならないなら、ネットワーク名前空間やファイアウォール規則、VPN など、トラフィック自体を制御する強制境界を使い、ライブラリのフックとは分けて保ってください。フックは特定のプログラム向けの互換ツールであり、kill switch ではありません。プログラム、正確なコマンド、トレースで見たプロキシポート、DNS が遠隔で解決されたかどうかを記録してください、この四点が検証済みの範囲と希望の範囲の違いです。

関連記事