Кидок портів через SSH-тунель в Windows

У цій статті ми покажемо, як використовувати вбудований в Windows OpenSSH сервер для проброса портів через SSH тунель (SSH тунелюватись). Перенаправлення портів в SSH дозволяє туннелировать (прокидати) порти додатків з локального комп'ютера на віддалений сервер і навпаки. Раніше кидок портів через SSH тунель використовувався тільки в середовищі Linux / Unix, але тепер ви можете скористатися цим можливостями і в Windows. Розглянемо на практичному прикладі, як на Windows Server через SSH сервер з відкритим портом TCP 22 прокинути RDP підключення.

Найчастіше кидок портів через SSH застосовується в сценаріях, коли потрібно підключитися до віддаленого комп'ютера, який захищений фаєрволом. Наприклад, у вас є сервер c Windows, на якому відкритий тільки SSH порт (TCP 22). Всі інші порти блокуються апаратним фаєрволом або брандмауером Windows. Ваше завдання підключитися до робочого столу цього Windows сервера за допомогою клієнта RDP. Здавалося б, неможливе завдання, тому що порт RDP 3389 блокується брандмауером. Однак ви можете скористатися технологією проброса портів через ssh-тунель.

Найчастіше використовуються такі сценарії проброса SSH:

  • Local TCP forwarding - кидок локального порту на віддалений сервер;
  • Remote TCP forwarding - кидок віддаленого порту на локальний комп'ютер;
  • Подвійний SSH тунель - дозволяє з'єднати між собою через SSH сервер комп'ютери без виділених білих IP адрес або знаходяться за NAT (якщо не підходить рішення з OpenVPN)

RDP доступ через SSH тунель (local TCP forwarding)

У цьому режимі ви створюєте на своєму комп'ютері локальний TCP порт, підключення до якого перенаправляються через SSH тунель на вказаний порт віддаленого сервера. У цьому прикладі ми створимо локальний порт 8888, при підключенні до якого виконується перенаправлення з цього порту на RDP порт 3389 віддаленого комп'ютера. Загальна схема підключення виглядає так:

Для створення SSH тунелю за допомогою вбудованого SSH клієнта (вбудований в Windows 10 1809 і Windows Server 2019), виконайте команду:

ssh -L 8888: 192.168.1.90: 3389 [email protected]

Щоб SSH тунель працював у фоновому режимі, потрібно додасть параметр -f.

Тепер, щоб підключиться до віддаленого комп'ютера через SSH тунель, вам потрібно підключиться RDP-клієнтом mstsc.exe на локальний порт 8888 свого комп'ютера:

127.0.0.1:8888

Авторизуйтесь на віддаленому комп'ютері і можете спокійно працювати в RDP-сесії, при цьому ви пам'ятаєте, що порт 3389 все ще закритий у файервол. За допомогою TCPView ви можете переконатися, що RDP підключення встановлено локально (RDP підключення ініційовано запущеним локально SSH сервером).

Зверніть увагу, що якщо ви перенаправляє таким чином незашифрований трафік додатки, то по мережі він передається в зашифрованому вигляді. Трафік в чолом випадку шифрується на одному кінці SSH з'єднання і розшифровується на іншому.

У такому режимі інші комп'ютери у вашій локальній мережі теж зможуть підключитися до віддаленого RDP сервера, навіть якщо у них повністю заблокований прямий доступ до віддаленого сервера (як по SSH, так і по RDP). Для цього, вони повинні підключитися RDP клієнтом до порту 8888 на вашому комп'ютері, на якому створено SSH тунель:

mstsc.exe / v 10.10.1.220:8888

Перекидання віддаленого порту на локальну машину (Remote TCP forwarding)

Є ще один варіант застосування SSH тунелю - remote TCP forwarding. Через SSH тунель ви можете відкрити доступ віддаленого сервера до локального порту на вашому комп'ютері або порту на іншому комп'ютері у вашій локальній мережі. Наприклад, ви хочете, щоб зовнішній сервер (192.168.1.90) отримав доступ до вашого Інтранет сайту (не опублікований в Інтернеті). Для створення зворотного тунелю, використовуйте таку команду:

ssh -R 8080: internalwebsever: 80 [email protected]

Тепер, щоб на віддаленому SSH сервер отримати доступ до веб сервера internalwebsever досить в браузері набрати адресу http: // localhost: 8080.

У всіх версіях Windows можна створити правила перенаправлення портів за допомогою команди netsh interface portproxy.

За допомогою SSH тунелів ви можете будувати цілі ланцюжки для форвардинга портів. Включити або відключити SSH тунелювання можна в файлі конфігурації sshd_config директивами:

AllowStreamLocalForwarding yes

AllowTcpForwarding remote