menu
書いてる野郎
orebike@gmail.com
ここで登場する人たち
「ローカル」の SSH コマンドで 「踏み台」に接続して、「踏み台」環境の SSH コマンドを使って「ゴール」へ接続する
つまりオール手動。普通に順繰りやるログイン。
「ローカル」から「ゴール」まで踏み台経由のトンネルを掘る。 「ローカル」の特定ポートへのアクセスを「ゴール」へ送り込むので「ポートフォワード」ともいう。
Mac では Coccinellida Coccinellida download | SourceForge.net というツールがあるのでこいつを使うと非常にお手軽。
このように記述する
$ ssh -v -N -L localhost:10022:10.0.1.1:22 -o ConnectTimeout=15 -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -i ~/.ssh/hoge.pem -p 22 hoge@123.123.123.123
これはどのような設定かというと重要なのは最初と最後だけ。
最初の L オプションの所が重要で何処を何処にをここで表している。 この場合なら
localhost:10022
にアクセスしたものを、その先の
10.0.1.1:22
に渡せということになる。ここで突如登場する 10.0.1.1 というアドレスはグローバルではなく「踏み台」や「ゴール」が所属しているローカルネットワークのアドレスとなる。つまりここが「踏み台」を踏んで繋ぎたい先の「ゴール」。
そして最後に踏み台サーバ自体への接続が記述されている。
このコマンドを実行すると、ローカルの SSH が localhost:10022 で待受け状態になる。
なのでここで
$ ssh piyo@localhost:10022
とアクセスすると、踏み台先でこのようにアクセスしたことと同じと扱われる。
$ ssh piyo@10.0.1.1:22
順繰り接続する場合の1個分だけ省略できる。 さらにこれはプロトコルを問わない。なんでもいい。 ゴールの設定さえちゃんとやれば、MySQL クライアントであっても成立する。 SSH はトンネルを作っているのでその中を2階建てで別のプロトコルが通れるようになっている。
トンネルのやり方はある環境において常時、適宜、随時するようなオペレーションの中でやるなら楽である。 しかし単独のコマンドとして実行したい場合は面倒。
ここで ProxyCommand という記述を挟み込むと一発で直接的に繋ぐことができる。
~/.ssh/config
あたりにこのように書く。
s1 経由で s2 に接続
Host s1 HostName 111.111.111.111 User ec2-user Port 22 IdentityFile ~/.ssh/key1.pem Host s2 HostName 10.0.1.1 User ec2-user Port 22 IdentityFile ~/.ssh/key2.pem ProxyCommand ssh -W %h:%p s1
秘密鍵を指定しているが、これは両方ともローカルの鍵を指している
サーバ xxx.xxx.xxx.xxx を踏み台にしないとアクセス出来ない MySQL のサーバ yyy.yyy.yyy.yyy があったとすると
$ ssh -t -L 3308:localhost:3307 hoge@xxx.xxx.xxx.xxx ssh -t -L 3307:localhost:3306 piyo@yyy.yyy.yyy.yyy
このように接続するとローカルの3308ポートへ向けてMySQLクライアントでアクセスすると yyy.yyy.yyy.yyy にある MySQL のサーバに接続することができる
仕組み的には localhost:3308 のアクセスを xxx.xxx.xxx.xxx:3307 に転送し、xxx.xxx.xxx.xxx:3307 へのアクセス(xxx.xxx.xxx.xxxサーバから見ればlocalhostへのアクセス)をyyy.yyy.yyy.yyy:3306 に送り込むことになる