43

リモートサーバーからデータを取得するためにsshトンネルを必要とする小さなbashスクリプトを作成したので、ユーザーにプロンプ​​トを表示します:

echo "Please open an ssh tunnel using 'ssh -L 6000:localhost:5432 example.com'"

ユーザーがこのトンネルを開いたかどうかを確認し、トンネルが存在しない場合はエラー メッセージを表示して終了したいと思います。トンネルを照会する方法はありますかssh。つまり、ローカル ポート 6000 が実際にそのサーバーにトンネリングされているかどうかを確認する方法はありますか?

4

10 に答える 10

22

Autossh が最適なオプションです - すべてのケースでチェック プロセスが機能するとは限りません (ゾンビ プロセス、ネットワーク関連の問題など)。

例:

autossh -M 2323 -c arcfour -f -N -L 8088:localhost:80 host2
于 2010-10-19T13:46:23.220 に答える
8

autosshを使用します。これは、ssh接続を監視するためのツールです。

于 2010-08-17T19:24:11.277 に答える
3

これらは、SSH トンネルをテストまたはトラブルシューティングするためのより詳細な手順です。それらのいくつかはスクリプトで使用できます。2 つのアプリケーションが機能しなくなった後、2 つのアプリケーション間のリンクをトラブルシューティングする必要があったため、この回答を追加します。ssh プロセスを grep するだけでは十分ではありませんでした。そしてnc -z、そのオプションがnetcatの呪文で利用できなかったため、使用できませんでした.

最初から始めましょう。IP アドレスが 10.0.0.1の localと呼ばれるマシンと、10.0.3.12 にremoteと呼ばれる別のマシンがあるとします。これらのホスト名を以下のコマンドの先頭に追加して、どこで実行されているかを明確にします。

目標は、ポート 123 のリモート マシンのループバック アドレスからポート 456 のローカル マシンに TCP トラフィックを転送するトンネルを作成することです。これは、ローカル マシンで次のコマンドを使用して実行できます。

local:~# ssh -N -R 123:127.0.0.1:456 10.0.3.12

プロセスが実行されていることを確認するには、次のようにします。

local:~# ps aux | grep ssh

出力にコマンドが表示されたら、続行できます。それ以外の場合は、SSH キーがリモートにインストールされていることを確認してください。リモート IP の前にユーザー名を除外すると、ssh は現在のユーザー名を使用することに注意してください。

次に、リモートでトンネルが開いていることを確認します。

remote:~# netstat | grep 10.0.0.1

次のような出力が得られるはずです。

tcp  0  0  10.0.3.12:ssh  10.0.0.1:45988  ESTABLISHED

リモートからホストに送られるデータを実際に見ることができればうれしいです。ここでnetcatの出番です。CentOS では でインストールできますyum install nc

まず、ローカル マシンでリッスン ポートを開きます。

local:~# nc -l 127.0.0.1:456

次に、リモートで接続します。

remote:~# nc 127.0.0.1 123

ローカル マシンへの 2 つ目のターミナルを開くと、接続を確認できます。このようなもの:

local:~# netstat | grep 456
tcp  0  0 localhost.localdom:456 localhost.localdo:33826 ESTABLISHED
tcp  0  0 localhost.localdo:33826 localhost.localdom:456 ESTABLISHED

さらに良いことに、リモートで何かを入力してください。

remote:~# nc 127.0.0.1 8888
Hallo?
anyone there?

これがローカル ターミナルにミラーリングされていることがわかります。

local:~# nc -l 127.0.0.1:456
Hallo?
anyone there?

トンネル稼働中!しかし、ローカル マシンのポート 456 でリッスンすることになっているappnameという名前のアプリケーションがある場合はどうでしょうか。両側で nc を終了してから、アプリケーションを実行します。これを使用して、正しいポートでリッスンしていることを確認できます。

local:~# netstat -tulpn | grep LISTEN | grep appname
tcp  0  0  127.0.0.1:456  0.0.0.0:* LISTEN  2964/appname

ちなみに、リモートで同じコマンドを実行すると、ポート 127.0.0.1:123 でリッスンしている sshd が表示されるはずです。

于 2017-11-03T21:03:03.490 に答える
1

stunnel は、ホスト間の半永久的な接続を確立するための優れたツールです。

http://www.stunnel.org/

于 2012-09-22T18:03:28.623 に答える