为什么转发的SSH端口即使端点出现故障仍然看起来仍然打开?

时间:2017-03-17 14:28:24

标签: ssh telnet portforwarding

我将SSH端口转发隧道挂载到远程服务器RemoteServerSSH55555端口转发到不存在的设备(这是我尝试测试的)

$ hostname
MyMachine

设置转发隧道

$ ssh -q -N -p 22 -vvv \
    -i ~/.ssh/MyKey \
    -o Compression=yes \
    -o ServerAliveInterval=3 \
    -o serverAliveCountMax=3 \
    -L *:55555:RemoteDownItem:9100 user@RemoteServerSSH

测试隧道

当我直接telnet设备时,我得到了正确的行为(未连接)。但是,当我尝试通过隧道时,telnet表示已连接:

$ telnet RemoteDownItem 9100   # Not Connected = OK
$ telnet MyMachine 55555       # Connected! Why? should be same as above

当我测量telnet时间连接时,它是瞬时的(1ms!)。 SSH客户端回答我,它不会越过ssh隧道!为什么?

冗长

...
debug1: Local connections to *:55555 forwarded to remote address 10.220.9.183:9100
debug3: channel_setup_fwd_listener: type 2 wildcard 1 addr NULL
debug1: Local forwarding listening on 0.0.0.0 port 55555.
debug2: fd 4 setting O_NONBLOCK
debug3: fd 4 is O_NONBLOCK
debug1: channel 0: new [port listener]
debug3: sock_set_v6only: set socket 5 IPV6_V6ONLY
debug1: Local forwarding listening on :: port 55555.
debug2: fd 5 setting O_NONBLOCK
debug3: fd 5 is O_NONBLOCK
debug1: channel 1: new [port listener]
debug2: fd 3 setting TCP_NODELAY
debug3: packet_set_tos: set IP_TOS 0x10
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.


debug1: Connection to port 55555 forwarding to 10.220.9.183 port 9100   requested.
debug2: fd 6 setting TCP_NODELAY
debug2: fd 6 setting    O_NONBLOCK debug3: fd 6 is O_NONBLOCK
debug1: channel 2: new    [direct-tcpip]

问题

是否有SSH参数将telnet连接直接转发到端点?

项目相关问题

Telnet connect to non-existing adress

1 个答案:

答案 0 :(得分:1)

考虑隧道是如何工作的。运行ssh之类的东西时,端口转发的处理方式如下:

  1. 本地9100实例绑定到TCP端口55555并侦听连接。
  2. “originator”连接到本地系统上的端口55555。本地ssh实例接受TCP连接。
  3. 本地ssh实例通过SSH连接向远程ssh服务器发送"direct-tcpip" request
  4. 远程ssh服务器尝试连接到主机“RemoteDownItem”端口{{1}}。
  5. 在步骤4,如果ssh服务器能够连接到隧道的目标,那么ssh客户端和服务器将通过direct-tcpip通道在发起者和目标之间中继数据。

    或者,在步骤4,服务器可能无法与目标建立TCP连接。或者服务器可以配置为不允许转发请求。在任何一种情况下,它都会响应客户端并出现错误(或者说有关通道已关闭的消息)。

    此时,本地ssh实例唯一能做的就是关闭与发起者的TCP连接。从发起者的角度来看,它成功连接到“服务器”(ssh客户端),然后“服务器”几乎立即关闭了连接。

    OpenSSH软件不包含任何以更复杂的方式处理此问题的逻辑。以更复杂的方式处理它可能很困难。考虑:

    • 远程SSH服务器在尝试之前不知道它是否可以连接到“RemoteDownItem”端口9100。因此,ssh提前确定端口转发不起作用是有问题的。

    • 即使尝试连接目标失败,下一次尝试也可能成功。因此,ssh假设端口转发不起作用,只是因为一次尝试失败,这是有问题的。

    • 远程SSH服务器可以成功连接到目标,然后目标可以立即关闭TCP连接。所以ssh服务器,ssh客户端和发起者都必须处理这种行为。