我想访问一台计算机,例如位于我大学网络中的机器A。但是,只能通过大学的内部网络访问此计算机,因此我不能直接从家里使用SSH到此计算机。

登录到另一台大学计算机,例如计算机B

(可以从我的家用计算机通过SSH访问此计算机B。)

使用B上的SSH连接到A。

有没有办法更快地做到这一点?仅使用一个ssh命令。

评论

相关:通过多个主机的SSH

#1 楼

在您的SSH配置中使用ProxyCommand

在主目录中创建SSH配置文件(除非您希望在整个系统范围内使用),~/.ssh/config

Host unibroker          # Machine B definition (the broker)
Hostname 12.34.45.56    # Change this IP address to the address of the broker
User myusername         # Change this default user accordingly 
                        # (`user@unibroker` can overwrite it)

Host internalmachine    # Machine A definition (the target host)
ProxyCommand ssh -q unibroker nc hostname.or.IP.address.internal.machine 22


现在您可以直接使用

ssh user@internalmachine


直接访问计算机A。另外请注意,现在您有了一个SSH主机目标名称,您可以在其中使用它其他应用程序也是如此。例如:



SCP复制文件。

scp somefile user@internalmachine:~/



在您的GUI应用程序中:

使用sftp://user@internalmachine/作为在计算机上浏览的位置。 />
就像从fish://user@internalmachine/机器一样,将hostname.or.IP.address.internal.machine和端口(22)更改为您想到达的机器。必须省略。关于认证;您基本上是在工作站上建立两个SSH连接。这意味着unibroker主机和内部计算机主机都经过一个又一个的验证/认证(用于密钥对/密码和主机密钥验证)。

解释

这种方法使用unibroker和'netcat'只是其中一种方法。我之所以这样,是因为我的SSH客户端直接与目标计算机对话,以便我可以从客户端验证主机密钥,并且可以使用公共密钥身份验证,而无需在代理上使用其他密钥。

每个-q0定义新主机部分的开始。 ProxyCommand是该主机的目标主机名或IP地址。您将在Host中作为用户部件提供Hostname

User将用作通往目标计算机的管道。通过在第一台计算机上使用SSH并从那里直接设置一个简单的'netcat'(ssh user@hostname)到目标,这基本上只是从中间代理到内部计算机的纯文本。 ProxyCommand选项用于使任何输出静音(仅出于个人喜好)。

确保在代理上安装了netcat(通常在Ubuntu上默认可用)-netcat-openbsd 或netcat-traditional 。

请注意,此处仍在使用SSH两次加密。当netcat通道为纯文本时,您PC上的SSH客户端将使用最终目标计算机设置另一个加密通道。

评论


我必须删除-q0选项,因为我使用的计算机不支持该选项。除此之外,一切都可行。这是一个奇妙的提示。非常感谢。 :)

–格里
2013年12月3日在2:43



我遇到了一个问题,您的答案从终端对我来说很好,但是我无法使用gui sftp进行操作,它说:未处理的错误消息,登录时超时。

– Vikash B
15年10月22日在18:52

@VikashB好吧,它确实应该工作。考虑创建一个新问题来处理您的特定情况。

– Gertvdijk
15年10月22日在19:32

我在这里做的是一个问题:askubuntu.com/questions/688567/…

– Vikash B
15年10月23日在10:03

为了补充@gertvdijk的明智词汇,有一本关于ssh代理和跳转主机的优秀Wikibook,可以作为宝贵的参考。

–特拉维斯·克拉克(Travis Clarke)
17年11月22日在8:48



#2 楼

随便跳一下

我在其他答案中提供的ProxyCommand方法的一个明显替代方法是直接“跳到”目标计算机:

br />请注意第一个-t命令上的ssh。如果没有它,它将失败:

ssh -t user@machineB ssh user@machineA


它将强制分配一个真正的TTY。验证和身份验证在机器B上进行,出于安​​全原因,我真的不喜欢这种情况。我喜欢在自己的PC上使用密钥对,并通过自己的PC验证和验证最终目标计算机。此外,您只能将交互式外壳用于SSH,因此不会与其他工具(如SCP)或使用您的GUI文件管理器一起使用。

出于上述所有原因,我强烈建议您使用ProxyCommand方法,但为了快速连接,效果很好。

评论


为什么对“一次性”解决方案和永久解决方案都没有一个答案?

–娴静
2013年6月22日16:08

@demure这就是StackExchange网站的工作方式...请参阅:两次回答问题的正式礼节是什么?说:“发布两个不同的答案比将它们放入一个答案要好。”我不认为这是相同的解决方案。我认为,永久性/暂时性并不是使这种方法与众不同的原因。

– Gertvdijk
2013年6月22日16:10



其他指南还说,还使用-A开关,但表明这具有安全隐患。您是否知道转发或不发送身份验证代理连接是什么意思?

–对角线
18-10-16在15:09

@gertvdijk超级忍者在这里!您有两个最佳解决方案。我从未见过。超酷。比用N个解决方案创建一个百万长的解决方案要好得多(这是我通常看到的)。

–特雷弗·博伊德·史密斯
19年1月2日在19:51

这比设置将同时妨碍其他ssh的配置要方便得多。

– Nikhil Sahu
19 Mar 25 '19在9:51

#3 楼

您可以使用-J命令行选项:

ssh -J user@machineB user@machineA


来自man ssh

-J [user@]host[:port]
     Connect to the target host by first making a ssh connection to
     the jump host and then establishing a TCP forwarding to the
     ultimate destination from there.  Multiple jump hops may be
     specified separated by comma characters.  This is a shortcut to
     specify a ProxyJump configuration directive.


它是在OpenSSH 7.3版(2016年8月发布)。它在Ubuntu 16.10和更高版本中可用。

评论


+1,因为即使您需要为machineA指定密钥文件,此操作也有效

–悲伤
18年2月21日在10:36

+1,如果您的所有主机最近都在运行OpenSSH版本,则与我的ProxyCommand答案相比,这是更好的版本。

– Gertvdijk
19年3月18日在16:48

在这种情况下,OpenSSH服务器应该同时安装在A和B机器上吗?我理解正确吗?

–米哈伊尔
19年5月8日在14:29

等效的配置文件是“ ProxyJump”

– Amiratak88
20年4月17日在21:56

#4 楼

尝试在〜/ .ssh / config中使用
Host <visible hostname alias>
        Controlmaster auto
        User <user>
        hostname <visible hostname>
        port <port>
        IdentityFile ~/.ssh/<id file>

Host <private LAN hostname alias>
     ProxyCommand ssh -q -W <private LAN hostname>:<private LAN port> <visible hostname alias>


,仅使用计算机上的键一次完成所有操作。

评论


这比将netcat引入组合更干净。同样,B机上也不需要存在私有SSH密钥。

– danemacmillan
16年7月13日在21:47

我必须在“主机<专用LAN主机名别名>”下包括“用户”,才能正常工作。

–迈克尔
19/12/18在21:35

#5 楼

这是一个非常有用的建议。弄了几个小时后,我找到了这条纸条,并确认此条文件与记录完全相同。要将MachineA通过MachineA连接到MachineB,例如:[xuser @ machineC〜] ssh -t MachineA ssh MachineB

“ -t”很关键,ssh如果不存在该密码,则失败。另外,请注意,这假设您在所有
三台计算机上都定义了用户“ xuser”。如果不是,则仅使用ssh语法:“ yuser @ MachineA ...”。另请注意,如果需要,您可以使用点分四元原始IP#。如果您要通过使用不公开给世界各地的IP(即IP)的私有本地网络进行链接,这将非常有用。不在您的本地主机文件或任何DNS中。要从MachineB到远程machineC获取文件,
,您可以从MachineB scp到MachineA,然后从MachineA到远程machineC。 (例如,
远程MachineC可以ping通MachineA,但不能ping通MachineB。)警告:我在Fedora和WindowsXP上进行了测试,MachineA是运行ICS(Internet连接共享)的XP-box,而MachineB和远程machineC是Fedora- Linux盒子。这个建议为我解决了一个关键问题-即。受限制的受监控的对我的远程站点局域网的远程访问。
还请注意,当您从MachineB“注销”时,应该看到两个“到xxx.xxx.xxx.xxx的连接已关闭”。消息。

评论


如果您设置并配置了公共密钥身份验证,则无需担心输入密码。但是-t仍然是必需的。

–Felipe Alvarez
15年2月19日在12:45

@FelipeAlvarez如果您不信任机器B以无密码登录到A,您仍然需要担心输入第二个密码!

–迈克尔
17年4月23日在21:59

#6 楼

对于在两个系统中都允许外壳程序访问的情况,ProxyCommand是一个干净的解决方案。我们希望为远程用户提供通过代理(B)访问内部计算机(A)的权限,但不允许用户通过Shell访问B来提高安全性。可行:

用以下脚本(存储在文件中)替换登录外壳上的登录外壳(使用chsh)替换代理上的extuser

#!/bin/sh   # this is essential to avoid Exec format error
ssh internaluser@A


在远程用户的extuser @ B和extuser @ B的internaluser @ A中均未设置密码登录,然后执行以下命令将直接使用用户到A

ssh extuser@B


提示:在更改为自定义登录外壳之前,请在extuser @ B中创建必要的无密码登录授权密钥设置。更改后,由于任何人都无法通过外壳程序访问此帐户,因此只有sudoer @ B可以通过直接对其进行编辑来更改authorized_keys文件。

最后一行是禁止显示B的登录横幅,因此远程用户可以透明地访问A。

评论


非常有趣的方法。但是,这样做的主要缺点是:1)使用仅限于标准SSH使用(不支持SFTP / SCP)。 2)用户不能选择除单个主机之外的其他目标主机(因为在登录外壳中进行了硬编码)3)无法从工作站到最终目标主机进行主机密钥验证(因为使用了经纪人SSH二进制文件) 。 4)用户访问最终目标主机的私钥驻留在代理上,而不是用户。这允许管理员模仿用户(通常是不可能的)。

– Gertvdijk
16年8月5日在13:01

所有观点都是正确的,谢谢您的阐述。但是,主要目的是为受信任的用户提供对A的ssh访问,而无需登录到B。由于只有管理员才能在B上添加受信任用户的公钥(通过sudo,无需登录),这已经暗示该用户具有admin)访问extuser @ B(不是外部受信任用户)的私钥,并首先进行了设置!

– Sunthar
16-09-29在20:55

#7 楼

您的意思是您需要几个跳线:)

最近,我遇到了关于jumper1 jumper2和我的最终机器的问题,至于我的溶胶br />
#!/bin/bash
sshpass -p jumper1Passwd ssh -t jumper1@jumper1IP ./Y00.sh


然后在第一个跳线(这是我的路由器)上,放置了一个名为Y00.sh的脚本:

ssh -tt jumper2@jumper2 -i ~/.ssh/id_rsa sshpass -p finalPassWord ssh -tt final@final


您可以用您的IP和密码替换这些,祝您好运!

#8 楼

machineA是最终目标。
machineB是代理。我们希望通过ssh轻松实现home -- machineB -- machineA
在OpenSSH 7.3版(2016年8月发布)或更高版本中,您可以执行以下一项以下内容:

.ssh/config方法:
将以下几行添加到您的.ssh/config中:
Host machineB
    Hostname 12.12.12.12           # IP of machineB (w.r.t. home)
    User usernameB                 # username on machineB

Host machineA
    Hostname 34.34.34.34           # IP of machineA (w.r.t. machineB)
    ProxyJump usernameB@machineB   # PROXY MAGIC!
    User usernameA                 # username on machineA    

然后输入ssh machineA。还与scp兼容。
您可以通过https://unix.stackexchange.com/a/494485增强上述配置以强制使用特定的密钥。 />只需输入-J即可。 1.