SSH/踏み台サーバ経由で接続する

SSH/踏み台サーバ経由で接続する

ここで登場する人たち

  • ローカル
    • 作業者が実際に触る Macbook Pro とか
  • 踏み台
    • 「ローカル」とは離れた場所にあるがネットワーク的に直接繋げられるサーバ
  • ゴール
    • 「ローカル」とは離れた場所にあり、「ローカル」からは直接繋げないサーバ。「踏み台」からは接続できる。

単純に踏み台する

「ローカル」の 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 を使う

トンネルのやり方はある環境において常時、適宜、随時するようなオペレーションの中でやるなら楽である。 しかし単独のコマンドとして実行したい場合は面倒。

ここで 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

秘密鍵を指定しているが、これは両方ともローカルの鍵を指している

多段接続でMySQLにアクセスする

サーバ 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 に送り込むことになる

linux/ssh/connect_by_bastion_server.txt · 最終更新: 2018-12-17 16:30 by ore