Answers:
ProxyCommand
在您的SSH配置中使用。在您的主目录中创建一个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 -q0 hostname.or.IP.address.internal.machine 22
现在您可以直接使用
ssh user@internalmachine
还要注意,现在您有了一个SSH主机目标名称,您也可以在其他应用程序中使用它。例如:
SCP复制文件。
scp somefile user@internalmachine:~/
在您的GUI应用程序中:
使用sftp://user@internalmachine/
作为位置来浏览计算机上。
基于KDE(海豚):使用 fish://user@internalmachine/
就像从机器上一样,更改,hostname.or.IP.address.internal.machine
然后将端口(22
)移至您想到达的unibroker
机器。
根据unibroker主机上的netcat版本,-q0
必须省略该选项。关于认证;您基本上是在工作站上建立两个SSH连接。这意味着将对unibroker主机和内部计算机主机进行一次又一次的验证/认证(对于密钥对/密码和主机密钥验证)。
这种使用ProxyCommand
“ netcat”和“ netcat”的方法只是做到这一点的一种方法。我之所以这样,是因为SSH客户端直接与目标计算机对话,因此我可以从客户端验证主机密钥,并且可以使用公共密钥身份验证,而无需在代理上使用其他密钥。
每个都Host
定义新主机部分的开始。Hostname
是该主机的目标主机名或IP地址。User
是您作为中的用户部分提供的内容ssh user@hostname
。
ProxyCommand
将用作连接到目标计算机的管道。通过在第一台计算机上使用SSH并直接nc
从那里建立一个简单的“ netcat”()到目标,这基本上只是从中间代理到内部计算机的纯文本。该-q
选项是沉默的任何输出(只是个人喜好)。
确保在代理上安装了netcat(通常在Ubuntu上默认可用)-netcat-openbsd或netcat-traditional。
请注意,此处您仍在两次使用SSH加密。当netcat通道为纯文本时,您PC上的SSH客户端将使用最终目标计算机设置另一个加密通道。
我在其他答案中提供的ProxyCommand方法的一个明显替代方法是直接“跳到”目标计算机:
ssh -t user@machineB ssh user@machineA
注意-t
第一个ssh
命令上的。没有它,它将失败:
Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Permission denied, please try again.
[...]
它将强制分配实际的TTY
缺点是现在所有配置,验证和身份验证都在计算机B上进行,出于安全原因,我真的不喜欢这种情况。我喜欢在自己的PC上使用密钥对,并通过自己的PC验证和验证最终目标计算机。此外,您只能将交互式外壳用于SSH,因此不会与SCP等其他工具或GUI文件管理器一起使用。
由于上述所有原因,我强烈建议使用ProxyCommand方法,但是对于快速连接而言,它可以很好地工作。
您可以使用-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及更高版本中可用。
尝试使用
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>
在〜/ .ssh / config中,仅使用计算机上的键就可以一次完成所有操作。
B
机器上也不需要私有SSH密钥。
这是一个非常有用的建议。弄了几个小时后,我找到了这条纸条,并确认其工作原理与所记录的完全相同。要将MachineA通过MachineA连接到远程机器C:
例如:[xuser @ machineC〜] ssh -t MachineA ssh MachineB
“ -t”很关键,如果不存在,ssh将失败。系统将提示您两次,第一次提示您输入MachineA上的密码,然后第二次提示您输入MachineB。另外,请注意,这假设您在所有三台计算机上都定义了用户“ xuser”。如果不是,则仅使用ssh语法:“ yuser @ MachineA ...”。另请注意,如果需要,您可以使用点分四元原始IP#。如果您通过使用未公开给世界各地的IP(即IP)的专用本地网络进行链接,这将非常有用。不在您的本地主机文件或任何DNS中。要从MachineB到远程machineC获取文件,您可以从MachineB到MachineA进行scp,然后从MachineA到远程machineC进行scp。(例如,远程计算机C可以ping通机器A,但不能ping通机器B。)警告:我在Fedora和WindowsXP上进行了测试,MachineA是运行ICS(Internet连接共享)的XP-box,而MachineB和remote machineC是Fedora-Linux机器。这个建议为我解决了一个关键问题-即。受限制的受监控的对我的远程站点局域网的远程访问。另请注意,从MachineB“注销”时,应该看到两个“与xxx.xxx.xxx.xxx的连接已关闭”。消息。
-t
仍然是必需的。
对于在两个系统中都允许外壳程序访问的情况,ProxyCommand是一个干净的解决方案。我们希望给远程用户通过代理(B)访问内部计算机(A)的权限,但不允许用户通过Shell对B的外壳访问来提高安全性。这工作:
更换登录shell(使用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中创建必要的无密码登录authorized_keys设置。更改之后,由于任何人都无法通过外壳程序访问此帐户,因此只有sudoer @ B可以通过直接对其进行编辑来更改文件authorized_keys。
sudo vi ~extuser/.ssh/authorized_keys
sudo touch ~extuser/.hushlogin
最后一行是禁止显示来自B的登录标语,因此远程用户可以透明地访问A。