====== 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