私はこれらを実行します2つのコマンド常に、ファイアウォールの背後で保護されている AWS 上の RDS インスタンスに接続します (そのため、EC2 インスタンスをトンネルします)。次のようにします。
コマンド 1: トンネルを開く (バックグラウンドで実行)
ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub &
コマンド 2: トンネル ポート経由で DB に接続します。
PGPASSWORD=password psql dbname -U user -h ip_address -p port;
これは素晴らしいことですが、私はこれら両方を 1 つの関数にまとめたいのですが、私の環境では何も機能しませんでした。
試行 1: バックグラウンド処理なしで実行:
function db()
{
ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub &
PGPASSWORD=password psql dbname -U user -h ip_address -p port;
}
単純にこう言っています:
$proddb
[1] 62924
psql: could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port 6666?
最初のコマンドはバックグラウンドで実行されていますが、
ps aux | grep host
(standard input):435:abdullah 62924 0.0 0.0 4315660 5828 s006 S 3:06PM 0:00.03 ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub
そして、その直後に次のコマンドを実行すると、DB に正常に接続されます。
PGPASSWORD=password psql dbname -U user -h ip_address -p port;
user=>
これを機能させるにはどうすればよいですか?
答え1
2 番目のコマンドが実行されたときに、最初のコマンドではトンネルを確立する時間がなかったため、「接続が拒否されました」というメッセージが表示されます。
使用せず&
に代わりにオプションを使用してください-f
:
-f は、
コマンド実行の直前に ssh をバックグラウンドに移動するように要求します。これは、ssh がパスワードまたはパスフレーズを要求するが、ユーザーがそれをバックグラウンドで実行したい場合に便利です。これは -n を意味します。リモート サイトで X11 プログラムを起動する推奨方法は、ssh -f host xterm などを使用することです。ExitOnForwardFailure
構成オプションが「yes」に設定されている場合、-f で起動されたクライアントは、すべてのリモート ポート転送が正常に確立されるまで待機してから、バックグラウンドに移動します。
これらをすべてまとめると、関数内の ssh 行を次のように置き換えます。
ssh -o ExitOnForwardFailure=yes -f -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub
そうすれば、関数を複数回実行しても、(複数-1) の無駄な ssh が実行されたままにはなりません。
短いリモート スリープ コマンドに置き換えることもできます-N
。そうすれば、強制終了する必要がある場合に検索しなければならない、長時間アイドル状態の ssh コマンドは発生しません。ssh はトンネルの使用が終了するまで待機するため、短い遅延は問題になりません。
ssh -o ExitOnForwardFailure=yes -f -L port:host:5432 user@$ip -i ~/.ssh/key.pub sleep 15
答え2
@AB によるこのソリューションは、バックエンド ホストへの SSH ポート転送トンネルを使用して、dmz (インターネットまたはエッジ エンドポイント) と mz (バックエンド) の間に「ジャンプ サーバー」を作成するためにも使用できます。次に例を示します。
(すべてのポートは、firewall-cmd を使用して開く必要があります)
desthost_ip はアクセスされるサービスのターゲット IP であり、それにバインドされた応答プロセス (tomcat、webapp など) が必要です。
DMZ エッジ:
ssh -o ExitOnForwardFailure=yes -f -L localhost_ip:port:desthost_ip:port user@dest_ip -i xyz.key sleep 15
したがって、localhost にもパブリック IP があり、desthost で https ベースのサービスが実行されていると仮定すると、次のようなものが機能します。
https://public_ip_of_localhost:port
これにより、desthost_ip:port サービスの Web ページが表示されます。
ssh -o ExitOnForwardFailure=yes -f -L 192.168.1.199:8001:192.168.2.10:8081 [email protected] -i xyz.key sleep 15
そして
https://192.168.1.199:8001
または
https://public_ip_for_192.168.1.199:8001
のサービスページが表示されます192.168.2.10:8081
。