目次

SSHでトンネル経由でログイン

多段ssh のはなし。

-t オプション

外部のネットワークから特定のLAN内のサーバにアクセスしたい。
ただし、特定のLANにはプロキシ(踏み台)サーバを経由しないといけない。

通常なら、プロキシサーバにSSHログインして、目的のサーバにSSHログイン。

[root@client ~]# ssh 1.2.3.4 -p 2222
root@1.2.3.4's password: 
Last login: Wed Nov 26 13:14:24 2014 from 1.3.4.5
[root@adm ~]# ssh db
Last login: Wed Nov 26 13:16:41 2014 from adm
[root@db ~]# 

でも、SSHコマンドって、『SSH サーバ “コマンド”』で、対象サーバ内でコマンドの実行ができる。

[root@client ~]# ssh 1.2.3.4 -p 2222 "free"
root@1.2.3.4's password: 
             total       used       free     shared    buffers     cached
Mem:       8196648    8034528     162120          0     278368    5567024
-/+ buffers/cache:    2189136    6007512
Swap:      4194300          0    4194300

それなら、『SSH サーバ “SSH サーバ”』でSSHログインできるのでは?

[root@client ~]# ssh 1.2.3.4 -p 2222 "ssh db"
root@1.2.3.4's password: 
Pseudo-terminal will not be allocated because stdin is not a terminal.

失敗。
『仮想端末が割り当てられていない』ということだそうな。
では、SSHのマニュアルを参考に。

SSH (1)
http://www.unixuser.org/~euske/doc/openssh/jman/ssh.html

-t
強制的に仮想端末を割り当てます。これはリモートマシン上で任意の画面ベースのプログラムを実行するとき(たとえば、メニューサービスを実装するときなど)に非常に便利です。複数の-t をつけると、たとえssh がローカル側での端末を持っていない場合でも強制的に仮想端末を割り当てます。
[root@client ~]# ssh -t 1.2.3.4 -p 2222 "ssh db"
root@1.2.3.4's password: 
Last login: Thu Nov 27 17:41:23 2014 from adm
[root@db ~]# 

できた。

ちなみに、rsyncでは-tオプションがいらない。
e.g. プロキシ経由でdbサーバのログをローカルに取得する。

rsync -av -e 'ssh root@1.2.3.4 -p 2222 ssh 'db:/var/log/mysql/  /var/log/mysql/

ただし、一般的には以下のncやProxyCommandを使うことが多いみたい。

nc(netcat)コマンド

ncを使う場合
ただし、プロキシサーバにncがインストールされている必要がある。

[root@client ~]# vi .ssh/config
Host proxy
  HostName 1.2.3.4
  Port 2222

Host db
  HostName 1.4.5.6
  Port 22
  ProxyCommand ssh proxy nc %h %p
[root@client ~]# ssh db
root@1.2.3.4's password: 
root@1.4.5.6's password: 
Last login: Wed Nov 26 13:12:48 2014 from adm
[root@db ~]#

-W オプション

ncを使わない(-Wオプションを使う)場合
ただし、SSHのバージョン(~CentOS5.3?)によっては-Wオプションが使えない。

[root@client ~]# vi .ssh/config
Host proxy
  HostName 1.2.3.4
  Port 2222

Host db
  HostName 1.4.5.6
  Port 22
  ProxyCommand ssh proxy -W %h:%p
[root@client ~]# ssh db
root@1.2.3.4's password: 
root@1.3.4.5's password: 
Last login: Wed Nov 26 13:16:01 2014 from adm
[root@db ~]# 

これで、scpによる直接コピーなんかもできる。
e.g. プロキシ経由でdbサーバのログをローカルに取得する。

scp db:/var/log/mysql/ /var/log/mysql/

特定の踏み台サーバを経由するものを一括指定

Host login
  User         www
  HostName     fumidai.com
  Port         2222
  IdentityFile ~/.ssh/id_rsa_www

Host web01
  HostName     web01

Host web02
  HostName     web02

Host web*
  User         www
  IdentityFile ~/.ssh/id_rsa_www
  ProxyCommand ssh login -W %h:%p

「web*」は正規表現で「web01/02」をまとめています。

ssh web02

もっと多段

fumidai01 → fumidai02 → server

Host fumidai01
  User         www
  HostName     fumidai01.com

Host fumidai02
  User         www
  HostName     fumidai02.com
  ProxyCommand ssh fumidai01 -W %h:%p

Host server
  User         www
  HostName     server.com
  ProxyCommand ssh fumidai02 -W %h:%p
ssh server