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 ポートを対応付けます. これによって remote は local のポートを介して通信ができるようになりますが, まだインターネットとの通信はできません. 2 つめのプロセスを起動することで remote が local の 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 接続を経由して外部と通信ができるようになります.