読者です 読者をやめる 読者になる 読者になる

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接続したサーバを経由してインターネットにアクセスできていることが確認できる。