Пробування порту для RDP


3

Я використовую ssh тунель в RDP в свій домашній комп'ютер ("додому").

Іноді програмне забезпечення для тунелювання, що працює під час аварій на дому та порт RDP, перестає тунелюватися. Я намагався вирішити цю проблему, запланувавши сценарій на домашній для запуску кожні 15 хвилин, який запускає "netstat -tln" на моєму маршрутизаторі і перезапускає тунельне програмне забезпечення, якщо тунельний порт RDP більше не відкритий.

На жаль, іноді аварії такі, що порт RDP залишається відкритим і приймає з'єднання, але не прокладає жодного трафіку. Напр. порт залишається відкритим відповідно до netstat, і якщо я намагаюся telnet в порт, він підключається і показує мені порожній екран. Якщо я спробую RDP через тунель, сеанс з'єднує, але обертається на "Налаштування віддаленого сеансу".

Підсумок: я хотів би, щоб мій "watchdog" скрипт насправді намагався підключитися до порту RDP, щоб визначити, чи тунель все ще хороший. Як перевірити порт для перевірки, якщо це відкритий порт RDP?

Я думаю, що ідеальний тест насправді перевіряє порт для RDP, але я також відкритий для інших ідей.


Насправді було б легше виправити кореневу проблему, а саме виправити аварію програмного забезпечення тунелю.
Twisty Impersonator

@Twisty Дякуємо за ідею. Я звернувся до нього у своїй відповіді.
Tmdean

Відповіді:


2

Я зрозумів легкий спосіб зробити це. Коли скрипт виконує netstat команду на маршрутизаторі, щоб перевірити, що тунель RDP відкритий, я можу також надіслати запит на з'єднання RDP через тунель, використовуючи netcat!

Це команда, яку я використовував для передачі пакета запитів на з'єднання. Я схопив сам пакет з приклад послідовності з'єднання в специфікації RDP від ​​Microsoft.

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, щоб переконатися, що це пакет RDP, який включає в себе a TYPE_RDP_NEG_RSP Структура (узгодження відповіді на RDP).

Виправлення аварій було б очевидним рішенням, але я мав аварійне програмне забезпечення тунелювання декількома різними способами, і я не роблю нічого незвичайного з ним. Програмне забезпечення, яке я використовую, є клієнтом BitVise SSH. Я використовую останню версію і з деякими Googling я не знайшов нікого, хто має подібні проблеми. Це тільки аварії раз на кілька днів або тижнів, але це засмучує спроби RDP в моєму комп'ютері, щоб з'ясувати, що це не приймає з'єднання і немає нічого, що я можу зробити з цим, поки не повернуся додому.


Гарне рішення. Шлях до зусиль у вирішенні проблеми.
Twisty Impersonator
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.