autossh 无法在两个或更多隧道上工作-或者还有其他选择吗?

autossh 无法在两个或更多隧道上工作-或者还有其他选择吗?

我正在尝试使用 SSH 服务器作为网关来连接超过一个内部服务器。此处的内部服务器是指不可直接访问的服务器,它们没有分配公共 IP。

因此场景应该是这样的(例如有 2 台服务器,可能更多),网关的公共 IP 为 123.456.789.45,内部 IP 为 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。在这里我遇到了很多问题。第一个隧道可以毫无问题地建立,使用

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

我可以通过外部连接到端口 2214 的网关来访问服务器 1。但是我无法使用 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

日志文件什么都没说。Syslog 至少提供了

ssh exited prematurely with status 0; autossh exiting

现在有人知道如何autossh通过这两种方法解决这个问题吗?有没有类似的东西autossh我可以尝试一下?有没有办法实现上面提到的纯 ssh 版本的刷新之类的功能?


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

答案1

来自 autossh 文档:

autossh 使用 ssh 构建一个 ssh 转发循环(一个从本地到远程,一个从远程到本地),然后发送它期望返回的测试数据。

-M port[:echo_port] 指定要使用的基本监控端口。如果没有回显端口,则此端口及其上方的端口(端口 + 1)应该是其他端口未使用的端口。autossh 将在基本监控端口上发送测试数据,并在上面的端口上接收数据。例如,如果您指定“-M 20000”,autossh 将设置转发,以便它可以在端口 20000 上发送数据并在 20001 上接收数据。

如果您两次使用 -M 20000,则此操作必定会失败。为此使用不同的端口(它们之间留一个端口空间,因此 -M 20000 和 -M 20002 可以工作)。我建议执行“man autossh”并阅读 autossh 的文档,它也可以在线获取:http://www.manpagez.com/man/1/autossh/。如果您使用大量 autossh 隧道,您可以设置专用的 echo 服务(再次来自 autossh 文档):

或者,可以指定远程回显服务的端口。如果您希望使用标准 inetd 回显服务,则该端口应为 7。指定回显端口后,仅使用指定的监视端口,并且该端口在两个方向上传送监视消息。这允许 autossh 验证连接,而无需阻塞远程端每个隧道的端口。

如果您想为此使用 xinetd,以下是我的 echo 服务声明:

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

答案2

您可以在同一个 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

答案3

您可以配置多条隧道自动SSH的配置文件。不幸的是,它没有很好的文档记录。对于两个隧道,使用您提供的详细信息,并基于 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必须设置yesPermitTunnel

答案4

不知道 autossh ....

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

您需要在客户端中像这样配置 .ssh/config:

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

祝你好运!

相关内容