通过 SSH 隧道传输数据非常简单:
ssh -D9999 username@example.com
Run Code Online (Sandbox Code Playgroud)
将端口 9999 设置localhost为到 的隧道example.com,但我有更具体的需求:
localhosthost1 可以访问 localhosthost2 只接受来自 host1localhost到创建一个隧道host2实际上,我想创建一个“多跳”SSH 隧道。我怎样才能做到这一点?理想情况下,我希望在不需要成为任何机器上的超级用户的情况下执行此操作。
Mik*_*her 390
你基本上有三种可能性:
从localhost到 的隧道host1:
ssh -L 9999:host2:1234 -N host1
Run Code Online (Sandbox Code Playgroud)
如上所述,从host1到的连接host2将不会受到保护。
从localhost到host1和从host1到的隧道host2:
ssh -L 9999:localhost:9999 host1 ssh -L 9999:localhost:1234 -N host2
Run Code Online (Sandbox Code Playgroud)
这将打开一个从localhostto的隧道host1和另一个从host1to 的隧道host2。然而端口9999来host2:1234可以通过任何人使用host1。这可能是也可能不是问题。
从localhost到host1和从localhost到的隧道host2:
ssh -L 9998:host2:22 -N host1
ssh -L 9999:localhost:1234 -N -p 9998 localhost
Run Code Online (Sandbox Code Playgroud)
这将打开一个隧道localhost,host1通过该隧道host2可以使用SSH 服务。然后第二隧道从打开localhost到host2通过第一隧道。
通常,我会选择选项 1。如果需要保护从host1到的连接host2,请选择选项 2。选项 3 主要用于访问host2只能从host2自身访问的服务。
kyn*_*nan 173
有一个很好的答案解释了ProxyCommandSSH 配置指令的使用:
将此添加到您的~/.ssh/config(man 5 ssh_config有关详细信息,请参阅):
Host host2
ProxyCommand ssh host1 -W %h:%p
Run Code Online (Sandbox Code Playgroud)
然后ssh host2将自动隧道通过host1(也适用于 X11 转发等)。
这也适用于一整类主机,例如由域标识:
Host *.mycompany.com
ProxyCommand ssh gateway.mycompany.com -W %h:%p
Run Code Online (Sandbox Code Playgroud)
OpenSSH 7.3 引入了一个ProxyJump指令,将第一个示例简化为
Host host2
ProxyJump host1
Run Code Online (Sandbox Code Playgroud)
nik*_*lay 54
OpenSSH v7.3 以后支持一个-J开关和一个ProxyJump选项,允许一个或多个逗号分隔的跳转主机,所以,你现在可以简单地这样做:
ssh -J jumpuser1@jumphost1,jumpuser2@jumphost2,...,jumpuserN@jumphostN user@host
Run Code Online (Sandbox Code Playgroud)
小智 20
我们有一个 ssh 网关进入我们的专用网络。如果我在外面并且想要在专用网络内的机器上使用远程 shell,则必须通过 ssh 进入网关并从那里连接到专用机器。
为了自动执行此过程,我使用以下脚本:
#!/bin/bash
ssh -f -L some_port:private_machine:22 user@gateway "sleep 10" && ssh -p some_port private_user@localhost
Run Code Online (Sandbox Code Playgroud)
怎么了:
Bob*_*ler 19
阅读以上内容并将所有内容粘合在一起后,我创建了以下 Perl 脚本(将其另存为 mssh 在 /usr/bin 中并使其可执行):
#!/usr/bin/perl
$iport = 13021;
$first = 1;
foreach (@ARGV) {
if (/^-/) {
$args .= " $_";
}
elsif (/^((.+)@)?([^:]+):?(\d+)?$/) {
$user = $1;
$host = $3;
$port = $4 || 22;
if ($first) {
$cmd = "ssh ${user}${host} -p $port -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no";
$args = '';
$first = 0;
}
else {
$cmd .= " -L $iport:$host:$port";
push @cmds, "$cmd -f sleep 10 $args";
$cmd = "ssh ${user}localhost -p $iport -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no";
$args = '';
$iport ++;
}
}
}
push @cmds, "$cmd $args";
foreach (@cmds) {
print "$_\n";
system($_);
}
Run Code Online (Sandbox Code Playgroud)
用法:
通过 HOSTA 和 HOSTB(同一用户)访问 HOSTC:
mssh HOSTA HOSTB HOSTC
Run Code Online (Sandbox Code Playgroud)
要通过 HOSTA 和 HOSTB 访问 HOSTC 并使用非默认 SSH 端口号和不同的用户:
mssh user1@HOSTA:1234 user2@HOSTB:1222 user3@HOSTC:78231
Run Code Online (Sandbox Code Playgroud)
通过 HOSTA 和 HOSTB 访问 HOSTC 并使用 X-forwarding:
mssh HOSTA HOSTB HOSTC -X
Run Code Online (Sandbox Code Playgroud)
通过 HOSTA 和 HOSTB 访问 HOSTC 上的 8080 端口:
mssh HOSTA HOSTB -L8080:HOSTC:8080
Run Code Online (Sandbox Code Playgroud)
小智 10
我做了我认为你想做的事
ssh -D 9999 -J host1 host2
Run Code Online (Sandbox Code Playgroud)
系统提示我输入两个密码,然后我可以使用 localhost:9999 作为到 host2 的 SOCKS 代理。这是我能想到的最接近你首先展示的例子。
这个答案类似于kynan,因为它涉及到ProxyCommand的使用。但是使用IMO更方便。
如果你在你的 hop 机器上安装了 netcat,你可以把这个片段添加到你的 ~/.ssh/config 中:
Host *+*
ProxyCommand ssh $(echo %h | sed 's/+[^+]*$//;s/\([^+%%]*\)%%\([^+]*\)$/\2 -l \1/;s/:/ -p /') nc $(echo %h | sed 's/^.*+//;/:/!s/$/ %p/;s/:/ /')
Run Code Online (Sandbox Code Playgroud)
然后
ssh -D9999 host1+host2 -l username
Run Code Online (Sandbox Code Playgroud)
会做你问的。
我来这里是为了寻找我阅读这个技巧的原始地方。当我找到它时,我会发布一个链接。
我的答案与此处的所有其他答案完全相同,但是,我想澄清~/.ssh/configProxyJump 和 ProxyJump的用处。
假设我需要在 3 跳内到达目的地,并且对于每一跳,我需要一个特定的用户名、主机、端口和身份。由于身份标准,这只能通过~/.ssh/config配置文件完成:
Host hop1
User user1
HostName host1
Port 22
IdentityFile ~/.ssh/pem/identity1.pem
Host hop2
User user2
HostName host2
Port 22
IdentityFile ~/.ssh/pem/identity2.pem
ProxyJump hop1
Host hop3
User user3
HostName host3
Port 22
IdentityFile ~/.ssh/pem/identity3.pem
ProxyJump hop2
Run Code Online (Sandbox Code Playgroud)
在您的计算机上,您可以单独测试每个跳跃,即
Host hop1
User user1
HostName host1
Port 22
IdentityFile ~/.ssh/pem/identity1.pem
Host hop2
User user2
HostName host2
Port 22
IdentityFile ~/.ssh/pem/identity2.pem
ProxyJump hop1
Host hop3
User user3
HostName host3
Port 22
IdentityFile ~/.ssh/pem/identity3.pem
ProxyJump hop2
Run Code Online (Sandbox Code Playgroud)
该~/.ssh/config文件的另一个很酷的事情是,这也将允许sftp通过任何一系列的跃点传输文件,例如
[yourpc] $ ssh hop1 # will go from your PC to host1 in a single step
[host1] $ exit
[yourpc] $ ssh hop2 # will go from your PC to host2 via host1 (i.e. two steps)
[host2] $ exit
[yourpc] $ ssh hop3 # will go from your PC to host3 via host1 and host2 (i.e. three steps)
[host3] $ exit
[yourpc] $
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
371039 次 |
| 最近记录: |