通过两个代理/防火墙的 SSH 隧道和 Rsync

通过两个代理/防火墙的 SSH 隧道和 Rsync

场景:

[internal_server_1]AA------AB[firewall_1]AC----+
          10.2.0.3-^        ^-10.2.0.2         |
                                            internet
          10.3.0.3-v        v-10.3.0.2         |
[internal_server_2]BA------BB[firewall_2]BC----+

端口 AC、BC 具有有效的互联网地址。所有系统都运行 Linux 并具有所有系统的 root 访问权限。

需要安全 rsyncinternal_server_1:/某些/路径进入internal_server_2:/另一个/路径

我的想法是在两个防火墙之间建立 ssh 安全隧道,例如从防火墙 1

firewall1# ssh -N -p 22 -c 3des user2@firewall_2.example.com -L xxx/10.3.0.3/xxxx

之后将从 internal_server_1 运行 rsync,类似于:

intenal1# rsync -az /some/path [email protected]:/another/path

我不知道

  • 如何为 rsync 创建正确的 ssh 隧道(哪些端口需要隧道)
  • 去哪里我会进行 rsync 吗?(如果是 ssh 隧道,则为远程计算机地址)

对于这个案例,有什么想法或有用的互联网资源吗?

谢谢。

答案1

我假设防火墙_2 上的 SSH 端口(您图中的“BC”)可从外部访问。网络 1(10.2.0.*)上的计算机可以直接(即通过 NAT)访问互联网,还是只能通过防火墙_1 进行代理访问?由于您没有具体说明,我假设不行。

可能最简单的做法是通过 SSH 隧道传输 rsync(显然,“最简单”是相对的)。首先,通过在防火墙 1 上运行以下命令来构建外部隧道:

firewall_1# ssh -N -p 22 -c 3des user2@firewall_2.example.com -L 10.2.0.2:5432:10.3.0.3:22

请注意,这将在任意端口(我使用了 5432)上运行绑定到其内部 IP(10.2.0.2)的隧道本地端(firewall_1)。

然后,从 server_1 运行 rsync 并使用其-e选项通过 SSH 运行它:

server_1# rsync -e "ssh -N -p5432 -c 3des" -a /local/path [email protected]:/remote/path

这将通过 SSH 连接到 IP 地址 10.2.0.2 上的端口 5432,外部隧道将其转发到 10.3.0.3(server_2)端口 22(标准 SSH)。

顺便说一句,如果协调多台计算机上的设置(即从防火墙_1 创建隧道,然后从服务器_1 使用它)很困难,请告诉我;如果稍微复杂一点,可以使用单个命令从服务器_1 启动所有设置。虽然您应该能够设置一次外部隧道,然后就让它保持打开状态...

答案2

SSH 有一个名为 ProxyCommand 的选项,它允许您将所有 SSH 流量传递给可以在不同主机上运行的命令。您可能可以将多个这样的命令串联在一起以实现您想要的操作。

如果您可以直接从 internal_server_1 连接到firewall_2,则可以使用类似这样的内容(例如,-e如果您使用 rsync,则作为值):

ssh -o ProxyCommand="ssh -W %h:%p firewall_2" internal_server_2

答案3

rsync 默认使用 SSH(端口 22)。因此,您需要在防火墙上进行端口转发,以便能够从内部服务器 1 rsync 到内部服务器 2。

可以iptables在防火墙 1 和防火墙 2 上执行如下操作:

在防火墙1上

iptables -A POSTROUTING -s 10.2.0.3 -p tcp --dport 5022 -j SNAT --to-source AC.IP.addr.ess

在防火墙2上

iptables -A PREROUTING -s AC.IP.addr.ess -p tcp --dport 5022 -j DNAT --to-destination 10.3.0.3:22

使用这些规则,您可以使用端口 5022 从内部服务器 1 访问内部服务器 2,例如:

internal_server1$ ssh -p 5022 [email protected]

答案4

经过测试的完整命令如下:

rsync -av --delete -e "ssh -o ProxyCommand='ssh -l username -W %h:%p jumphost-ip'" ./source_path/ username@internal-ip:/dest_path/

相关内容