Как использовать туннель SSH в качестве альтернативы переадресации портов?

Я хочу использовать SSH в качестве альтернативы переадресации портов для использования моего RDP-сервера извне, поскольку маршрутизатор моего ISP не разрешает переадресацию портов. Вот что я имею в виду:

A - client connecting to the RDP server B - server C - device running the RDP server 

A хочет подключиться к C. Непосредственное подключение к C невозможно, поэтому весь трафик должен проходить через B.

Пример:
A отправляет пакет, содержащий «Hello world!». C должен отвечать «Test OK!». IP-адрес A равен 255.255.255.255. IP B – 1.2.3.4. IP C – это 4.5.6.7.
Таким образом, 255.255.255.255 открывает сокет в 1.2.3.4. A посылает «Привет мир!». B пересылает пакет на C. C отвечает «Test OK!» и отправляет его обратно B. B отправляет его обратно A.
Я хотел бы сделать что-то подобное с RDP-сервером.

B запускает Debian 8, а C запускает Windows 7.

Вы не указываете, какая ОС ваш клиент, A, работает в вашем примере. Я предполагаю, что есть доступный клиент командной строки ssh. Затем вы можете использовать

  you@A $ ssh -L54321:serverC:3389 serverB -p 12322 -l yourloginnameonB 

для создания туннеля.

Эта командная строка нуждается в некотором объяснении. Давайте сделаем эту часть по частям.

  • Переключатель -L заставляет SSH создавать туннель между портом 54321 на вашем клиентском компьютере, A (обратите внимание на приглашение) и порт 3389 на сервере C (где я предполагаю, что RDP-сервер запущен).
  • serverB – это имя машины, на которую вы нацеливаете эту команду ssh. Поскольку вы будете подключаться через B, укажите здесь полное имя хоста.
  • Если ваш SSH-сервер, B, использует нестандартный порт для ssh (как это часто рекомендуется для интернет-компьютеров), введите здесь этот номер в качестве параметра -p. В моем примере B использует порт 12322 для SSH.
  • Наконец, параметр -l позволяет указать имя входа (т. Е. Вашу учетную запись) для использования при входе на серверB.

Если эта команда завершится успешно, вы сможете направить RDP-клиент A на localhost: 54321, и вам будет похоже, что вы напрямую подключаетесь к C: 3389.

Предполагая, что ваша локальная машина («A») является POSIX-машиной, например OpenSSH, вы можете сделать это одним из двух способов:

Вы можете делать это ad-hoc каждый раз, когда вы связываетесь с аргументами для SSH-клиента:

 ssh -L13389:serverC:3389 username@serverB rdesktop localhost:13389 # Or point any RDP client to localhost:3389 

Или, для более постоянной настройки, вы можете добавить следующее в свой файл ~/.ssh/config :

 host serverB LocalForward localhost:13389 serverB:3389 

Затем, в любое время, когда вы ssh на serverB, туннель будет открыт. Один из побочных эффектов этого, однако, заключается в том, что если вы откроете несколько параллельных подключений к серверуB, вы получите предупреждения о том, что туннель уже на месте.