sshuttle vpnでサーバのリモート管理を便利に

データセンタに置かれたサーバに外部からネットワーク経由でアクセスし、電源のON/OFFやBIOS設定、OSインストールなどを行うことができれば、非常に便利です。
最近のサーバには、ネットワーク経由で電源をON/OFFしたり、コーンソール画面を操作するための、IPMI準拠のリモートマネージメント機能が備わっていることが多いので、既に利用されている方も多いと思います。
通常、サーバは、ファイアウォールによりネットワーク的に守られた場所にあるので、踏み台サーバにsshログインして、そこからアクセスしている場合も多いでしょう。
このような場合、リモートマネージメント機能を使うには、オフィスからデータセンタにvpnを張れると便利なのですが、vpnを張るのもなかなか面倒です。

今回、sshuttle(https://github.com/apenwarr/sshuttle)という、sshポートのみの開放でOKな、簡易vpnツールを見つけたので紹介したいと思います。


sshuttleはLinuxとMacOSで利用可能な、簡易vpnです。踏み台サーバにはssh経由でアクセスするので、SSHのDynamic Port forwardingによるSOCKS proxyにプラスアルファしたような働きをします。
プラスアルファの部分は何かというと、あるIPアドレス、あるネットワークアドレスに対しては、クライアントプログラムでは何の設定も無しに透過的にproxyを使うことができるということです。


たとえば、以下のポンチ絵の様に、client、proxy、targetの3台のマシンがあったとします。
                       |
                       |   sshd:22
 client <-----------> proxy <------------------> target(192.168.20.153)
                       |
                       |
ここで、clientとproxyの間にはファイアウォールがあり、proxyへは22番ポートへのアクセスしか許可されていません。したがって、当然ながらclientからtargetへも直接アクセスできません。
踏み台サーバproxy:22へのsshコネクションを経由してtargetへアクセスできるようにするには次のコマンドのみでOKです。
vaiox:~# sshuttle  -r ktaka@proxy:22 192.168.20.153
Connected.
これだけで、以下のようにclientとporxy間にトンネルが張られます。
                       |
     sshuttle<---->sshd:22
 client <-----------> proxy <------------------> target(192.168.20.153)
                       |
                       |
トンネルを張った後に、clientからtargetに http, https, vncなどでアクセスしようとすると、
sshuttle<---->sshd:22のトンネルを通り、targetにアクセスできるようになります。
                       |                http, https
   sshuttle<--->sshd:22  ------------------->
 client <-----------> proxy <------------------> target(192.168.20.153)
                       |
                       |
クライアントマシンで、どうなっているかを見てみると。
  • 192.168.20.153宛のパケットはTTL=42以外であれば、全て12300番ポートにリダイレクトしています
vaiox:~# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination      
sshuttle-12300  all  --  0.0.0.0/0            0.0.0.0/0        
Chain INPUT (policy ACCEPT)
target     prot opt source               destination      
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination      
sshuttle-12300  all  --  0.0.0.0/0            0.0.0.0/0        
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination      
Chain sshuttle-12300 (2 references)
target     prot opt source               destination      
REDIRECT   tcp  --  0.0.0.0/0            192.168.20.153       TTL match TTL != 42 redir ports 12300
RETURN     tcp  --  0.0.0.0/0            127.0.0.0/8         
  • 12300番ポートでは、pyhtonプログラム(sshuttle)が待ち受けています。
vaiox:~# netstat -lnp|grep 12300
tcp        0      0 127.0.0.1:12300         0.0.0.0:*               LISTEN      5059/python    
これにより192.168.20.153宛のパケットは、ほぼ(TTL=42を除き) sshuttleが張ったコネクションを通るということになるのです。


Comments