opensshとproxychains-ngによるSOCKS Proxy経由のインターネット接続
次のようなネットワークにおいて、直接ルータに接続できないServer Bからインターネットにアクセスする方法のメモ。
具体的には、Server Aで起動しているSSHサーバに対してdynamic port forwardを行い、SOCKS Proxyとして利用する。 また、任意のコマンドでSOCKS Proxyを使うためにproxychains-ngを利用する。
Internet | [Router] | .1 ---+------+------------------------ 192.168.0.0/24 | .2 [Server A] [Server B] | .2 | .3 ----------+---------------+-------- 192.168.100.0/24
ここでは、Server BのOSがUbuntu Server 12.04 LTSの場合を例に説明する。
proxychains-ngのインストール
proxychains-ngは任意のコマンドでSOCKS Proxyを利用する、Proxifierと呼ばれるツールである。 proxychains-ngはネットワーク系のlibc関数を差し替えることにより、ほとんどのコマンドでSOCKS Proxyを通すようにできる。 また、SOCKSプロトコルの機能を使い、DNS名前解決をProxyサーバ側で行うことができる。 この点で、proxychains-ngは他のProxifierであるtsocksやオリジナルのproxychainsより洗練されているといえる。
前提として、ビルドツール一式のインストールとソースコードの取得を行っておく必要がある。
$ sudo apt-get install build-essential $ wget https://github.com/rofl0r/proxychains-ng/archive/v4.7.tar.gz
READMEを参考に、ソースコードからインストールを行う。
$ tar zxvf v4.7.tar.gz $ cd proxychains-ng-4.7 $ ./configure --prefix=/usr --sysconfdir=/etc $ make $ sudo make install $ sudo make install-config
proxychains-ngの設定
proxychains-ngの設定ファイルを書く。
$ sudo vi /etc/proxychains.conf strict_chain quiet_mode [ProxyList] socks5 127.0.0.1 1080
ここでは、opensshによるdynamic port forwardに使うポートとしてtcp/1080を利用する。
また、余計なログがターミナルに出力されないようにするためにquiet_mode
を有効にしておくとよい。
opensshを使ってSOCKS Proxyを確立する
Server AにSSH接続し、60分間有効なSOCKS Proxyを確立する。
$ ssh -D 1080 user@192.168.100.2 -f sleep 3600
-f
をつけることで、SSH接続をバックグラウンドで行うことができる。
proxychains4コマンドを使ってSOCKS Proxy経由で接続する
あとは、proxychains4コマンドを使うことにより任意のコマンドでSOCKS Proxyを通すようにできる。
たとえば、apt-getコマンドを利用する場合は次のようにする。 sudoコマンドを利用する場合は、sudoの後ろにproxychains4を置く。
$ sudo proxychains4 apt-get update [proxychains] config file found: /etc/proxychains.conf [proxychains] preloading ./libproxychains4.so Hit http://jp.archive.ubuntu.com precise Release.gpg Hit http://jp.archive.ubuntu.com precise-updates Release.gpg ... Reading package lists... Done
直接インターネットにアクセスできないサーバが、SSH接続したサーバを経由してインターネットにアクセスできていることが確認できる。