SSHのトンネリングは私には非常に混乱しています。Linuxでできるかどうか悩んでいます
私は3台持っています
A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.
なので、A -> BからはSSHでき、B -> CからはSSHできますが、A -> Cからはできません
A から B への SSH トンネルを設定して、他の SSH コマンドを実行したときに私のローカルマシン A からだけ動作するようにする方法はありますか?私は基本的に仕事場から家に git repo をクローンしようとしています (そして、マシン B に git をインストールすることができません)
また、一度設定したら…同じように解除するにはどうすればいいのでしょうか?
114 None 2010-02-11
これを hostA の .ssh/config
ファイルに配置してください (詳細は man 5 ssh_config を参照してください)
# .ssh/config on hostA:
Host hostC
ProxyCommand ssh hostB -W %h:%p
これで、以下のコマンドで自動的にhostBをトンネルします
hostA:~$ ssh hostC
-oCiphers=arcfour
や -oClearAllForwardings=yes
のようなオプションを追加して高速化するのもいいかもしれませんが、 ssh
の中で ssh
をラップするのは計算量が多くなりますし、すでに暗号化されたトラフィックをトンネルする場合には、 余分な労力とラッパーの安全性は必要ないからです
OpenSSH を 5.3 よりも前のバージョンで使用している場合、 -W
オプションは使用できません。この場合は netcat (nc
) を使って実装することができます
ProxyCommand ssh hostB nc %h %p # or netcat or whatever you have on hostB
135 ephemient 2010-02-11
編集:これは間違ったアプローチです。代わりにephemientの回答を参照してください。この答えは機能しますが、潜在的に安全性が低く、間違いなく素晴らしいものではありません
のような解決策を求めているように聞こえます
ssh -L localhost:22:machinec:22 machineb
これで machineb
のシェルが起動します。これはそのままにしておいて、ターミナルウィンドウを最小化してください
これで、localhost
に ssh 接続をすると、実際には machinec
から machineb
に接続されることになります。トンネルの構築が終わったら、上記のコマンドを実行したターミナルを閉じてください
コマンドを実行するにはスーパーユーザー権限が必要になることに注意してください
7 Wesley 2010-02-11
対話的なシェルの場合は、このシンプルなコマンドを使うことができます
ssh -J <user>@<hostB> <user>@<hostC>
Jオプションはジャンプ用です
4 ssasa 2018-11-24
A のシェルエイリアスで C で ssh が発生するようにしたいようですね
- A で ssh me@b に “ssh me@c ホスト名” と入力すると “C” が返ってくると思います
- sshc foo を ssh me@b “ssh me@c foo” に展開するエイリアス sshc を作成します
- エイリアスの作成の正確な構文については、superuser.comを参照してください
3 Larry K 2010-02-11
雇用主がVPNを提供しているのであれば、代わりにそちらを利用することをお勧めします
この方法では、特別にアプリケーションを設定する必要はありません(sshでさえも)、ファイアウォールの背後にあるどのマシンでも見ることができます。さらに、すべてのトラフィックは VPN ソフトウェアによって暗号化され、不用意にまたは意図的に暗号化されていないトラフィックにセキュリティを追加します
0 Andrew Wagner 2010-02-11
YASS まだ別のシンプルなソリューション
ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
- 最初のコマンドは、HostBにssh接続を開き、HostBにlocalhost:2222からHostC:22への接続を転送するように指示します
-f
パラメータで、接続が確立したらバックグラウンドに移行するように指示します- 2番目のコマンドは、単にlocalhost:2222へのクライアント接続を開きます
- オプション HostKeyAlias は必須ではありませんが、間違ったホストへの接続を防ぐのに役立ちます
- 注意: 2 番目の ssh コマンドが転送ポートを使用するまで接続を維持するためには
sleep 10
コマンドが必要です。その後、2 番目の ssh が転送ポートを離れると、最初の ssh は終了します
これで、後続の ssh セッションを実行できるようになりました
ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
Variant:
ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
ssh -M -S ~/.ssh/ssh_HostC22userOnC.sock -o HostKeyAlias=HostC -p 2222 userOnC@localhost
を実行することで、後続の ssh セッションを開くことができます
ssh -S ~/.ssh/ssh_HostC22userOnC.sock userOnC@localhost
M と -S パラメーターを使用する主な利点は、HostA から HostC への接続が 1 つだけ開かれていることであり、それ以降のセッションは再び認証されず、より速く実行されます
0 F. Hauri 2017-11-10
特殊なケース、ニックスのプラットフォームが混在しています
hostA (linux) -> HostB (solaris) -> HostC (linux)
ホストC上でXアプリケーションが必要で、中間ホップがSolaris上にある場合、 ProxyCommand上で必要なnetcat (nc)を見つけました
hostA:~$ vi .ssh/config
Host hostC ProxyCommand ssh hostB nc %h %p # where nc is netcat
そうすると自動トンネリングが機能する
hostA:~$ ssh hostC
0 nsysdcw 2019-01-16
あるいは、OpenSSH 7.3 は ProxyJump
ディレクティブを導入しています
Host final
ProxyJump intermediate
In example:
Host intermediate
Hostname 10.0.0.42
User root
Host final
Hostname final.destination.com
User foo
ProxyJump intermediate
そうすると、ssh final
は中間機を飛び越えます
0 Peque 2020-04-16