利用を許可されたサーバーへのSSHアクセスがあれば、OpenSSHで自分のコンピューターにSOCKSの待受先を作れます。SSH接続が転送トラフィックを運び、リモートサーバーが接続先へ接続します。

ループバックだけで待ち受ける

ssh -N -T -o ControlPath=none -o ForkAfterAuthentication=no -o ExitOnForwardFailure=yes -D 127.0.0.1:1080 [email protected]

アカウントとホスト名を置き換えてください。SSHサーバーは転送を許可する必要があります。管理者はアカウントへのログインとは別に、転送や接続先を制限できます。

-D は動的転送を作り、明示したループバックアドレスが待受先をこのマシンに限定します。-N はリモートコマンドを実行せず、-T は疑似端末を割り当てません。ControlPath=none は既存の共有マスターを避け、ForkAfterAuthentication=no は今回の呼び出しをフォアグラウンドに保ちます。

プロキシを使う間はプロセスを動かしておきます。ポート1080が使用中なら、別の空いている高位ポートを選んでクライアント設定も更新してください。ExitOnForwardFailure=yes は待受先を作れなかった場合にSSHを終了させます。

SOCKS接続先を使う

curl --proxy socks5h://127.0.0.1:1080 --noproxy '' --connect-timeout 5 --max-time 15 https://example.com/

このリクエストはSOCKS5経由で接続先名の処理を委任します。他のアプリはそれぞれSOCKS設定が必要です。HTTPプロキシ欄では、この待受先とSOCKSで通信できません。

ポートを所有するプロセスの確認:

ss -ltnp 'sport = :1080'

意図したSSHプロセスがループバックの待受先を所有している必要があります。そこを通すリクエストで、リモートサーバーも接続先に到達できるか確認します。出口を調べる場合は、自分で管理する接続先で観測した出口を確認してください。

セッションの寿命

Ctrl-CはSSHプロセス、待受先、転送接続を閉じます。SSH接続が切れた場合もプロキシは利用不能になります。

ExitOnForwardFailure が確認するのは設定時の処理です。後の接続先への接続が失敗するたびにSSHを終了するわけではないため、セッション、ローカルポート、接続先へのリクエストを別々に調べてください。

関連記事