IO::Socket::Socks は接続に失敗したとき SOCKS のやり取りを出力できます。プロキシ、接続先、デバッグオプションを明示的に指定します:

use IO::Socket::Socks;

my $socket = IO::Socket::Socks->new(
    ProxyAddr   => 'proxy.example',
    ProxyPort   => 1080,
    ConnectAddr => 'www.example.com',
    ConnectPort => 80,
    SocksVersion => 5,
    SocksDebug  => 1,
    Timeout     => 10,
) or die $SOCKS_ERROR;

$socket->close();

モジュールは SocksDebug を、SOCKS トラフィックをプロトコル指向の形式で表示するものとして文書化しています。ネゴシエーションがどこまで進んだかを確認し、返された SOCKS 失敗コードを調べるために使います。

ProxyAddr と ProxyPort は中継役を識別します。SOCKS5 プロキシリストの未認証アドレスをこれらのフィールドに入力すれば、許可された公開 HTTP テストを行えます。ConnectAddr と ConnectPort は接続すべきサービスを識別します。リスナーへの到達エラーと SOCKS 接続の否定応答は別の観測です。

SOCKS5 のユーザー名/パスワード認証を要求するプロキシでは、文書化されたコンストラクタのフィールドに AuthType => 'userpass'、Username、Password があります。

ブロッキングコンストラクタが成功すると SOCKS 接続が確立され、返されたソケット経由のアプリケーション要求が後のアプリケーション結果をもたらします。HTTPS の接続先では、そのプロトコルの要求を送る前に SOCKS の後に検証済みの接続先 TLS を追加してください。資格情報が関わる場合、デバッグ出力は機密として扱ってください。

関連記事