Skip to content

SSH ポートフォワード

施設のネットワークによってはセキュリティの関係で外部との通信を特定のポートに制限していることがあります. たとえば SSH 通信 (port 22) だけが許可されている場合には http の通信を使用して外部から情報を取得することができません. こうした環境では Python のパッケージマネージャ (pip) を使用することができないなどの問題があります. ここで紹介する proxychains は確立した ssh 通信を利用することでセキュリティの制限を越えて通信をする手段を提供します.1

ここでは SSH ポートフォワードと ProxyChains を使用します. セキュリティで保護されている計算機を remote, ネットワークの外部にある計算機を local と呼びます. remote に ProxyChains をインストールします. local では remote からの通信を通すための ssh プロセスを 2 つ立ち上げます. 最後に remote で通信をしたいプロセスを ProxyChains を経由して実行することで SSH ポートフォワードを実現します.

SSH ポートフォワードについては以下の記事を参照しました. このノートで紹介している方法はリバースダイナミックポートフォワードのパターン 1 に相当します.

Setup

Install ProxyChains

ProxyChains とは特定のネットワークを使用して通信するためのサポートをしてくれるプログラムです. プログラムのソースが SourceForge にてホストされています. ダウンロードして remote に転送します.

# proxychains-3.1.tar.gz を ${HOME}/downloads に転送しました.
# ソフトウエアを展開するディレクトリを ${HOME}/tools にします.
mkdir ${HOME}/.local  # インストール先を作成
cd ${HOME}/tools/
tar xvf ../downloads/proxychains-3.1.tar.gz
cd proxychains-3.1
./configure --prefix=${HOME}/.local
make && make install

proxychains~/.local/bin にインストールされるのでパスが通っていることを確認しましょう.

ProxyChains の設定ファイル ~/.proxychains/proxychains.conf を作成します. proxychains で使用する接続の設定をリストします. ここでは SOCK5 プロキシを使用すること, プロキシのアドレスは自分自身 (127.0.0.1) であること, 使用するポートは 8080 であることを明記しています. 末尾のポート番号は任意ですが他のプロセスや他の人の設定と被らないように注意しましょう.

[ProxyList]
sock5 127.0.0.1 8080

SSH port forward

remote 側の設定が終わったので local 側の準備をします. local では以下の 2 つの ssh プロセスを立ち上げます.

# 1st terminal on client
ssh -N -R 8080:localhost:8081 [login_information_for_remote_server]

# 2nd terminal on client
ssh -N -D 8081 localhost

1 つめのプロセスでは remote の 8080 ポートと local の 8081 ポートを対応付けます. これによって remotelocal のポートを介して通信ができるようになりますが, まだインターネットとの通信はできません. 2 つめのプロセスを起動することで remotelocal の 8081 ポートを介して外部と通信できるようになります. 1 つめの ssh プロセスのポート番号は ProxyChains の設定と合わせてください.

毎回 2 つのスクリーンを立ち上げるのはめんどう2ですし, 接続する計算機はだいたい固定されていたので, ssh プロセスを立ち上げるためのスクリプトを作成しました.

#!/bin/bash

## trap Ctrl-c to clean up screens
function cleanup() {
  echo "\nClean up screen..."
  screen -X -S proxy-1st quit
  screen -X -S proxy-2nd quit
}
trap cleanup INT

screen -dmS proxy-1st ssh -N -D 8081 localhost
screen -dmS proxy-2nd ssh -N -R 8080:localhost:8081 [remote]
screen -ls
cat
screen -ls

screen を使用してコマンドをバックグラウンドで立ち上げました. cat でキー入力待ち状態にしておきます. このプロセスは Ctrl-C で中断させることができます. 終了処理として起動したスクリーンを終了させます.

How to use ProxyChains

local で必要な ssh プロセスを立ち上げたら remote で ProxyChains を使用した通信ができるようになります.

$ proxychains curl http://www.example.com

上記のように実行したいコマンドの前に proxychains をつけて使用します. 通常ではポート 80 での通信はできないようになっている環境でも, proxychains をつけることで確立した SSH 接続を経由して外部と通信ができるようになります.


  1. セキュリティに穴を開けることになるので使用するときは十分に注意する必要があります. 

  2. ssh-f オプションを使用してバックグラウンドプロセスにするという方法もあります. 自分のケースでは一時的に有効にする場合が多かったので, 終了させることがめんどうな -f オプションは採用しませんでした.