我使用 ssh 隧道通过 RDP 进入我的家用电脑(“家”。
有时,主服务器上运行的隧道软件会崩溃,RDP 端口会停止建立隧道。我尝试通过安排主服务器上的脚本每 15 分钟运行一次来解决这个问题,该脚本在我的路由器上运行“netstat -tln”,如果隧道 RDP 端口不再打开,则重新启动隧道软件。
不幸的是,偶尔崩溃会导致 RDP 端口保持打开状态并接受连接,但不通过隧道传输任何流量。例如,根据 netstat,端口保持打开状态,如果我尝试通过 telnet 进入端口,它会连接并显示空白屏幕。如果我尝试通过隧道进行 RDP,会话会连接但会停留在“配置远程会话”上。
底线:我希望我的“看门狗”脚本能够真正尝试连接到 RDP 端口,以确定隧道是否仍然正常。如何探测端口以测试它是否是开放的 RDP 端口?
我认为理想的测试实际上是探测 RDP 端口,但我也愿意接受其他想法。
答案1
我想到了一种简单的方法。当我的脚本netstat
在路由器上执行命令以验证 RDP 隧道是否打开时,我还可以使用netcat
!通过隧道发送 RDP 连接请求。
这是我用来发送连接请求数据包的命令。我从连接顺序示例在 Microsoft 的 RDP 规范中。
echo -ne '\x03\x00\x00\x2c\x27\xe0\x00\x00\x00\x00\x00'\
'Cookie: mstshash=eltons\r\n'\
'\x01\x00\x08\x00\x00\x00\x00\x00' |
nc -w 5 localhost 6000 |
xxd -p |
xargs -0 printf 'RDP response: %s\n'
隧道通过端口 6000。该netcat
命令-w 5
规定,如果在 5 秒内未收到响应,则将关闭连接。xxd
将其转换为简单的十六进制字符串,然后在xxd
输出前加上前缀,RDP response:
以便我的脚本可以轻松扫描输出中的这一行。
如果 RDP 服务器正在监听,我将收到类似以下的输出。
RDP response: 030000130ed000001234000209080000000000
我进行的唯一其他验证是查找02
偏移量 11 处的字节,以验证它是否是包含TYPE_RDP_NEG_RSP
(RDP 协商响应)结构的 RDP 数据包。
修复崩溃是显而易见的解决方案,但我的隧道软件以几种不同的方式崩溃过,而我并没有对它做任何不寻常的事情。我使用的软件是 BitVise SSH 客户端。我使用的是最新版本,通过谷歌搜索,我没有发现其他人有类似的问题。它每隔几天或几周才会崩溃一次,但当我试图通过 RDP 进入我的电脑时,却发现它不接受连接,而我回家之前对此无能为力,这真是令人沮丧。