[小ネタ?] Windows 10でSOCKSプロキシサーバーを利用する方法

2021.09.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

弊社では特定用途向けにSOCKSプロキシサーバーを利用することがあります。

本記事ではクライアントにWindows 10を使いSOCKSプロキシサーバーを利用する際のハマりポイントなどをまとめてみます。

OS基本設定

従来WindowsクライアントOSのプロキシ設定はインターネットオプションの「接続」からプロトコル別に記述する形を採っていましたが、Windows 10からは「設定」の「ネットワーク」からも設定可能となっています。

ただ、この新しい「設定」は各プロトコルをまとめた記述を前提としており、例えば下図の様にプロキシーサーバーに「proxy.example.com」と記載するとSOCKS以外のプロトコルを使用する設定となってしまいます。

この設定をインターネットオプションから見るとこの様になります。
一番欲しいSOCKSサーバーの設定がありません...

残念ながらこの設定はHTTP(HTTPS)プロキシ前提であり、SOCKSプロキシは有効になっていません。
この新しい「設定」を使いつつSOCKSプロキシを設定するには、

socks=proxy.example.com

の様にsocks=形式にしてやる必要があります。

こうしてやるとインターネットオプションは以下の様にSOCKSプロキシを使う形となります。

また、プログラムからプロキシ設定を行う場合については以前書いた記事の内容を参考にしてください。

こちらはEC2用向けに書きましたがクライアントOSでも使えます。
PowerShellからプロキシ指定する際もsocks=形式にしてやれば大丈夫です。

Add-Type -TypeDefinition $source
# APIからSOCKSプロキシ設定する場合 socks= 形式にする
[SetProxy.ProxyRoutines]::SetProxy($true, $false, 'socks=proxy.example.com:1080', '', '', '')

余談

ちなみにですが新しい「設定」を使わずインターネットオプションで設定しても構いません。
ただしその場合「設定」から内容を参照するとhttp://socks=proxy.example.comとおかしな表示になるのでご注意ください。
(更新するときはhttp://の部分を除去しないとダメです)

アプリケーション毎のプロキシ設定

OSのプロキシ設定は前節の通りですが、全てのアプリケーションがOS設定に従うわけではなく

  • OSのプロキシ設定に従うアプリケーション
  • 独自のプロキシ設定を持つアプリケーション
  • プロキシ非対応のアプリケーション

それぞれに分かれます。
本記事では主要ないくつかのアプリケーションのプロキシ設定について解説します。

1. WEBブラウザ

WEBブラウザのプロキシ設定はブラウザ毎で別々です。
例えばInternet ExplorerやMicrosoft Edge、Google ChromeはOSのプロキシ設定に従いますし、Firefoxは独自のプロキシ設定を使うことも可能です。

(Firefoxのプロキシ設定画面。OS設定に従う他に独自のプロキシ設定を指定することも可能)

2. コマンドプロンプト

私の調べた限りではコマンドプロンプト自体に対するプロキシ設定は無いです。

Microsoftのドキュメント等でnetshコマンドを使いWinHTTPのプロキシ設定を設定する手順が紹介されていますが、WinHTTPはコマンドプロンプト用ではなくWindows Updateなどバックエンドサービス向けのプロキシ設定です。
またhttp_proxyなどの環境変数はその環境変数をサポートするアプリケーション側の機能となりすべてのプログラムが対応してるわけでもありません。

コマンドプロンプト上でプロキシ設定を考える必要がある場合は都度実行するアプリケーションがプロキシ対応しているか検討する必要があります。

3. PowerShell

PowerShellのプロキシ設定はちょっと厄介です。

PowerShellのWEB関連のコマンドレット(Invoke-WebRequestInvoke-RestMethodなど)には-Proxyパラメーターが存在しており、指定したプロキシサーバーを経由したWEBアクセスが可能となっています。

# -Proxy パラメーターでプロキシサーバーを指定可能
Invoke-RestMethod -Uri http://checkip.amazonaws.com -Proxy http://proxy.example.com:8080

ただし、PowerShellおよびその基盤となる.NET Framework/.NETにおいて現時点ではSOCKSプロキシは非対応です。
年末ごろにGAが予定されている.NET 6でやっとSOCKSプロキシに対応してくれます。

このため.NET 6を基盤とする予定のPowerShell 7.2以前のリリースではSOCKSプロキシは使えません。

(PowerShell 7.1より前のバージョンではSOCKSプロキシに対応していない)

(.NET 6基盤のPowerShell 7.2であればSOCKSプロキシが使える)

4. Windows Subsystem for Linux (WSL)

WSLは基本的にWindows環境とは独立したLinux環境と考えればOKです。
大抵の場合はhttp_proxy環境変数を設定すれば問題ないでしょう。

# Bash on WSLの場合
export http_proxy=socks5://proxy.example.com:1080

アプリケーション毎に個別の設定ファイルを持つ場合はそのアプリケーションの流儀に従ってください。

5. リモートデスクトップ接続

Windows標準のリモートデスクトップ接続(mstsc.exe)はプロキシ経由の接続に対応していません。
唯一サポートしているのは標準のRD Gateway経由の接続のみです。

このためプロキシ経由でリモートデスクトップ接続したい場合はParallels Clientといった別クライアントを使う必要があります。

(Parallels Clientのプロキシ設定画面)

6. その他アプリケーション

最新のWindows 10であればcurl.exessh.exeコマンドが標準で提供されています。
例えばcurlであれば-xオプションやhttp_proxy環境変数をサポートしてますので、プロキシ対応していないコマンドプロンプトやPowerShell上でもプロキシ経由のアクセスが可能です。

REM curlコマンドは -x オプションでプロキシ指定可能
curl.exe http://checkip.amazonaws.com -x socks5://proxy.example.com:1080

REM curlは http_proxy 環境変数をサポート
SET http_proxy=socks5://proxy.example.com:1080
curl.exe http://checkip.amazonaws.com

同様にsshコマンドもProxyCommandオプションでプロキシ経由の接続が可能です。
WSL環境であればLinuxと同じですので以下の様な感じでサクッとプロキシ経由の接続ができます。

# WSL環境ならncコマンドを使ってこんな感じでいける
ssh <remote user>@<remote host> -o ProxyCommand='nc -x proxy.example.com %h %p'

ただ、残念ながらWindowsホストには標準でnc(or netcat)コマンドは提供されていません。
このためNcatといったツールで代替してやる必要があります。

REM Windows用Ncatを使う場合はオプションが若干違うので注意
REM また、ncat.exeはフルパス指定にする必要があります
ssh.exe <remote user>@<remote host> -o ProxyCommand="<Full path to ncat>\ncat.exe --proxy-type socks5 --proxy proxy.example.com:1080 %h %p"

まあ、SSHに関しては無理にssh.exeで頑張らなくてもTera TermやPuTTyを使うほうがWindowsユーザーには合っているかもしれません...

おまけ : Proxifierを使ってみた

DevelopersIOの過去記事でProxifierを使って任意のアプリをプロキシ経由にする方法が紹介されていました。

上記記事はMacで試してますが、せっかくなので私もWindowsで試してみました。
今回は現時点の最新バージョンであるProxifier v4.05をインストールしています。

インストール手順はインストーラーの内容に従うだけなので割愛します。
アプリケーション起動直後の画面はこんな感じです。

前掲の記事と基本的な使い方は変わらない様で、まずは使用するプロキシサーバーを登録、

次にRuleを登録。今回はWindows PowerShell(powershell.exe)をプロキシ経由にする設定としてみました。

この設定を施した時点でWindows PowerShellを起動するとネットワーク通信がプロキシ経由になってくれます。

(具体的なIP等お見せできないためわかりにくいですが、良い感じにプロキシ経由になっています)

ちなみに標準のリモートデスクトップ接続(mstsc.exe)も気持ちラグが出る感じでしたがプロキシ経由で使えるのを確認しました。

最後に

以上となります。

軽い気持ちで書き始めたのですが予想外のボリュームになりました。
基本的にはSOCKSプロキシについて書いてますが他のプロトコルでも該当することが多くWindows 10におけるプロキシ利用全般のTipsとしても使えると思います。

本記事がみなさんの役に立てば幸いです。