autossh不适用于两个或更多的隧道 – 或者有其他的select吗?

我正在尝试使用SSH服务器作为连接到多个内部服务器的网关。 在这种情况下,内部意味着他们不能直接访问,他们没有分配给他们的公有知识产权。

所以情况应该是这样的(例如2个服务器,可能更多),网关公共IP为123.456.789.45,内部为10.12.40.13

+--------+ +---------+ +----------+ | client |--> 2214/tcp --> | | --> 22/tcp --> | Server 1 | +--------+ | | +----------+ | Gateway | +--------+ | | +----------+ | client |--> 2215/tcp --> | | --> 22/tcp --> | Server 2 | +--------+ +---------+ +----------+ 

我的第一个办法是把它们从网关设置到类似的服务器

 ssh -N -L 123.456.789.45:2214:127.0.0.1:22 tunnel-user@server1 ssh -N -L 123.456.789.45:2215:127.0.0.1:22 tunnel-user@server2 

在这项工作中,我偶然发现了隧道不太可靠的问题,在这里和那里都失败了。 合乎逻辑的下一步是试图让autossh运行。 在这里我遇到了一堆问题。 第一条隧道可以毫无问题地build立起来

 autossh -M 20000 -f -N -L 123.456.789.45:2214:127.0.0.1:22 tunnel-user@server1 

我可以通过外部连接到端口2214的网关访问server1。但是我不能得到第二个与autossh运行。 现在头几个小时,我决定尝试,反之亦然。 所以:

第二种方法是将它们从服务器设置到网关 。 再次,虽然纯SSH的变种使用这样的东西…

 ssh -R 123.456.789.45:2214:127.0.0.1:22 tunnel-user@gateway # <- init from server 1 ssh -R 123.456.789.45:2215:127.0.0.1:22 tunnel-user@gateway # <- init from server 2 

…使用autossh失败。

 autossh -M 20000 -f -R 123.456.789.45:2214:127.0.0.1:22 tunnel-user@gateway 

日志文件根本没有说什么。 系统日志至less想出来

 ssh exited prematurely with status 0; autossh exiting 

现在有谁知道如何解决autossh问题上的任何一种方法? 有什么类似autossh ,我可以给一个镜头? 有没有一种方法可能实现像上面提到的纯SSH版本刷新?


所有涉及的服务器都在Ubuntu 10.04 LTS和autossh 1.4b上运行最新的更新

从autossh文档:

autossh使用ssh构build一个ssh转发循环(一个从本地到远程,一个从远程到本地),然后发送它期望得到的testing数据。

-M端口[:echo_port]指定要使用的基本监视端口。 没有回声端口,这个端口和它上面的端口(端口+ 1)应该是没有别的东西正在使用的东西。 autossh将在基本监控端口上发送testing数据,并将其接收回上述端口。 例如,如果指定“-M 20000”,则autossh将设置为正向,以便可以在端口20000上发送数据并在20001上接收它。

如果您使用-M 20000两次,则必须失败。 使用不同的端口(它们之间有一个端口空间,所以-M 20000和-M 20002将起作用)。 我build议你做一个“man autossh”,阅读autossh的文档,也可以在网上find: http : //www.manpagez.com/man/1/autossh/ 。 如果你使用了很多autossh隧道,你可以设置一个专门的echo服务(再次从autossh文档):

或者,可以指定远程回显服务的端口。 如果你想使用标准的inetd echo服务,这应该是端口7。 当指定回显端口时,只使用指定的监视端口,并且双向传送监视报文。 这允许autosshvalidation连接而不阻塞远程端每个通道的端口。

如果你想使用xinetd,这是我的回声服务decleration:

 service echo { flags = REUSE socket_type = stream wait = no user = root server = /usr/bin/cat log_on_failure += USERID only_from = 127.0.0.1 disable = no } 

那么您可以在不同机器的所有通道上使用-M 20000:7。 如果一台计算机上有多个隧道,请使用多个-L或-R选项或使用不同的端口,例如-M 20002:7

您可以在同一个ssh命令中指定两个隧道。

 ssh -R 123.456.789.45:2214:127.0.0.1:22 -R 123.456.789.45:2215:127.0.0.1:22 tunnel-user@gateway 

或者你可以尝试像这样在.ssh / config中添加隧道,所以命令行不会太拥挤:

 host server1 RemoteForward 123.456.789.45:2214:127.0.0.1:22 RemoteForward 123.456.789.45:2215:127.0.0.1:22 

不知道autossh ….

但为什么不尝试SSHconfiguration选项ProxyCommand? ( http://undeadly.org/cgi?action=article&sid=20070925181947

你需要像这样在客户端configuration.ssh / config:

 Host Server1 HostName Server1 ProxyCommand ssh gateway:2214 nc %h %p 2> /dev/null 

祝你好运!

您可以在autossh的configuration文件中configuration多个隧道 。 不幸的是,它不是很好的logging。 对于两个隧道,与您的详细信息,并基于PubkeyAuthentication我会这样做(SuSE 11 SP 4):

  In /etc/sysconfig/autossh # Number of autossh instances to spawn on start. AUTOSSH_SPAWNS="3" # All options except for the first must end with "_<number>" AUTOSSH_OPTIONS_1="tunnel-user1@server1 \ -i /home/tunnel-user1/.ssh/id_rsa \ -M 0 -f -N -L2214:127.0.0.1:22 -o ExitOnForwardFailure=yes \ -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -o StrictHostKeyChecking=no" AUTOSSH_OPTIONS_2="tunnel-user2@server2 \ -i /home/tunnel-user2/.ssh/id_rsa \ -M 0 -f -N -L2215:127.0.0.1:22 -o ExitOnForwardFailure=yes \ -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -o StrictHostKeyChecking=no" 

当然,其他所有关于成功的与密钥的ssh连接都必须到位

  • 在服务器上的隧道用户的公钥密钥
    /home/tunnel-user[1|2]/.ssh/authorized_keys文件
  • 隧道用户必须存在于网关和服务器上
  • 并在/etc/ssh/sshd_config
  • 在网关的sshd_config AllowTcpForwarding必须设置为以及PermitTunnel

我用了不同的方法来解决这个问题。 起初,我设法在启动时从客户端启动SSH隧道。 我为此写了一个init.d脚本,把它变成了一个服务,让puppet处理它。

然而,这太麻烦了,我决定在网关服务器及其UFWconfiguration上使用NAT和端口转发。 即使这不是SSH问题本身的答案,这里解决scheme,因为它解决了基本的问题:

/etc/ufw/sysctl启用net/ipv4/ip_forward=1并运行sysctl -p

/etc/ufw/before.rules

 *nat :POSTROUTING ACCEPT [0:0] # forward traffic from eth1 through eth0 -A POSTROUTING -s 10.12.40.0/24 -o eth0 -j MASQUERADE # some DNAT rules -A PREROUTING -i eth0 -p tcp --dport 2214 -j DNAT --to-destination 10.12.40.14:22 -A PREROUTING -i eth0 -p tcp --dport 2215 -j DNAT --to-destination 10.12.40.15:22 # COMMIT 

并运行ufw disable && ufw enable 。 所有需要比在客户端上检查正确的路由。

不同的做法,想要的结果。 谢谢大家的阅读和思考我的问题和@sonassi :我会给你的build议OpenVPN的一刻,我得到了更多的时间和SSH端口的要求多一点。