web-dev-qa-db-ja.com

RDPのポートをプローブする

Sshトンネルを使用して自宅のコンピューター(「自宅」)にRDPします。

ときどき、ホームで実行されているトンネリングソフトウェアがクラッシュし、RDPポートがトンネリングを停止します。ルーターで「netstat-tln」を実行し、トンネリングされたRDPポートが開いていない場合はトンネリングソフトウェアを再起動するスクリプトを、自宅で15分ごとに実行するようにスケジュールすることで、これを解決しようとしました。

残念ながら、クラッシュによってRDPポートが開いたまま接続を受け入れている場合がありますが、トラフィックはトンネリングされません。例えば。 netstatによると、ポートは開いたままで、ポートにtelnetで接続しようとすると、接続されて空白の画面が表示されます。トンネルを介してRDPを実行しようとすると、セッションは接続されますが、「リモートセッションの構成」でスピンします。

結論:「ウォッチドッグ」スクリプトで実際にRDPポートへの接続を試みて、トンネルがまだ良好かどうかを判断したいと思います。ポートをプローブして、開いているRDPポートかどうかをテストするにはどうすればよいですか?

理想的なテストは実際にRDPのポートを調査することだと思いますが、他のアイデアも受け入れています。

4
Tmdean

私はそれを行う簡単な方法を考え出しました。スクリプトがルーターで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はそれを単純な16進文字列に変換し、xxdの出力の前にRDP response:を付けるので、スクリプトは出力のこの行を簡単にスキャンできます。

RDPサーバーがリッスンしている場合、これと同様の出力を受け取ります。

RDP response: 030000130ed000001234000209080000000000

私が行う他の唯一の検証は、オフセット11のバイト02を探して、それがTYPE_RDP_NEG_RSP(RDPネゴシエーション応答)構造を含むRDPパケットであることを確認することです。

クラッシュを修正することは明らかな解決策ですが、トンネリングソフトウェアがいくつかの異なる方法でクラッシュしたことがあり、異常なことは何もしていません。私が使用しているソフトウェアはBitViseSSHクライアントです。私は最新バージョンを使用していますが、グーグルで同様の問題を抱えている人は他に見つかりませんでした。クラッシュするのは数日または数週間に1回だけですが、コンピューターにRDPを実行して接続を受け入れていないことを確認しようとするとイライラし、家に帰るまで何もできません。

3
Tmdean