Подключение по rdp с использованием ssh туннелей через промежуточный сервер

Использование ssh туннеля для подключения к удаленному рабочему столу windows, в случае если ssh сервер находится в одной сети с компьютером, к рабочему столу которого нужно подключиться, достаточно тривиально.
Более сложный случай - подключение к рабочему столу windows через сервер ssh когда все три устройства находятся в разных сетях. Например, это можно использовать для подключения к рабочему столу компьютера А, находящегося за файрволом, с другого компьютера B, который, в свою очередь, расположен за файрволом но в другой сети. Единственное условие - с обоих компьютеров должен быть доступен по ssh сервер C, на котором у пользователей компьютеров A и B есть учетные записи, настроенные соответствующим образом.
Принцип работы для такого примера:
1. На ssh сервере С создаем учетные записи для пользователей user1(под этим пользователем будем создавать туннель к ssh серверу с компьютера А) и user2(под этим пользователем будем создавать туннель к ssh серверу с компьютера В) с командной оболочкой /usr/sbin/nologin и домашним каталогом /var/empty. В sshd_config для пользователей добавляем строки вида

Match User user1
 PermitOpen 127.0.0.1:20000
 ForceCommand /usr/sbin/sbin/nologin
Match User user2
 PermitOpen 127.0.0.1:20000
 ForceCommand /usr/sbin/sbin/nologin
Т.о. обеспечиваем невозможность открыть терминальную сессию и разрешаем только форвардинг через 127.0.0.1:20000. Для дополнительной безопасности настраиваем авторизацию по ключу для этих пользователей.
2. На комапьютере В поднимаем ssh туннель с помощью plink.exe ( консольная версия putty )
PLINK.EXE -ssh -N -L 127.0.0.1:5000:127.0.0.1:20000 -l user2 my.ssh.server.com
здесь
127.0.0.1:5000 - вход в тоннель со стороны компьютера В, 127.0.0.1:20000 - выход из тоннеля со стороны ssh сервера
-N - не запускать на сервере shell ( не выполнять команды )
3. На компьютере А поднимаем ssh туннель аналогично
PLINK.EXE -ssh -N -R 127.0.0.1:20000:127.0.0.1:8889 -l user1 my.ssh.server.com

здесь 127.0.0.1:20000 - вход в тоннель со стороны ssh сервера, 127.0.0.1:8889 - выход тоннеля на стороне компьютера А
-N - не запускать на сервере shell ( не выполнять команды )
Замечу, что в данном примере порт RDP на компьютере А был изменен со стандартного 3389 на 8889 через ключ реестра
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber] - ОС WinXP
Теперь для подключения к рабочему столу компьютера А с компьютера В, запускаем на компьютере В mstsc ( Подключение к удаленному рабочему столу) и подключаемся к 127.0.0.1:5000
Еще одно важное замечание, касающееся работы этой схемы. Для подключения по rdp по такому тоннелю должны выполняться два условия:
1. Должен быть поднят туннель с двух сторон.
2. На компьютере А пользователь , под учетной записью которого будет производиться вход с компьютера В, не должен быть залогинен в системе на компьютере А.
Т.о., для работы такой схемы нужно чтобы либо тоннель со стороны компьютера А поднимался автоматически при старте системы, либо он должен быть поднят под учетной записью другого пользователя.

Полезные ссылки:
http://rus-linux.net/MyLDP/sec/SSH-Tunneling.html - ssh туннелинг
http://www.pc-freak.net/blog/start-ssh-tunnel-pc-boots-windows-alwaysup/ как запускать туннель автоматически при старте системы
http://www.pc-freak.net/blog/creating-ssh-tunnel-windows-plink/ - как запускать туннель с помощью bat скрипта
http://unix.stackexchange.com/questions/14312/how-to-restrict-an-ssh-use... - как ограничить права ssh пользователя только возможностью ssh туннеллинга
https://www.simonholywell.com/post/2009/04/samba-file-share-over-ssh-tun... - туннель для samba

ssh туннели под андроид - приложение ssh tunnel - см http://4pda.ru/forum/index.php?showtopic=550172