##背景
ある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