Прокидывание портов в ssh


Этот очень простой прием бывает часто нужен, особенно в целях безопасного доступа 
во внутренние сети. Для осмысления постараюсь привести частный случай, который, 
конечно не является единственным.

Итак, нужно попась снаружи на компьютер в локальной сети. Компьютер загорожен от 
мира сервером - ясное дело, с двумя интерфейсами, внутренним (server_local) и 
внешним (server_global). На сервере открыты только 2 порта - 22 (ssh) и некоторый 
произвольный - 50000, который пока ничем не занят. На локальном компьютере 
(workstation_local) я хочу порулить через VNC - порт 5900, но наружу он не открыт 
совсем никак, и добраться до него я могу только через ssh. Делаю это так.

Подразумеваю:

* server_global - это внешний адрес сервера.
* server_local - это внутренний адрес сервера.
* workstation_local - это адрес локального компьютера в локальной сети, к 
  которому я хочу попасть из далекого интернета через порт 50000

Сначала захожу снаружи на сервер, как обычно, по ssh:

$ ssh user@server_global

Далее, уже находясь в консоли на сервере как user, делаю так:

$ ssh user@server_local -L server_global:50000:workstation_local:5900

Ввожу пароль и дальше, с удаленной машины (в другом окне) пишу что-то типа:

$ vnc server_global:50000

И попадаю сразу на удаленный компьютер в локальной сети. Таким же образом, я могу 
пробросить порт 50000 куда угодно и как надо, но только на один сервис в единицу 
времени.

Кажется, очень подробно объяснил, подробнее некуда. Надеюсь, вопросов ни у кого 
не будет.


Кстати, похожими туннелями можно пользоваться и для web-серфинга. К примеру так:

$ ssh -f -C -D 9999 server_ip_address -N
$ chromium  --proxy-server="socks5://localhost:9999"