外からファイルを持ってこれないサーバーにproxyトンネルを通す


##背景

あるDC内にあるサーバー(サーバーB)に限定IP(ホストA)からSSHで入れるようになったが、デフォルトGWはDC内限定なので、yumなどをしようとするとFWが邪魔してファイルを持ってくることができない。Google DNSなどを使って名前解決はできるし、ICMPは通る。

ホストA <==SSH==|=FW=> サーバーB <==> DC内NW

##解決方法
リモートでしか管理できないので、サーバーのデフォルトGWなどのネットワーク設定は変えたくない。
とりあえずyumとかが出来ればいいので、yumの通信をホストA経由にする方法。

つまり、サーバーBからホストAに対してSSHでダイナミックポートフォワーディングを張り、ホストAをSOCKSプロクシとして使う。

またCentOSに付いているyumだとsocks5プロクシが使えないので、他のproxyソフトを使う。調べるとtsock,proxychainなどがある。コンパイルが素直に通ったのがproxychainsだったので、ここではproxychainsを使う方法。

(他にもあるかもしれないけど、回りくどいが）

##手順

1.ホストAを起点にSSHリバースポートフォワーディングをサーバーBに張る。

```
hostA $ ssh -R 12222:(hostA IP):22 (server B IP) 
```

これでサーバーBからホストAに対してポート12222でSSHできるようになる。

2.サーバーBでSCREENを立ち上げ、そこからホストAにダイナミックポートフォワーディングを張る。

```
server B $ ssh -D8888 -p12222 (hostAでのユーザー名)@127.0.0.1
```

これでポート8888でホストA経由のSOCKS5プロクシとなる。

3.proxychainsをDLして、scpでホストA=>サーバーBへコピー
4.サーバーB上で、

```
server B $ tar vxzf proxychains-3.1.tar.gz
server B $ cd proxychains-3.1
server B $ ./configure; make
server B $ sudo make istall
```

これでproxychainsコマンドが使える。デフォルトでは/bin/proxychainsになる。
但しこのままだと、

```
ERROR: ld.so: object 'libproxychains.so.3' from LD_PRELOAD cannot be preloaded: ignored
```

こういうエラーがでるので、/bin/proxychainsを修正する。
proxychainsはスクリプトになっているので、vimなどで開いて

```
export LD_PRELOAD=libproxychains.so
を
export LD_PRELOAD=/lib/libproxychains.so
に修正する
```

また/etc/proxychains.confを開いて

```
[ProxyList]
socks5  127.0.0.1 8888
```

とする。

以上で、proxychainsコマンドでyumなどができる。

```
server B $ sudo proxychains yum install lynx
```

##VPNを張る

ここまではsshコネクションでsocks5プロクシとする場合だったが、更にtun,tapデバイスを作ることでvpnを張ることができる。ここではtapデバイスを作りL2ブリッジにする場合。

server側がNAT内になっているので、ここではserverをvpnクライアント、host側をvpnサーバーとする。
設定は、
- デバイス名tap0
- vpnサーバー(host)IPアドレス 10.0.0.1
- vpnクライアント(server)IPアドレス 10.0.0.2
とする

server側で、vpnクライアントとして、鍵生成を行う。
スクリプト制御を行ったり、自動起動する場合はパスフレーズなしの設定とする。

```
server # ssh-keygen -f /root/.ssh/vpntest
```

ここでprivate keyとpublic keyができるので、public keyをvpnサーバー側(host)へ持って行き、/root/.ssh/authorized_keysへ追加する
追加のさいに以下のcommandを追加するpublic keyに加える

```
 no-X11-forwarding,no-agent-forwarding,no-pty,command="ifconfig tap0 10.0.0.1 netmask 255.255.255.0" ssh-rsa ...
```

また、vpnサーバー側(host)のsshd_configを

```
  PermitTunnel ethernet
```

とし、sshdサービスをreloadする。

vpnクライアント(server)では、/root/.ssh/configまたは/etc/ssh/ssh_configに以下のような設定を加える。
これまでのポートフォワーディング設定で、localhostの12222がvpnサーバー(host)に向いているので、そのように設定する。

```
Host vpntest2
  HostName 127.0.0.1
  Port 12222
  IdentityFile /root/.ssh/vpntest
  Tunnel ethernet
  TunnelDevice 0:0
  #RequestTTY no
  PermitLocalCommand yes
  LocalCommand ifconfig tap0 10.0.0.2 netmask 255.255.255.0
```

(CentOSデフォルトのsshではRequestTTYオプションがつけられないので、コメントアウト)

```
# ssh vpntest2
```
でトンネルが張られるので、routeコマンドなどで確認する。

先ほどのRequestTTYの代わりに-Tオプションでの起動でバックグラウンド化することができる。

```
# ssh -T vpntest2
```

参考:
SSHポートフォワーディング
http://www.xdip.com/?id=ssh-tunnel
http://www.xmisao.com/2013/09/12/ssh-portforwarding.html
http://qiita.com/yakumo3/items/1e3be0a6e2190f11a4c0
ProxyChains
http://proxychains.sourceforge.net/
http://blog.kteru.net/proxychains-tips/
http://askubuntu.com/questions/293649/proxychains-ld-preload-cannot-be-preloaded
SSH VPN
http://www.usupi.org/sysad/248.html

Proxychains-ng
http://inaz2.hatenablog.com/entry/2014/08/20/004106