我有一台运行 openssh 的 linux 服务器。我可以从本地 LAN 和远程连接到它。但是,有一个客户端(Windows 10 笔记本电脑)只能本地连接到它。当我尝试远程连接时,身份验证被接受,但笔记本电脑上的 ssh 客户端挂起,必须使用 Process Explorer 将其终止。我认为问题可能是:
- Windows 防火墙 - 不行。关闭后,情况相同。
- ssh 客户端 (cygwin) - 不行。使用 putty 时出现同样的情况。
- Windows 10 - 不行。我可以从另一台 Win10 机器成功远程连接。
我尝试全新安装 cygwin 和 putty。
我尝试使用几个 -v 选项运行 ssh,并将输出与能够连接的另一台 Win10 计算机进行比较。输出完全相同,但有一点不同:
Authenticated to <<IP REMOVED>>.
debug2: fd 5 setting O_NONBLOCK
debug2: fd 6 setting O_NONBLOCK
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug3: send packet: type 90
debug1: Requesting [email protected]
debug3: send packet: type 80
debug1: Entering interactive session.
debug1: pledge: network
debug3: receive packet: type 91
debug2: channel_input_open_confirmation: channel 0: callback start
debug2: fd 3 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x10
debug2: client_session2_setup: id 0
debug2: channel 0: request pty-req confirm 1
debug3: send packet: type 98
debug2: channel 0: request shell confirm 1
debug3: send packet: type 98
debug2: channel_input_open_confirmation: channel 0: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
>>> "bad" machine hangs here
debug3: receive packet: type 99
debug2: channel_input_status_confirm: type 99 id 0
debug2: PTY allocation request accepted on channel 0
debug2: channel 0: rcvd adjust 2097152
debug3: receive packet: type 99
debug2: channel_input_status_confirm: type 99 id 0
debug2: shell request accepted on channel 0
Welcome to Linux Mint 17.3 Rosa (GNU/Linux 3.19.0-32-generic x86_64)
Welcome to Linux Mint
在极少数情况下,它会进一步发展 - 甚至有一两次出现欢迎消息 - 但连接从未响应输入。
我尝试在服务器上手动运行 sshd -d,并比较“坏”远程会话和另一个客户端的“好”远程会话之间的输出。输出相同。
总结一下:这似乎不是 Windows 防火墙、客户端软件、Win10、到服务器的端口转发、DNS 或服务器本身的问题。问题只出在这台客户端计算机上,并且只在从本地 LAN 外部连接时才会出现。它正在成功验证。并且客户端计算机与另一台没有问题的计算机运行相同的 OS/ssh 客户端,而且我在日志中也看不到任何可以区分它的内容。
编辑:我还应该提到,在所有机器上,与其他远程服务器的 ssh 连接都可以正常工作。似乎只有这个服务器/客户端对,并且仅在远程连接时才有效。
更新:请参阅下面的评论以获取更多信息 - 该问题似乎特定于本地网络。
我可以采取哪些进一步的步骤来调试它?
答案1
在我看来,在挂起时,来自服务器的 TCP 数据包停止到达客户端。我认为这是因为它有时会在不同点挂起,并且问题会因网络配置的更改而有所不同。例如,可能是端口转发、NAT 和/或防火墙之间的一些不良交互。但问题是如何诊断为什么这种情况发生在一个客户端上而不是另一个客户端上。我能想到两种方法:
你可以尝试数据包监控在服务器和客户端以及沿途的各点检查数据包是否确实丢失以及在什么时候丢失。
您可以尝试找出网络设置与不同客户端上存在或不存在问题之间的关系。在正常工作的客户端和非正常工作的客户端之间交换全部或部分网络设置和 IP 地址,看看是否可以交换问题。