NATの背後にあるマシンをSSHトンネル経由でリンクする

NATの背後にあるマシンをSSHトンネル経由でリンクする

マシンが 2 台あります。どちらも NAT の背後にあります。また、各マシンから SERVER にアクセスできます。SERVER 経由で machine1 から machine2 に ssh トンネルを実行する方法はありますか?

クライアントマシンは Linux Mint です。サーバーは Debian です。すべてのマシンでユーザーアクセス権限のみを持っています。

答え1

どうすればそれが実現できるか分かります。

つまり、コンピュータは3台あります。A、B、C

AとBはNATの背後にあります。Bが仲介者だとしましょう

方法1

トンネル2つ

したがって、A から B (トンネル 1) への SSH 接続を作成できます。また、C から B (トンネル 2) への SSH 接続も作成できます。そして、トンネル 1 をトンネル 2 に転送します。

コンピュータAはSSH -Lで接続します

コンピュータCはSSH -Rで接続します

-L または -R は、トンネルのどちら側がリッスンし、どちら側が転送するかを決定します。

だから、私が間違っていなければ、次のようにすればいいのです。

A$ ssh -L 1234:127.0.0.1:2345 user@compB
C$ ssh -R 2345:127.0.0.1:3456 user@compB

しかし、同じ SSH サーバーに 2 つの接続を確立できるかどうかはわかりませんので、次のことを試してください。2 つの異なる sshd サーバーを作成します。

CompB の sshd_config を編集すると、ポート 22 と表示されていることがわかります。その下にポート 222 という行を追加します。すると、CompB は 2 つのポートで ssh サーバーを実行します。

次に、2つの異なるポート22と222でsshサーバーに接続できます。

A$ ssh -L 1234:127.0.0.1:2345 user@compB -p22
C$ ssh -R 2345:127.0.0.1:3456 user@compB -p222

ポート1234は、クライアントプログラムを接続するコンピュータAのポートです。トンネル1への入り口です。

ポート2345はコンピュータBのポートであり、トンネル2への入り口である。

ポート3456はCompCでサーバープログラムを実行するポートです

このように、CompAはCompBを介してCompCのサーバーに接続できます。

方法2

トンネル1つ

オプションとして、トンネルを 1 つだけ使用することもできますが、その場合、ルートの半分のみが暗号化されます。5.6.7.8 は CompC の IP であり、ポート 3456 は CompC 上のサーバーであり、ポート 1234 はトンネルのリスニング ポートです。

A$ ssh -L 1234:5.6.7.8:3456 user@compB

次に、CompA でクライアント プログラムを CompA のポート 1234 に接続すると、すべてが CompC に送信されます。

答え2

の返答に基づいてバロップ

NATの背後にAとBがあります。そしてAとBからアクセスされるCです

CI では ssh アクセスのみが必要です。他に必要なものはありません。

マシンAでcrontabにタスクを追加する

$crontab -e

TUNCMDR='ssh -f -N -R 1144:localhost:22 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDR" || ($TUNCMDR  &&  echo "`date`: Land remote port to localhost:22" >> ~/ssh-world.log)  &>/dev/null
TUNCMDL='ssh -f -N -L 1234:localhost:1143 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDL" || ($TUNCMDL  &&  echo "`date`: Forward local 1234 port to remote" >> ~/ssh-world.log)  &>/dev/null

マシンBでcrontabにタスクを追加する

$crontab -e

TUNCMDR='ssh -f -N -R 1143:localhost:22 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDR" || ($TUNCMDR  &&  echo "`date`: Land remote port to localhost:22" >> ~/ssh-world.log)  &>/dev/null
TUNCMDL='ssh -f -N -L 1234:localhost:1144 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDL" || ($TUNCMDL  &&  echo "`date`: Forward local 1234 port to remote" >> ~/ssh-world.log)  &>/dev/null

注意: ホスト B では、ホスト A と比較して 1143 および 1144 ポートが変更されています。

ホスト上Aで接続するには、ホスト上Bで実行します。ssh -p 1234 Buser@localhost
ホスト上でB接続するには、 ホスト上でA実行します。ホスト上で接続するには、ホスト上で実行します。 ホスト上で接続するには、 ホスト上で実行します。ssh -p 1234 Auser@localhost
CAssh -p 1144 Auser@localhost
CBssh -p 1143 Buser@localhost

再接続情報の実行を確認できますcat ~/ssh-world.log

上院

~/.ssh/configに追加してセッションの切断/ハングアップを停止します

Host *
    ServerAliveInterval 15

関連情報