为什么即使端点出现故障,转发的 SSH 端口似乎仍然打开?
Why the forwarded SSH port still seem open even with the endpoint failing?
我将 SSH 端口转发隧道安装到远程服务器 RemoteServerSSH
并且 将 55555
端口转发到不存在的设备(这是什么我尝试测试)。
$ 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 连接直接转发到端点?
项目相关问题
考虑隧道的工作原理。当你 运行 类似 ssh -L *:55555:RemoteDownItem:9100 user@host
时,端口转发是这样处理的:
- 本地
ssh
实例绑定到 TCP 端口 55555 并侦听连接。
- “发起者”连接到本地系统上的端口 55555。本地 ssh 实例接受 TCP 连接。
- 本地 ssh 实例通过 SSH 连接向远程 ssh 服务器发送 "direct-tcpip" request。
- 远程 ssh 服务器尝试连接到主机“RemoteDownItem”端口
9100
。
在第 4 步,如果 ssh 服务器能够连接到隧道的目标,则 ssh 客户端和服务器将各自通过 direct-tcpip 通道在发起者和目标之间中继数据。
或者,在第 4 步,服务器可能无法与目标建立 TCP 连接。或者服务器可能被配置为不允许转发请求。在任何一种情况下,它都会向客户端响应一个错误(或一条消息说通道已关闭)。
此时,本地ssh实例唯一能做的就是关闭与始发者的TCP连接。从发起者的角度来看,它成功连接到一个“服务器”(ssh客户端),然后“服务器”几乎立即关闭了连接。
OpenSSH 软件不包含任何以更复杂的方式处理此问题的逻辑。以更复杂的方式处理它可能很困难。考虑:
远程 SSH 服务器在尝试之前不知道它是否可以连接到“RemoteDownItem”端口 9100。所以ssh提前搞清楚端口转发不行是有问题的
即使一次尝试连接到目标失败,下一次尝试也可能成功。所以 ssh 假设端口转发不起作用是有问题的,仅仅因为一次尝试失败了。
远程SSH服务器可以成功连接到目标,然后目标可以立即关闭TCP连接。所以 ssh 服务器、ssh 客户端和发起者无论如何都必须处理这种行为。
我将 SSH 端口转发隧道安装到远程服务器 RemoteServerSSH
并且 将 55555
端口转发到不存在的设备(这是什么我尝试测试)。
$ 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 连接直接转发到端点?
项目相关问题
考虑隧道的工作原理。当你 运行 类似 ssh -L *:55555:RemoteDownItem:9100 user@host
时,端口转发是这样处理的:
- 本地
ssh
实例绑定到 TCP 端口 55555 并侦听连接。 - “发起者”连接到本地系统上的端口 55555。本地 ssh 实例接受 TCP 连接。
- 本地 ssh 实例通过 SSH 连接向远程 ssh 服务器发送 "direct-tcpip" request。
- 远程 ssh 服务器尝试连接到主机“RemoteDownItem”端口
9100
。
在第 4 步,如果 ssh 服务器能够连接到隧道的目标,则 ssh 客户端和服务器将各自通过 direct-tcpip 通道在发起者和目标之间中继数据。
或者,在第 4 步,服务器可能无法与目标建立 TCP 连接。或者服务器可能被配置为不允许转发请求。在任何一种情况下,它都会向客户端响应一个错误(或一条消息说通道已关闭)。
此时,本地ssh实例唯一能做的就是关闭与始发者的TCP连接。从发起者的角度来看,它成功连接到一个“服务器”(ssh客户端),然后“服务器”几乎立即关闭了连接。
OpenSSH 软件不包含任何以更复杂的方式处理此问题的逻辑。以更复杂的方式处理它可能很困难。考虑:
远程 SSH 服务器在尝试之前不知道它是否可以连接到“RemoteDownItem”端口 9100。所以ssh提前搞清楚端口转发不行是有问题的
即使一次尝试连接到目标失败,下一次尝试也可能成功。所以 ssh 假设端口转发不起作用是有问题的,仅仅因为一次尝试失败了。
远程SSH服务器可以成功连接到目标,然后目标可以立即关闭TCP连接。所以 ssh 服务器、ssh 客户端和发起者无论如何都必须处理这种行为。