我正在尝试使用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 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端口的要求多一点。