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

Screnario:

[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用户权限。

需要安全的rsync internal_server_1:/ some / pathinternal_server_2:/ another / path

我的想法是在两个防火墙之间build立ssh安全隧道,例如来自firewall_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创build一个正确的ssh隧道(哪些端口需要隧道)
  • 在哪里我会使rsync? (在SSH隧道的情况下远程comp地址)

任何想法或指针,以帮助这种情况下的互联网资源?

感谢名单。

我假设firewall_2上的SSH端口(图中的“BC”)可以从外部访问。 networking1(10.2.0。*)上的计算机是否可以直接(即通过NAT)访问Internet,还是只能通过firewall_1代理? 既然你没有指定,我不会假设。

可能最简单的做法是通过SSH通过SSH隧道传输rsync(显然,“最简单”是相对的)。 首先,在firewall_1上运行这个命令来build立外部隧道:

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

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

然后,从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创build隧道,然后使用它从服务器1)是困难的,让我知道; 稍微复杂一些,可以用一个命令从server_1中全部启动。 虽然你应该可以设置一次外部隧道,然后把它留下来…

SSH有一个名为ProxyCommand的选项,它允许您将所有SSH通信传递给可以在不同主机上运行的命令。 也许你可以将多个这些链接在一起,以实现你想要做的事情。

如果你可以直接从internal_server_1连接到firewall_2,那么你可以使用类似的东西(例如,如果你使用的是rsync,那么就是-e值):

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

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

这可以使用防火墙1和防火墙2上的iptables完成,如下所示:

在防火墙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从内部server1访问内部server2,如下所示:

 internal_server1$ ssh -p 5022 [email protected] 

一个testing完整的命令是这样的:

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