我经常需要下载无法通过第一个 SSH 连接直接访问的文件。例如,我在一台 Windows 计算机上,我想访问另一台只能从 LAN 访问的计算机。这意味着我必须首先连接到中间机器并通过 SSH 连接到下一台机器。
如果该文件可用于第一台机器,那么使用 pscp 获取该文件会很容易。在这种情况下可以使用 SSH 端口转发吗?
答案1
我添加.ssh/config
这样的定义:
Host SERVER-A
ProxyCommand ssh SERVER-B nc -q0 %h %p 2> /dev/null
然后以正常方式使用ssh
or :scp
ssh user@SERVER-A
或者
scp file.tar.gz user@SERVER-A:~
SERVER-A
在设置与ssh 库的连接时会发现这些配置。它告诉 ssh 应该使用一些代理命令来连接。代理命令连接SERVER-B
并执行nc
命令(netcat),它将代理命令的所有输出转发到给定端口的给定服务器,其定义%h
和%p
参数。
这种结构还允许您使用密钥身份验证。您刚刚从两台服务器上的客户端计算机复制了公共内容:SERVER-A
和SERVER-B
。
此类配置还与使用 ssh 库的其他应用程序兼容,例如rsync
,sftp
或 GUI 客户端。
答案2
是的,在这种情况下可以使用 SSH 端口转发,但在尝试此操作时,您也可能会收到有关无效或不正确的主机密钥的警告。某些 SSH 客户端(例如 OpenSSH)仅通过域或 IP 跟踪 SSH 主机密钥,并且不包含端口号。 PuTTY 似乎会使用主机密钥记录端口号,只要您与每个主机使用的端口号保持一致,就不会遇到此问题。我建议将端口转发添加到 PuTTY 中保存的会话中。然后,您还可以将各种远程主机的其他会话保存为已保存会话,并将其与 pscp/psftp 一起使用。您可以从任何高编号端口开始进行转发,例如 2220,然后为需要通过中间主机转发的每台主机从该端口增加 1。添加到intermediate
本地端口转发的已保存会话,例如远程主机的端口2220
和目标以及带有目标的remote1:22
端口,然后为带有目标和 SSH 端口的会话以及带有目标和 SSH 端口的会话 创建会话。要使用主机的pcsp/psftp 会话。2221
remote2:22
remote1
remote2
remote1
localhost
2220
remote2
localhost
2221
@session-name
当您以某种方式将 SSH 主机密钥与 localhost 关联,并且尝试连接到转发到另一台计算机的本地端口时,就会出现此问题。借助 OpenSSH,我通过使用 解决了这个问题HostKeyAlias
。我像~/.ssh/config
这样添加了条目:
Host intermediate
HostName intermediate.example.org
LocalForward 2220 remote1.example.org:22
LocalForward 2222 remote2.example.org:22
Host remote1
HostName localhost
Port 2220
HostKeyAlias remote1.example.org
Host remote2
HostName localhost
Port 2221
HostKeyAlias remote2.example.org
不过,我首选的修复方法是在家庭和工作网络上部署 IPv6,这样我就不必再担心首先连接到中间服务器才能到达最终目的地了。
答案3
您可以使用中间机器作为代理。确保它有网络猫 ( nc
)安装。将以下行放入您的~/.ssh/config
(foo
是无法访问的机器的昵称,foo.example.com
是从中间机器看到的名称,gateway.example.com
是中间机器):
Host foo
HostName foo.example.com
ProxyCommand ssh gateway.example.com nc %h %p
然后ssh foo
将连接(经过两跳,但这是完全透明的)到无法访问的机器。
答案4
遵循gelraen的回答。
与.ssh/config
.也就是说,您为特定的虚拟主机名设置一个代理命令,该命令除了通过已打开的隧道进行 tcp 转发之外什么也不做:
Host imag
ProxyCommand socat - tcp-connect:localhost:2022
ssh imag
然后,当隧道启动时,您可以使用连接到 server-b:22 。
socat
这正是我用过的,netcat
应该做得很好;)
一个有趣的事情ProxyCommand
是它插入环境变量 - 所以......尝试一下。