通过其他 ssh 服务器 (类似代理) 进行 sftp

通过其他 ssh 服务器 (类似代理) 进行 sftp

当我从本地网络访问服务器时,我首先必须连接到主服务器(所有端口都连接到这台机器),当我在主服务器上时,我必须连接到下一台机器(只能从我的本地网络访问)。

例子:

name@mylaptop:~$ ssh [email protected]
[Entering Password]
Logged in
name@mainserver:~$ ssh 192.168.0.1
[Entering password]
Logged in
name@otherserver:~$

我现在想要做的是使用 FileZilla 连接到主服务器,然后“代理”到“其他服务器”。我如何告诉 FileZilla 在开始时使用命令?或者这是否可行?

答案1

我知道这个问题是几个月前问的 - 但是当我搜索类似要求的答案时,我发现使用 OpenSSH 的 ProxyCommand 非常有帮助。

我在本地客户端配置文件中有类似以下设置的内容(事实上我需要三跳才能到达目标:外部服务器->路由器->私有网络上的目标框)

In file ~/.ssh/config

Host myexternalserver
  User username1
  IdentityFile <key file for username1@myexternalserver>
  Hostname myexternalserver.fully.qualified.name

Host myrouter
  Hostname myrouter.fully.qualified.name
  User root
  IdentityFile <key file for root@myrouter>
  ProxyCommand ssh -q myexternalserver nc %h %p

Host mytarget
  Hostname mytarget.private.name
  User username2
  IdentityFile <key file for username2@mytarget>
  ProxyCommand ssh -q myrouter nc %h %p

这个链意味着我只需输入

ssh mytarget

并通过所需的跳数发送。

所有密钥文件都存储在本地,因此您无需将文件放在外部服务器上。相同的配置甚至适用于 scp:

scp <localfile> mytarget:<remotepath>

以下 wikibooks 页面记录了许多 ssh 代理的替代方法:http://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts

答案2

您可以设置到内部服务器的端口转发。

name@mainserver:~$ sudo iptables -t nat -A PREROUTING -i <outward facing interface> -p tcp --dport 2222 -j DNAT --to-dest <other server's ip>:22

这会将主服务器端口 2222 上的传入连接路由到内部服务器的端口 22。然后,您只需连接到示例.com在端口 2222 上。

另一个选择是使用 SSH 端口转发。

name@mylaptop:~$ ssh [email protected] -L 2222:<other server's IP>:22

只要此 SSH 会话处于打开状态,本地计算机上的端口 2222 就会路由到内部服务器上的端口 22。然后,您将连接到本地主机在端口 2222 上。

相关内容