Tmd*_*ean 4 networking remote-desktop bash netcat ssh-tunnel
我使用 ssh 隧道通过 RDP 进入我的家庭计算机(“家庭”)。
有时,在家庭中运行的隧道软件会崩溃并且 RDP 端口停止建立隧道。我尝试通过在家里安排一个脚本每 15 分钟运行一次来解决此问题,该脚本在我的路由器上运行“netstat -tln”,并在隧道 RDP 端口不再打开时重新启动隧道软件。
不幸的是,偶尔会发生崩溃,导致 RDP 端口保持打开状态并接受连接,但不传输任何流量。例如,根据 netstat,端口保持打开状态,如果我尝试远程登录到该端口,它会连接并显示一个空白屏幕。如果我尝试通过隧道进行 RDP,会话会连接,但会在“配置远程会话”上旋转。
底线:我希望我的“看门狗”脚本实际尝试连接到 RDP 端口以确定隧道是否仍然良好。如何探测端口以测试它是否是开放的 RDP 端口?
我认为理想的测试实际上是探测 RDP 端口,但我也愿意接受其他想法。
我想出了一个简单的方法来做到这一点。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'
Run Code Online (Sandbox Code Playgroud)
隧道通过端口 6000。该netcat
命令已设置-w 5
,如果 5 秒内未收到响应,连接将被关闭。xxd
将其转换为简单的十六进制字符串,并xxd
为的输出添加前缀RDP response:
,以便我的脚本可以轻松扫描输出中的这一行。
如果 RDP 服务器正在侦听,我将收到与此类似的输出。
RDP response: 030000130ed000001234000209080000000000
Run Code Online (Sandbox Code Playgroud)
我做的唯一的其他验证是查找偏移量 11 处的字节,02
以验证它是否是包含TYPE_RDP_NEG_RSP
(RDP 协商响应)结构的 RDP 数据包。
修复崩溃将是显而易见的解决方案,但我已经以几种不同的方式遇到了隧道软件崩溃,并且我没有对此做任何不寻常的事情。我使用的软件是BitVise SSH Client。我正在使用最新版本,并且通过谷歌搜索我没有发现其他人有类似的问题。它每隔几天或几周就会崩溃一次,但尝试通过 RDP 连接到我的计算机却发现它不接受连接,而且在我回家之前我无能为力,这令人沮丧。