nc, cURL, Chrome, openssl s_client, RDP で SOCKS プロキシーを使う(& socatのご紹介)

SOCKS 4 プロキシを経由しないとアクセス出来ない Web 環境(のSSL証明書)をテストする必要があったので、各試験用コマンドで SOCKS4 プロキシーを使う方法を調べました。また、その過程で socat というツールも見つかったのでご紹介します。

前提

以下、下記の前提で話を進めます。

  • プロキシーサーバのホスト名は proxy.example1.jp
  • プロトコルは SOCKS4、ポートは 1080/TCP
  • 試験対象(接続したい Web 環境)の URL は https://target.example9.jp/

クライアント側の作業環境は macOS High Sierra になりますが、CLIコマンドなどは Linux でも使用可能かと思います。

nc (netcat)

443/TCP が LISTEN しているか、そもそも作業環境・プロキシーサーバからアクセス出来るか(SG 等で許可されているか・いないか)を確認するために nc -z を使います。

-x オプションが SOCKS4 に対応しているので、コマンドラインは下記のようになります。

$ nc -x proxy.example1.jp:1080 -z target.example9.jp 443

cURL

SSL 証明書の情報を表示するために curl -Iv を実行します。

--proxy あるいは --preproxy オプションが SOCKS4 に対応しているので、そちらで指定します。

$ curl -Iv --proxy socks4://proxy.example1.jp:1080 https://target.example9.jp/

当初指定方法がよくなかったのか --proxy だと上手くいかないときがあったので --preproxy もご紹介していますが、本来はどちらも SOCKS4 に対応しています。--proxy の動作が思わしくない時には --preproxy も試してみて下さい。

--preproxy [protocol://]host[:port]
Use the specified SOCKS proxy before connecting to an HTTP or HTTPS -x, --proxy.

Chrome (一時的な利用)

コマンドラインでもいいのですけど、念のためにブラウザで表示・確認したい、という話はそこそこあるように思います。

Firefox なら普通に設定可能ですし、そもそも macOS も標準で SOCKS プロキシを設定可能です。FoxyProxy などの機能拡張を使うことも便利ですが、ちょっと確認するためだけにいろいろと設定を変えてしまうのは、戻すことを考えると面倒です。

Google Chrome をコマンドラインオプションを付けて起動することで、一時的に SOCKS プロキシーを使用する状態でブラウザが使えます。。

$ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
    --proxy-server="socks4://proxy.example1.jp:1080" \
    https://target.example9.jp/

既に Chrome が起動していると有効になりませんので、そこだけお気をつけください。

参考

openssl

SSL 証明書を試験する以上、openssl コマンドでの詳細確認を行いたくなるのですが、残念ながら標準では SOCKS4 プロキシに対応していません(HTTP プロキシには対応しています)。

仕方ないので、何かしらのリダイレクタを使用してポート転送してあげることにします。いろいろと探してみて socat が使いやすかったのでご紹介します。

socat

このソフトウェアは非常に多機能で、SOCKS4 以外のプロトコルにも幅広く対応しているのですが、今回の目的からは外れるので割愛します。

socat 自体は brew でインストール可能です。

$ brew install socat

手順としては、まず socat を使って作業環境とターゲットの Web 環境の間に TCP のトンネル( SOCKS プロキシサーバ経由)を作成し、そのトンネルを通って openssl コマンドが通信を行う順番になります。

トンネルは下記のように実行して作成します。

$ socat TCP4-LISTEN:8443 SOCKS4:proxy.example1.jp:target.example9.jp:443,socksport=1080

これで、作業環境の localhost、8443/TCP への通信が、そのまま target.example9.jp の 443/TCP へ転送されることになります。

( 1080/TCP は SOCKS プロトコルのデフォルトポートなので、,socksport=1080 は省略可能です)

openssl s_client

トンネルが出来れば、あとはそこを通って通信するだけです。もう一枚ターミナルを開き、openssl コマンドの接続先を localhost:8443 にして実行します。

$ openssl s_client -connect 127.0.0.1:8443 \
    -servername target.example9.jp </dev/null 2>/dev/null

おまけ : RDP via SOCKS4

今回の目的とは外れるのですが、socat を使うと本来対応していないアプリ・ソフトウェアも SOCKS4 経由で利用できます。

試しに Remote Desktop クライアントを使ってみました。RDP は 3389/TCP なので、下記のように実行します(RDP-TARGET-HOST.example9.jp が接続したい Windows サーバのホスト名、あるいは IP アドレスになります)。

$ socat TCP4-LISTEN:13389 SOCKS4:proxy.example1.jp:RDP-TARGET-HOST.example9.jp:3389

Remote Desktop クライアントの接続先は localhost:13389 にします。

この設定で接続することで、SOCKS プロキシ経由で RDP アクセス出来ます。ターゲットの Windows へログインした後、コマンドプロンプトから netstat などで確認してみて下さい。

もっとも、SOCKS4 に対応している RDP クライアントとして Parallels Client があるので、常用するならこちらを使う方が良いかと思います。

Parallels Client の記事としては、弊社植木の下記の記事をご参照ください。

macOSからWindowsにリモートデスクトップする時はParallels Clientがキーボード入力も快適でオススメ

まとめ

  • nccurlは SOCKS4 に対応している
  • Google Chrome はコマンドラインオプションでプロキシを一時的に設定できる
  • socat 超便利。opensslも Remote Desktop もこれ経由で使用可能