はじめに
いきなりですが、例えば、次のようなネットワーク構成の環境があるとしましょう。
そして、このネットワークには次の制約があります。
- 自端末からAPサーバー(Linux2)には踏み台(Linux1)を踏まないと接続できない。
- 踏み台サーバー(LInux1)からDBサーバー(DB)には接続できない。
IT業界に従事されているエンジニア、コンサルタントの皆さまであれば、一度は目にしたことがあるのではないでしょうか。
こうなると、DBに用がある場合、まずは踏み台サーバーを経由してAPサーバーにログインし、APサーバーの上でDBに接続、作業する必要があります。
そうなると、大体の場合、LinuxやUnixだとGUI環境がなく、CLIで作業することになります。
別にいいのですが、大量のデータをSELECTしたいときなど、とても見にくくなるので、できれば、自端末からGUIアプリケーションを使って効率的に作業したいですよね。
そんな時は、Teratermにもできるポートフォ、ネットワークに一時的な導線を作ってあげれば、自端末からDBサーバーに対する作業ができます。
また、ネットワークの上でもちゃんと踏み台、APサーバーを経由しているので、問題もありません。
※とは言いつつも、気軽にデータが触れることが問題だ!と云う場合もありますので、組織のポリシーに従いましょう。
今回は、そんなときの作業効率化を図るための記事です。
ただ、この後、具体的なやり方を語っていきますが、面倒なことをしなくても、このような構成を前提に、A5:SQL Mk-2など、トンネル機能があるSQLツールもありますので、それぞれのツールの機能で事足りる場合はそれらを使うのがいいでしょう。
手順概略
まずは、ざっくりとした手順を紹介します。
- 踏み台サーバーからAPサーバーへのトンネルを作る。
- 1で設定したトンネル経由でAPサーバーに接続する。
- APサーバーからDBサーバーへのトンネルを作る。
- 3で作ったトンネル経由でDBサーバーに接続する。
このように、複数の端末、サーバーでネットワークを転送することをポートフォワーディング(ポート転送)と云い、今回は複数のサーバーをまたいで転送していくので、「ポート多段フォワード」と云います。
手順詳細
ここからは、詳細な手順を解説していきます。
踏み台サーバーからAPサーバーへのトンネルを作る
まずは、踏み台サーバーからAPサーバーを結ぶトンネルを作ります。
ポートフォワーディングを使って仮想的にネットワークを結ぶことを「トンネルを作る」とも云います。
1段でトンネルを作るやり方は、当記事以外にもたくさんの参考記事があり、難しくありません。
図上、トンネルを丸い筒でイメージしています。
トンネルを作ることで、1つのコマンドで、端末からAPサーバーに接続できるようになります。
設定 > SSH転送(O)より、ポートフォワーディングを設定します。
このとき、ローカルのポートは未使用のポートであれば何番でも構いません。
リモート側ホストのポートはSSHの22番を指定します。
これで、踏み台、APサーバー間のトンネルができました。
1で作ったトンネル経由でAPサーバーに接続する
作ったトンネルでAPサーバーに接続します。
ここの理屈はよくわかっていないのですが、踏み台サーバーからAPサーバーに普通に接続するのではなく、トンネル経由で接続します。
APサーバーからDBサーバーへのトンネルを作る
これだけだと、まだAPサーバーまでしかトンネルが開通していないので、APサーバーからDBサーバーも開通させます。
ここでは、sshこコマンドのオプションを使ってトンネルを作ります。
また、これも理屈はよくわかっていないのですが、自分から自分にポート転送を設定し、それを使ってトンネルを作ります。
最後に、転送のオプションをいれたコマンドでトンネルを作ります。
コマンド:ssh root@Linux2 -L 10004:192.168.1.2:1521
DBに接続
ここまでで、DBサーバーまでに通るトンネルは全て開通しました。
このトンネルを使ってDBサーバーに接続します。
接続には、自分から自分に設定したポートフォワーディングのポートを指定します。
これで、好きなツールを使って、効率よく作業ができますね。
DB以外にも、多段フォワードを使ってできることは多いので、ネットワーク的な壁にぶつかった場合は、こちらの方法を試してみてください。
おまけ
これは完全に自分のメモなんですが、これまでの一連の作業をダブルクリックするだけで実行できるTeratermマクロを残しておきます。
;;=====================================================================
;; 接続先などのホスト情報をまとめる
HOSTADDR = 'localhost'
USERNAME = 'Linux1User'
PASSWORD = 'password'
;;=====================================================================
;; コマンドオプション組立て
COMMAND = HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD
;; ウィンドウの色を変えたり設定を読み込ませる
strconcat COMMAND ' /F='
strconcat COMMAND 'C:\Users\Taro\TERATERM.ini
;; ポート転送を設定する
TRANSFER_SVR1 = 10003:Linux2:22
sprintf2 TRANSFER_SVR '%S' TRANSFER_SVR1
strconcat COMMAND ' /ssh-L'
strconcat COMMAND TRANSFER_SVR
;; 接続
connect COMMAND
end
;;=====================================================================
;; 接続先などのホスト情報をまとめる
HOSTADDR = 'localhost'
USERNAME = 'Linux2User'
PASSWORD = 'password'
;;=====================================================================
;; コマンドオプション組立て
COMMAND = HOSTADDR
strconcat COMMAND ':10003 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD
;; ウィンドウの色を変えたり設定を読み込ませる
strconcat COMMAND ' /F='
strconcat COMMAND 'C:\Users\Taro\TERATERM.ini
;; 接続
connect COMMAND
end
;;=====================================================================
;; 接続先などのホスト情報をまとめる
HOSTADDR = 'localhost'
USERNAME = 'Linux1User'
PASSWORD = 'password'
;;=====================================================================
;; コマンドオプション組立て
COMMAND = HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD
;; ウィンドウの色を変えたり設定を読み込ませる
strconcat COMMAND ' /F='
strconcat COMMAND 'C:\Users\Taro\TERATERM.ini
;; ポート転送を設定する
TRANSFER_SVR1 = 10004:127.0.0.1:10004
sprintf2 TRANSFER_SVR '%S' TRANSFER_SVR1
strconcat COMMAND ' /ssh-L'
strconcat COMMAND TRANSFER_SVR
;; 接続
connect COMMAND
;; コマンド入力のプロンプトが出たらコマンド投入
wait '$'
ssh root@Linux2 -L 10004:192.168.1.2:1521
;; このコマンドだとLinux2にログインする際のパスワード入力は必要
end
おわりに
筆者が試したときはこの手順を踏まないといけなかったのですが、理屈のわからない手順もありましたので、もっとシンプルに解決できるやり方があるかもしれません。
ご存じの方はぜひぜひコメントください。
参考文献
当記事を執筆するにあたり、お世話になった文献です。
https://yoneyore.hatenablog.com/entry/2016/10/09/211617
https://qiita.com/yuuki4891/items/bfe5c1d201524c6d1827