
私が理解したのは、ファイアウォール(デフォルト設定の仮定)は、以前に対応する発信トラフィックがないすべての着信トラフィックを拒否することです。
に基づいてリバースSSH接続そしてSSHトンネリングが容易になりました、リバースSSHトンネリングを使用すると、迷惑なファイアウォール制限を回避できます。
リモートコンピュータでシェルコマンドを実行したいです。リモートコンピュータには独自のファイアウォールがあり、追加のファイアウォール(ルータ)の背後にあります。 IPアドレスは192.168.1.126(または類似)と同じです。私はファイアウォールの背後にはありません。インターネットで見られるリモートコンピュータのIPアドレス(192.168.1.126アドレスではない)を知っています。誰かがssh (something)
最初にリモートコンピュータからrootとして実行するように依頼することもできます。
リバースSSHトンネルがファイアウォール(ローカルおよびリモートシステムのファイアウォールとその間の追加のファイアウォール)をバイパスする方法を段階的に説明できる人はいますか?
スイッチ(、、、、-R
)の機能は何ですか?-f
-L
-N
答え1
私はこのことを可視化を通して説明するのが好きです。 :-)
SSH接続をパイプと考えてください。大きなチューブ。通常、これらのパイプを介してリモートシステムでシェルを実行します。シェルはこのパイプを介して仮想端末(tty)で実行されます。しかし、この部分はすでに知っています。
トンネルをチューブ内の別のチューブと考えてください。まだ大きなSSH接続がありますが、-Lまたは-Rオプションを使用すると、その中に小さなパイプを設定できます。
SSHリモートシェルは、実際にstdioに接続された小さな組み込みパイプの1つを使用してユーザーと通信します。
各チューブには始点と終点があります。大きなパイプ、SSH接続は、SSHクライアントから開始して接続するSSHサーバーで終わります。すべての小さなチューブには同じエンドポイントがあります。ただし、「開始」または「終了」の役割は、使用または-L
作成-R
(別途)によって異なります。
(まだ話していませんが、あなたが言った「リモート」マシン、つまりファイアウォールの背後にあるマシンがNAT(Network Address Translation)を使用してインターネットに接続していると仮定しています。これは重要ですので修正してください。教えてください。)
トンネルを作成するときにトンネルが応答する(または「バインディング」)アドレスとポート、および転送するアドレスとポートを指定します。この-L
オプションは、トンネルをトンネルのローカル側(クライアントを実行しているホスト)にバインドするように指示します。この-R
オプションは、トンネルにリモート側(SSHサーバー)からバインドするように指示します。
したがって、インターネットからファイアウォールの背後にあるホストとしてSSHを実行できるようにするには、ターゲットホストが外部ホストへのSSH接続を開き、-R
「リモート」側の「エントリ」ポイントを含める必要があります。接続にトンネルがあります。
上記の2つのモデルのうち、右側のモデルが必要です。
~からファイアウォールを含むマスター:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
これにより、ターゲットホストのクライアントに、-R
式エントリポイントを使用してトンネルを確立するように指示します。トンネルの終端ポート22222に接続されているすべてのエントリは、実際には「localhostポート22」に移動します。ここで、「localhost」は、トンネルの終点(たとえば、この場合はターゲットホストのSSHクライアント)の観点から表示されます。
他のオプションは次のとおりです。
-f
sleep
認証後にsshにバックグラウンド自体を指示すると、トンネルをアクティブに保つためにリモートサーバーに座ってこのようなタスクを実行する必要はありません。-N
SSH接続が必要ですが、実際にはリモートコマンドを実行したくないことを示します。作成中のものがトンネルのみの場合、このオプションを含めることでリソースを節約できます。-T
対話型シェルを作成したくないので、適切なpseudo-tty割り当てを無効にします。
パスワードのないログイン用のキーを設定しないと、パスワードの質問が発生します。
(接続を長時間放置して接続が切断さssh -O check <remotehost>
れたときに自動的に接続を更新したい場合(parsingを介して)、特にこの/サーバーに別々の独自のSSHキートンネル/クライアントを設定することをお勧めします。RemoteForwardを使用してください。信じないでください)。
-R サービス トンネルが有効になっているので起動できます。あなたの公開ホスト、トンネルを介してファイアウォールホストへの接続を設定する:
ssh -p 22222 username@localhost
以前にホストにアクセスしたことがないため、ホストキーの質問が表示されます。その後、そのアカウントのパスワード要求が届きますusername
(パスワードなしのログインキーを設定していない場合)。
このホストに定期的にアクセスするには、~/.ssh/config
次のファイルに数行を追加してアクセスを簡素化することもできますyourpublichost
。
host firewalledhost
User firewalleduser
Hostname localhost
Port 22222
調整しfirewalledhost
てfirewalleduser
適応してください。このfirewalleduser
フィールドはリモートサーバーのユーザー名と一致する必要がありますが、firewalledhost
あなたに適した名前である必要があります。接続Hostname
はおよびによって制御されるため、名前は解決可能な名前と一致する必要はありませんPort
。
または、インターネット上の他の場所からこのコンテンツにアクセスするには、以下をに追加できます~/.ssh/config
。
host firewalledhost
ProxyCommand ssh -fWlocalhost:22222 yourpublichost
この-W
オプションは、SSHセッションを続行するためにリモートホストへの接続を開くために使用されます。それはと-N
を意味します-T
。
また見なさい:
答え2
私はいくつかのスケッチを作りました。
SSH Tunnelコマンドを入力するマシンは次のとおりです。「あなたの所有者」。
紹介する
ローカル:
-L Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.
ssh -L sourcePort:forwardToHost:onPort connectToHost
意味:SSHを使用して接続connectToHost
し、すべての接続試行を転送します。地元のsourcePort
onPort
ポートにアクセスできるforwardToHost
名前のコンピュータポートに接続します。connectToHost
孤立:
-R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.
ssh -R sourcePort:forwardToHost:onPort connectToHost
意味:SSHを使用して接続connectToHost
し、すべての接続試行を転送します。離れてsourcePort
onPort
forwardToHost
ローカルコンピュータからアクセスできるコンピュータのポートに接続します。
その他のオプション
-f
認証後にsshに直接バックグラウンドに入るように指示すると、リモートサーバーに座ってトンネルを維持するために何かを実行する必要はありません。-N
SSH接続が必要ですが、実際にはリモートコマンドを実行したくないことを示します。作成中のものがトンネルのみの場合、このオプションを含めることでリソースを節約できます。-T
対話型シェルを作成したくないので、適切なpseudo-tty割り当てを無効にします。
あなたの模範
3番目の画像はこのトンネルを表します。しかし、「Your Host」という青いコンピューターは、ホストがあるコンピューターを表します。誰SSHトンネル(この場合はファイアウォールで保護されているコンピュータ)を起動します。
だから聞いてください誰コンピュータへのSSHトンネル接続を開始します。コマンドは基本的に次のようになります
ssh -R 12345:localhost:22 YOURIP
これでトンネルが開かれました。これで、次のコマンドを使用して、トンネルを介してSSHを介してファイアウォールを持つシステムに接続できます。
ssh -p 12345 localhost
自分のlocalhost
ポート(コンピュータ)に接続されていますが、12345
ポートは12345
トンネルを介してファイアウォールを持つコンピュータ(つまり、ファイアウォールを持つコンピュータ自体)のローカルホストポート22に転送されます。
答え3
SSHトンネリングは、確立されたSSH接続を使用して追加のトラフィックを送信する方法で機能します。
リモートサーバーに接続するとき、通常、一般的なユーザー対話には1つのチャネルしかありません(STDIN / STDOUT / STDERRを独立していると考える場合は3つのチャネル)。ローカルまたはリモートSSHプロセスは、いつでも既存の接続で追加のチャネルを開くことができます。その後、これらのチャネルはトンネルトラフィックを送受信します。トラフィックを送受信するとき、sshプロセスは単に「このトラフィックはチャンネルフーバー用です」と言います。
デフォルトでは、次のように動作します。
- sshにポートXXXXでリッスンを開始するように指示すると、受信したすべてのトラフィックはトンネリングされ、ポートZZZZからYYYYに送信される必要があります。
- ローカルSSHはポートXXXX(通常は存在しますが
127.0.0.1
変更可能)でリッスンを開始します。 - 一部のアプリケーションは、ローカルコンピュータのXXXXポートへの接続を開きます。
- ローカルSSHはリモートSSHへのチャネルを開き、「このチャネルのすべてのトラフィックはYYYY:ZZZZに送信されます」と言います。
- リモートSSHをYYYY:ZZZZに送信し、「OK、チャンネルが開いています」を再送信します。
- ローカルシステムのXXXXポートに接続されているすべてのトラフィックは、生成されたチャネルを使用してSSHを介してYYYY:ZZZZにプロキシされます。
プロセスは順方向と逆方向のトンネルでまったく同じです(上記のプロセスでは、「ローカル」と「リモート」という言葉だけを置き換えます)。どちらの方法でもトンネルを開始できます。 SSHを初めて起動する必要もありません。 SSHの実行中にトンネルを開くことができます(man ssh
詳細についてはセクションを参照)。ESCAPE CHARACTERS
~C
-R
-f
、そして何をして-L
いるのか、マンページを確認する必要があります-N
。最高の説明を提供します。しかし私は述べるべき-R
および-L
。
-R
リモートSSHに接続を受信するように指示し、ローカルSSHは実際の宛先に接続する必要があります。-L
ローカルSSHに接続を受信するように指示し、リモートSSHは実際の宛先に接続する必要があります。
これは非常におおよその説明ですが、何が起こっているのかを理解するのに十分な情報を提供します。
答え4
KISS - あなたのコンピュータ = your_computer_ip/your_user_name_at_your_computer リモートサーバー = REMOTE_ip/remote_user_name
ON - /etc/ssh/sshd_configファイルのVPN保護コンピュータ(リモートサーバー):
AllowTcpForwarding all
PermitTunnel yes
その後、SSHを再起動してください。
sudo service ssh restart
(私たちはポート2222を次のように設定しました。着信sshトランスポート)
ssh -R 2222:localhost:22 your_user_name_at_your_computer@you_computer_ip
- **2222はランダムポートではありません! ! **
- **rootユーザーだけが1024未満のポートを開くことができます!!!**
これで、VPNや他のすべてのものから切断できます。
コンピュータで端末を開きます
これで、コンピュータのポート2222がリモートホストにマップされました!
ssh localhost -p 2222 -l remote_user_name