Вы можете использовать встроенный OpenSSH сервер в Windows для проброса портов через SSH-туннель (SSH туннелирования). Перенаправление портов в SSH позволяет туннелировать (пробрасывать) порты приложений с локального компьютера на удаленный сервер и наоборот. Проброс портов через SSH туннель широко используется в среде Linux/Unix, а теперь вы можете воспользоваться этим возможностями и в Windows. В этом примере мы покажем, как пробросить RDP подключение через OpenSSH на хосте Windows Server.
Содержание:
- Для чего нужны SSH-туннели?
- Защищенный доступ к RDP через SSH туннель (local TCP forwarding)
- SSH туннель в Windows с помощью Putty
- Переброс удаленного порта на локальную машину (Remote TCP forwarding)
Для чего нужны SSH-туннели?
SSH-туннель обеспечивает защищенное шифрованный TCP соединение локальных хостом и удалённым сервером SSH. SSH Port Forwarding позволяет туннелировать поверх SSH подключение к локальному порту на локальном компьютере к любому TCP порту на удаленном сервере (или наоборот)
Порт форвардинг в SSH-туннелях применяются для:
- Обхода межсетевых экранов;
- Открытия бэкдоров в частные сети;
- Организации простых VPN/прокси сценариев для безопасного удаленного подключения;
- Защиты трафика устаревших приложений (протоколов), которые передают данные в открытом тексте (без шифрования).
Вы можете перенаправить в SSH туннель только TCP трафик/порт (UDP и ICMP протоколы не поддерживаются).
Проброс портов через SSH туннель можно использовать в сценариях, когда нужно подключиться к удаленному компьютеру, который защищен межсетевым экраном. Например, у вас имеется сервер c Windows, на котором наружу открыт только SSH порт (TCP 22). Все остальные порты блокируются аппаратным межсетевым экраном или Windows Defender Firewall 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 клиент. Можно использовать сторонний клиент (например, Putty), но я буду использовать встроенный SSH клиент в Windows. Чтобы установить клиенте OpenSSH, выполните в консоли PowerShell команду:
Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'
Чтобы создать SSH туннель с удаленным компьютером 192.168.1.90, выполните команду:
ssh -L 8888:192.168.1.90:3389 [email protected]
В этом примере используется формат
LOCAL_PORT:DESTINATION:DESTINATION_PORT
и
USER@DEST_SERVER_IP
(имя пользователя и адрес удаленного SSH сервера)
Чтобы SSH туннель работал в фоновом режиме, нужно добавит параметр –f.
Теперь, чтобы подключится к удаленному компьютеру по RDP через SSH туннель, вам запустить RDP-клиент (mstsc.exe) и подключиться на локальный порт 8888 своего компьютера:
127.0.0.1:8888
Выполните аутентификацию на удаленном компьютере и можете спокойно работать в RDP-сессии. С помощью команды Get-NetTCPConnection или утилиты TCPView вы можете убедиться, что RDP подключение установлено локально (RDP подключение инициировано запущенным локально SSH сервером):
Get-NetTCPConnection -State Established|where {$_.localport -eq "3389"}|fl
При этом порт TCP/3389 на сервере не доступен с удаленного компьютера. Вы можете проверить доступность порта с помощью командлета Test-NetConnection:
Test-NetConnection 192.168.1.90 -port 3389
TcpTestSucceeded : False
Обратите внимание, что если вы перенаправляете таким образом незашифрованный трафик приложения, то по сети он передается в зашифрованном виде. Трафик шифруется на одном конце SSH соединения и расшифровывается на другом.
Другие компьютеры в вашей локальной сети смогут одновременно подключиться к удаленному RDP серверу Windows, даже если у них полностью заблокирован прямой доступ к удаленному серверу (как по SSH, так и по RDP). Для этого, они должны подключиться RDP клиентом к порту 8888 на компьютере, на котором создан SSH туннель:
mstsc.exe /v 10.10.1.220:8888
Защита RDP подключения с помощью SSH туннеля может быть хорошей альтернативой VPN для доступа к публичным Windows хостам в Интернете. В этом случае вам не нужно открывать прямой доступ к порту RDP/3389 из Интернета к хосту Windows. Достаточно открыть только порт SSH/22, что защитит вас от атак подбора пароля по RDP и эксплуатации 0-day RDP уязвимостей.
Для автоматического ввода пароля для подключения к SSH можно использовать утилиту sshpass. Ее можно запустить через подсистему WSL2 для Windows.
Установите sshpass в Ubuntu WSL:
$ sudo apt-get -y install ssphass
Запустите клиент Remote Desktop Connection (mstsc.exe) и сохраните в Windows RDP файл с настройками подключения:
Computer : localhost:8888 User name : remoteusername
Для автоматического подключения к удаленном RDP хосту с сохранённым паролем SSH, используйте такой bat файл:
start /min wsl sshpass -p "password" ssh -L 8888:192.168.31.90:3389 [email protected]
powershell sleep 5
start mstsc C:\rdp\localhost-33389.rdp
Или (предпочтительно) настройте SSH аутентификацию по ключам.
SSH туннель в Windows с помощью Putty
Рассмотрим, как настроить SSH туннель в Windows с помощью популярного SSH клиента Putty.
- Запустите PuTTY и перейдите в раздел Connection -> SSH -> Tunnels;
- В поле Source port укажите локального порта (в нашем примере это 8888);
- Укажите IP адрес сервера SSH и порт на удаленном хосте, на который нужно выполнить переадресацию:
192.168.31.90:3389
- Выберите Local в качестве Destination и нажмите Add;
- Чтобы не открывать shell удаленного хоста при подключении через туннель, включите опцию Don’t start a shell or command at all в разделе SSH;
- Вернитесь на вкладку Session, укажите имя или IP адрес удаленного SSH хоста и порт подключения (по умолчанию порт 22). Чтобы сохранить настройки подключения, укажите имя сессии в поле Saved Session и нажмите Save;
- Теперь вы можете запустить сохраненный SSH туннель в Putty прямо и панели задач Windows.
Переброс удаленного порта на локальную машину (Remote TCP forwarding)
Есть еще один вариант применения SSH туннеля – remote TCP forwarding. Через SSH туннель вы можете открыть доступ удаленному серверу к локальному порту на вашем компьютере или порту на другом компьютере в вашей локальной сети. Например, вы хотите, чтобы внешний сервер (192.168.1.90) получил доступ к вашему Интранет сайту (не опубликованному в Интернете). Для создания обратного туннеля, используйте такую команду:
ssh -R 8080:internalwebsever:80 [email protected]
Теперь, чтобы на удаленном SSH сервер получить доступ к веб серверу internalwebsever достаточно в браузере набрать адрес
http://localhost:8080
.
С помощью SSH туннелей вы можете строить целые цепочки для форвардинга портов. Включить или отключить SSH туннелирование можно в конфигурационном файле OpenSSH (sshd_config) с помощью директив:
AllowStreamLocalForwarding yes
AllowTcpForwarding remote
PermitTunnel no
Данные опции неприменимы для текущей версии OpenSSH в Windows.
Время на прочтение8 мин
Количество просмотров191K
Прим. переводчика: автор статьи рассматривает практические сценарии и примеры организации SSH-туннелей. А для более наглядного объяснения того, как это работает, графически показывает потоки трафика.
Туннели SSH — это зашифрованные TCP-соединения между клиентами и серверами SSH. Трафик входит с одной стороны туннеля и прозрачно выходит с другой. Изначально этот термин относился к туннелям на виртуальных сетевых интерфейсах TUN/TAP, однако сейчас так обычно называют проброс портов SSH.
Например, вот так будет выглядеть схема обратного туннеля, в котором обращение к порту 80 SSH-клиента выполняется через SSH-сервер с определенного IP-адреса (1.2.3.4
):
Сценарии использования туннелей*:
-
Предоставление зашифрованных каналов для протоколов, передающих данные «открытым текстом».
-
Открытие бэкдоров в частные сети.
-
Обход межсетевых экранов.
*. Примечание
Перечень дополняется. Не стесняйтесь предлагать примеры или исправления
на GitHub.
Проброс портов
Перенаправляет порт из одной системы (локальной или удаленной) в другую.
Проброс локального порта
Проброс локальных портов позволяет перенаправить трафик с SSH-клиента на целевой хост через SSH-сервер. Другими словами, можно получить доступ к удаленным сервисам по зашифрованному соединению так, как будто они локальные. Примеры использования:
-
доступ к удаленному сервису (Redis, Memcached и т. д.) по внутреннему IP-адресу;
-
локальный доступ к ресурсам, размещенным в частной сети;
-
прозрачное проксирование запроса к удаленному сервису.
Проброс удаленного порта
Проброс удаленного порта позволяет направить трафик с SSH-сервера в пункт назначения либо через SSH-клиент, либо через другой удаленный хост. Открывает пользователям в публичных сетях доступ к ресурсам в частных сетях. Примеры использования:
-
открытие доступа к локальному серверу разработки через публичную сеть;
-
предоставление доступа с ограничением по IP-адресу к удаленному ресурсу в частной сети.
Динамический проброс портов
При динамической переадресации портов на SSH-клиенте поднимается SOCKS-прокси для перенаправления TCP-трафика через SSH-сервер на удаленный хост.
Пересылка с системных (privileged) портов
Для пересылки трафика с системных портов (1–1023) необходимо запустить SSH с правами суперпользователя в системе, на которой открывается порт.
sudo ssh -L 80:example.com:80 ssh-server
Флаги командной строки SSH
Ниже приведены несколько полезных флагов при создании туннелей:
-f # переводит процесс ssh в фоновый режим;
-n # предотвращает чтение из STDIN;
-N # не выполнять удаленные команды. Полезно, если нужно только перенаправить порты;
-T # отменяет переназначение терминала.
Вот пример команды для создания SSH-туннеля в фоновом режиме и проброса локального порта через SSH-сервер:
ssh -fnNT -L 127.0.0.1:8080:example.org:80 ssh-server
Для краткости примеры ниже приводятся без флагов командной строки.
Проброс локального порта
Перенаправление соединений с порта локальной системы на порт удаленного хоста:
ssh -L 127.0.0.1:8080:example.org:80 ssh-server
Перенаправляет локальные подключения к 127.0.0.1:8080 на 80-й порт example.org через SSH-сервер. Трафик между локальной системой и SSH-сервером идет по SSH-туннелю. Трафик между SSH-сервером и example.org — нет. С точки зрения example.org трафик идет от SSH-сервера.
ssh -L 8080:example.org:80 ssh-server
ssh -L *:8080:example.org:80 ssh-server
Команды выше открывают доступ к example.org:80 через SSH-туннель для подключений на порт 8080 на всех интерфейсах локальной системы.
ssh -L 192.168.0.1:5432:127.0.0.1:5432 ssh-server
Переадресует соединения с 192.168.0.1:5432 в локальной системе на 127.0.0.1:5432 на SSH-сервере. Обратите внимание, что здесь 127.0.0.1 — localhost с точки зрения SSH-сервера.
Конфигурации SSH
Убедитесь, что на SSH-сервере включена переадресация TCP (по умолчанию так и должно быть). Проверьте запись в файле /etc/ssh/sshd_config
:
AllowTcpForwarding yes
При переадресации портов на интерфейсы, отличные от 127.0.0.1, в локальной системе необходимо включить GatewayPorts
(в /etc/ssh/ssh_config
или в командной строке):
GatewayPorts yes
Сценарии использования
Подходит для случаев, когда требуется защищенное соединение для доступа к удаленному сервису, который работает с незашифрованными данными. Например, Redis и Memcached используют протоколы на основе plaintext-данных.
В случае если защищенный доступ к одному из таких сервисов на удаленном сервере организован по общедоступным сетям, можно настроить туннель от локальной системы до этого сервера.
Проброс удаленного порта
Пробрасывает порт на удаленной системе в другую систему.
ssh -R 8080:localhost:80 ssh-server
Перенаправляет трафик с порта 8080 SSH-сервера для всех интерфейсов на порт localhost:80 на локальном компьютере. Если один из интерфейсов смотрит в Интернет, трафик, адресуемый на порт 8080, будет перенаправляться на локальную систему.
ssh -R 1.2.3.4:8080:localhost:80 ssh-server
Переадресует трафик с порта 8080 SSH-сервера на localhost:80 в локальной системе, при этом доступ ко входу в SSH-туннель со стороны сервера разрешен только с IP-адреса 1.2.3.4 (обратите внимание: директиву GatewayPorts
необходимо установить в clientspecified
).
Прим. переводчика: здесь, возможно, ошибка. Флаг -R
— это binding_address
, выбор IP адреса на машине, на котором SSH-сервер будет слушать порт. Соответственно вместо одного человечка с IP должны быть человечки, а вместо ssh_server:8080
должно быть 1.2.3.4:8080
.
ssh -R 8080:example.org:80 ssh-server
Переадресует трафик с порта 8080 SSH-сервера для всех интерфейсов на localhost:80 в локальной системе. Далее трафик из локальной системы направляется на example.org:80. С точки зрения example.org источником трафика выступает локальная система.
Конфигурация SSH-сервера
SSH-сервер конфигурируется в файле /etc/ssh/sshd_config
.
По умолчанию переадресуемые порты недоступны для доступа из Интернета. Для переадресации публичного интернет-трафика на локальный компьютер добавьте в sshd_config
на удаленном сервере такую строку:
GatewayPorts yes
Также в sshd_config
можно указать, каким клиентам разрешен доступ:
GatewayPorts clientspecified
Динамический проброс портов
Перенаправление трафика с нескольких портов на удаленный сервер.
ssh -D 3000 ssh-server
Команда выше поднимает SOCKS-прокси на порту 3000 для всех интерфейсов в локальной системе. Теперь трафик, отправленный через прокси-сервер на SSH-сервер, можно адресовать на любой порт или конечный хост. По умолчанию используется протокол SOCKS5, поддерживающий TCP и UDP.
ssh -D 127.0.0.1:3000 ssh-server
Поднимает SOCKS-прокси на 127.0.0.1:3000 в локальной системе.
При работающем SOCKS-прокси можно настроить браузер на его использование для доступа к ресурсам так, как будто соединения исходят от SSH-сервера. Например, если у SSH-сервера есть доступ к другим серверам в частной сети, с помощью SOCKS-прокси можно заходить на эти серверы локально (словно вы находитесь в той же сети), и не нужно настраивать VPN.
Работу SOCKS-прокси можно проверить командой:
curl -x socks5://127.0.0.1:12345 https://example.org
Конфигурация SSH-клиента
SSH-клиент настраивается в файле /etc/ssh/ssh_config
.
Включите GatewayPorts
в системе, чтобы открыть доступ другим интерфейсам к SOCKS-прокси:
GatewayPorts yes
Поскольку GatewayPorts
конфигурируется на SSH-клиенте, вместо ssh_config
для настройки можно использовать параметры командной строки:
ssh -o GatewayPorts=yes -D 3000 ssh-server
Jump-хосты и команды прокси-сервера
Прозрачное подключение к удаленному хосту через промежуточные.
ssh -J user1@jump-host user2@remote-host
ssh -o "ProxyJump user1@jump-host" user2@remote-host
Устанавливает SSH-соединение с jump-хостом и переадресуют трафик на удаленный хост.
Подключается к удаленному хосту через промежуточный jump-хост. Приведенная выше команда должна сработать сразу, если у jump-хоста уже есть SSH-доступ к удаленному хосту. Если нет, можно использовать agent forwarding
для проброса SSH-ключа с локального компьютера на удаленный хост.
ssh -J jump-host1,jump-host2 ssh-server
Можно указать несколько jump-хостов через запятую.
ssh -o ProxyCommand="nc -X 5 -x localhost:3000 %h %p" user@remote-host
Подключение к удаленному серверу через SOCKS5 с использованием netcat
. С точки зрения сервера, IP-адрес отправителя принадлежит прокси-хосту. При этом для SSH-соединения используется сквозное шифрование, так что прокси-хост видит только зашифрованный трафик между локальной системой и удаленным хостом.
Конфигурация SSH-клиента
SSH-клиент конфигурируется в файле /etc/ssh/ssh_config
.
Для подключения agent forwarding
можно добавить локальный SSH-ключ к локальному SSH-агенту с помощью ssh-add
:
ssh-add
Надежные SSH-туннели
Перечисленные выше команды работают на разовой основе: вы сразу получаете конкретный результат, и на этом их работа заканчивается. Поэтому, чтобы обеспечить защиту SSH-туннелей от сбоев в сети или ненадежных соединений, придется выполнить дополнительную настройку.
По умолчанию TCP-соединение, используемое для создания SSH-туннеля, может разрываться после некоторого периода бездействия. Чтобы это предотвратить, нужно настроить сервер (/etc/ssh/sshd_config
) на отправку heartbeat-сообщений:
ClientAliveInterval 15
ClientAliveCountMax 4
На отсылку таких сообщений также можно настроить клиент (/etc/ssh/ssh_config
):
ServerAliveInterval 15
ServerAliveCountMax 4
Использование AutoSSH
Указанные выше настройки могут предотвратить разрывы из-за неактивности, но они не в состоянии восстановить прерванные соединения. Для автоматического перезапуска SSH-туннеля можно воспользоваться утилитой autossh
— она создает SSH-туннель и отслеживает его работоспособность.
AutoSSH принимает те же аргументы для настройки переадресации портов, что и SSH:
autossh -R 2222:localhost:22 ssh-server
Эта команда создает туннель, способный восстанавливаться после сетевых сбоев. По умолчанию AutoSSH открывает дополнительные порты на SSH-клиенте/сервере для проверки работоспособности (healthcheck). Если трафик не проходит между healthcheck-портами, AutoSSH перезапускает туннель.
autossh -R 2222:localhost:22 \
-M 0 \
-o "ServerAliveInterval 10" -o "ServerAliveCountMax 3" \
remote-host
Флаг -M 0
отключает healthcheck-порты (за проверку работоспособности в этом случае отвечает SSH-клиент). В примере выше сервер должен посылать сигналы каждые 10 секунд. Если не проходят три подряд сигнала, SSH-клиент завершает работу, а AutoSSH поднимает новый туннель.
Дополнительные примеры и сценарии использования
Прозрачный доступ к удаленному ресурсу в частной сети.
Предположим, в частной сети есть Git-репозиторий, доступ к которому возможен только через выделенный сервер в этой сети. Сервер не подключен к Интернету. Есть прямой доступ к серверу, но нет VPN-доступа к частной сети.
Требуется открыть доступ к Git-репозиторию, как если бы подключение к нему шло напрямую из локальной системы. Если есть SSH-доступ к другому серверу, который доступен как с локального компьютера, так и с выделенного сервера, можно создать SSH-туннель и воспользоваться директивами ProxyCommand.
ssh -L 127.0.0.1:22:127.0.0.1:2222 intermediate-host
Команда выше пробрасывает порт 2222 на промежуточном хосте на порт 22 выделенного сервера. Теперь можно подключиться к SSH-серверу на выделенном сервере, несмотря на то, что он недоступен из Интернета.
Прим. переводчика: возможно, что здесь тоже ошибка: перепутаны местами 22 и 2222 порты в команде.
ssh -p 2222 user@localhost
Для большего удобства можно добавить несколько директив в локальный ~/.ssh/config
:
Host git.private.network
HostName git.private.network
ForwardAgent yes
ProxyCommand ssh private nc %h %p
Host private
HostName localhost
Port 2222
User private-user
ForwardAgent yes
ProxyCommand ssh tunnel@intermediate-host nc %h %p
В результате пользователь получает доступ к локальному Git-репозиторию, как если бы находился в частной сети.
P.S.
Читайте также в нашем блоге:
-
«Техническая история Kubernetes: секреты создателя»;
-
«Kubernetes без интернета: как мы устанавливаем Deckhouse в закрытом контуре (обзор и видео доклада)»;
-
«Как мы работаем со Stateful в Kubernetes: особенности и подводные камни».
SSH-туннели нужны для установки защищенных каналов между локальной машиной и удалённым сервером. Через них можно, например, передавать и редактировать файлы, запускать приложения, сохранять резервные копии.
Как устроен туннель
SSH — это Secure Shell, защищённый сетевой протокол для удалённого управления. Он шифрует трафик и работает со всеми популярными операционными системами.
Для установки безопасного подключения к удалённой машине используется SSH-туннелирование. Однако под туннелем здесь подразумевается не инкапсуляция одного протокола в другом. Речь идёт о том, что администратор выполняет через SSH проброс портов. Технология подразумевает передачу TCP-пакетов и трансляцию IP-заголовков при передаче информации, если соблюдаются правила.
cloud
Как создать туннель
Для идентификации пользователя нужны два ключа — приватный и публичный (открытый). Открытый хранится на сервере, приватный — на локальной машине. Создание безопасного подключения отличается в зависимости от операционной системы.
Ubuntu и другие дистрибутивы Linux/macOS
Запустите терминал и выполните команду:
ssh-keygen -t rsa
В терминале появится диалог:
Enter file in which to save the key (/home/user/.ssh/id_rsa):
По умолчанию приватная часть сохраняется в папку .ssh
в файл id_rsa
. Вы можете указать другие адрес и имя файла.
Затем система предложит создать пароль для дополнительной защиты ключа. Это нужно, чтобы его не могли использовать все, кто имеет доступ к локальной машине. Полезная настройка безопасности, если одним компьютером пользуются несколько человек. Если пароль не нужен, оставьте поле пустым и нажмите Enter.
Enter passphrase (empty for no passphrase):
После успешного создания пары ключей в терминале появится такая запись:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
476:b2:a8:7f:08:b4:c0:af:81:25:7e:21:48:01:0e:98 user@localhost
Теперь нужно скопировать публичный ключ и добавить его на удалённую машину. Можно открыть файл /home/user/.ssh/id_rsa.pub
через любой текстовый редактор или вывести его содержимое в терминале:
cat ~/.ssh/id_rsa.pub
Скопируйте ключ и добавьте его на сервер. Убедитесь, что в нём нет пробелов и переносов.
Можно скопировать открытый ключ автоматически, используя команду:
ssh-copy-id user@remoteserver
Вместо user вы указываете имя пользователя, вместо remoteserver
— хост или IP-адрес удалённой машины на timeweb.cloud или другой платформе.
Создание безопасного подключения завершено. Чтобы подключиться через SSH-port, выполните:
ssh root@HOST
Вместо параметра HOST
укажите публичный IP-адрес сервера, на который вы добавили открытый ключ. Если вы не создавали пароль для дополнительной защиты закрытой части, то вводить ничего больше не нужно. Система сверит открытый и закрытый ключи и при обнаружении соответствия установит защищенное соединение.
При первом подключении система предупредит о неизвестном хосте и уточнит, доверяете ли вы ему. Введите ‘yes’ и нажмите Enter.
Чтобы сделать подключение безопаснее, не стоит использовать аккаунт с правами суперпользователя. Кроме того, можно ограничить связь между консолями локальной машины и удалённого сервера, указав параметр -N
. Пример команды:
ssh -N -L -g 3389:192.168.0.105:3389 user@rt.example.com
Это исключит ситуацию, при которой пользователь случайно выполняет на удалённой машине команды, предназначенные для локального компьютера.
Windows
На Windows создать пару ключей можно двумя способами — через консоль PowerShell и с помощью программы PuTTygen (устанавливается вместе с PuTTy).
Чтобы сгенерировать ключи через PowerShell, откройте терминал и выполните:
ssh-keygen -t rsa
Защитите приватный ключ паролем или оставьте поле пустым и нажмите Enter.
По умолчанию открытый ключ сохраняется в файле ~/.ssh/id_rsa.pub
. Приватный ключ с именем id_rsa
лежит в той же папке. Откройте файл с публичным ключом через текстовый редактор или воспользуйтесь командой cat
в PowerShell:
cat ~/.ssh/id_rsa.pub
Скопируйте публичный ключ и добавьте его на удаленный сервер.
Чтобы подключиться к серверу, выполните:
ssh root@HOST
Вместо параметра HOST
укажите публичный IP-адрес удаленного сервера, на который вы добавили открытый ключ. Если вы не создавали пароль для дополнительной защиты закрытого ключа, то вводить ничего больше не нужно. Система сверит открытый и закрытый ключи и при обнаружении соответствия установит SSH-туннель в Windows.
При первом подключении ОС предупредит о неизвестном хосте и уточнит, доверяете ли вы ему. Введите ‘yes’ и нажмите Enter.
Чтобы сгенерировать пароль с помощью PuTTygen:
- Нажмите кнопку Generate.
- Подвигайте курсором в любом направлении до тех пор, пока строка прогресса не заполнится.
- Сохраните публичный и приватный ключи.
- Откройте файл с публичным ключом.
- Скопируйте публичный ключ и добавьте его на удаленный сервер.
Для подключения к удалённому серверу также можно использовать программу PuTTy. Запустите программу, в поле Host Name введите имя или IP-адрес хоста и нажмите Open.
Настроить в PuTTy SSH tunnel можно во вкладке Connection → SSH → Tunnels. Здесь указывается Source Port, Destination, а также параметры динамического подключения. Что это за настройки и как они влияют на соединение, рассмотрим далее.
Как использовать SSH Proxy
SSH-tunnel Proxy помогает организовать доступ к домашней или корпоративной системе. Важно только, чтобы приложения, которые используются для работы при подключении, поддерживали SOCKS-прокси. Один из вариантов такого использования туннелей — сотрудник подключается к рабочей сети, используя публичную сеть в другом конце мира, при этом вся информация шифруется.
Для туннелирования через прокси достаточно выполнить:
ssh -D 8888 user@remoteserver
Этой командой вы запускаете SOCKS-прокси. Порт — 8888. В этом случае служба работает на localhost. Но можно изменить команду, чтобы прослушивать Ethernet и Wi-Fi. Это позволит приложениям подключаться к прокси-серверу через Secure Shell.
Например, можно запустить браузер Google Chrome:
google-chrome --proxy-server="socks5://192.168.1.10:8888"
Команда создаёт SOCKS-прокси, а также инициирует туннелирование DNS-запросов
Что такое динамический SSH-tunnel
Динамический SSH-tunnel открывает локальный сокет TCP и использует его как SOCKS4/SOCKS5-прокси. Такой туннель отвечает всем требованиям безопасности.
Динамический туннель также подходит для однократного выхода в интернет:
ssh -D 1080 user@vps.example.com
SOCKS-прокси работает через порт 1080. Динамический туннель не предусматривает открытие портов во внешнюю сеть. Весь трафик проходит по нему, скрывая деятельность пользователя.
Для Windows динамический SSH-туннель в PuTTy настраивается на вкладке Connection → SSH → Tunnels.
Примеры использования туннелей
Рассмотрим несколько примеров использования туннелей.
Проброс портов — SSH Port Forwarding
SSH Forwarding — одна из самых распространенных операций, для которой требуется создать туннель. Вы открываете порт на локальной машине и выбираете порт на другом конце — удаленном сервере:
ssh -L 9999:127.0.0.1:80 user@remoteserver
В этой команде вы говорите, что нужно слушать порт 9999. Для проброса используется порт 80.
Обратный туннель
Туннель может работать и в обратном направлении. Для этого достаточно подключить слушающий порт к другому порту на локальной машине:
ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserver
В этом туннеле соединение идёт от удалённого сервера к порту 1999, затем к порту 902 на локальной машине.
Удалённое выполнение команд
Через Secure Shell можно создать интерфейс для выполнения команд на удалённой машине. Сами команды прописываются в качестве последнего аргумента. Пример:
ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.php
После скачивания лога на удалённом сервере выполнится команда grep.
Rsync через SSH
Бэкапы важных данных можно делать с помощью bzip2
. Порядок простой — сначала вы сжимаете каталог на удалённом сервере, а затем распаковываете на другой стороне: на локальной машине или на другом сервере, заведённом под хранение резервных копий. Пример команды:
tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"
Если бэкапы нужно делать регулярно (обычно так и происходит), то проще использовать команду rsync:
rsync -az /home/testuser/data proglibserver:backup/
Rsync не копирует файлы с нуля, а сравнивает отличия в разных временных точках. Это экономит время на создание бэкапов, а также помогает найти данные для восстановления при утере или повреждении.
Запуск приложений
Через SSH-туннель можно запускать GUI-приложения на удалённом сервере:
ssh -X remoteserver vmware
Несмотря на то, что приложение выполняется на удалённом сервере, его интерфейс доступен на локальной машине. Это удобно если, например, нужно больше ресурсов для работы, а локальная машина уже не справляется.
Прыжки по хостам
Если сеть сегментирована, то при туннелировании придётся пройти через несколько хостов. При этой рабочий сеанс должен быть полностью зашифрованным. Добиться такого результата можно с помощью параметра -J
. Для установления связи с каждым следующим хостом будет использоваться переадресация:
ssh -J host1,host2,host3 user@host4.internal
Локальная папка на удаленной машине
С помощью sshfs можно примонтировать локальный каталог к удалённому серверу.
sshfs user@proglibserver:/media/data ~/data/
Это удобное решение для обмена файлами и выполнения других операций.
Заключение
В этой статье мы узнали, что такое SSH-туннель, как им пользоваться, как его настроить на Linux, macOS и Windows, какие у него есть особенности и параметры конфигурации. Несколько распространенных сценариев также описаны в примерах использования.
Запоминать все команды и аргументы не нужно. Основные операции вы быстро начнёте делать на автомате, а более сложные случаи всегда можно посмотреть в справке или нашем руководстве на timeweb.cloud
SSH-туннелирование устанавливает защищенный канал связи между локальным рабочим узлом и удаленным сервером. Разбираемся, как можно создавать SSH-туннели, какие полезные для системного администратора функции они имеют и почему важно помнить о безопасности интернет-соединения.
Любые важные данные следует передавать по защищенным каналам информации. Но это не всегда легко реализовать, особенно когда пользователю нужно совершить срочные операции на удаленном сервере, а подключиться к интернету можно только через публичный незащищенный Wi-Fi. В таком случае используют SSH-туннелирование, устанавливающее защищенный канал связи между локальным рабочим узлом и удаленным сервером. С помощью него можно не только передавать или редактировать файлы дистанционно, но и запускать GUI-приложения, делать бэкап, передавать пароли и даже организовывать потоковое вещание.
Как устроены SSH-туннели
Создание, условия применения и польза для сисадминов
Ситуация, когда требуется срочный доступ к домашнему компьютеру или внутренней корпоративной сети, знакома каждому. К сожалению, качество и безопасность общественных сетей часто оставляют желать лучшего. Важную информацию по таким сетям лучше не передавать. Кроме того, для организации доступа часто требуется внешнее ПО (Team Viewer и другие). Для системного администрирования существует способ использования публичных сетей и при этом создания безопасного подключения к необходимым узлам без использования того же VPN. Речь о SSH-туннелировании.
SSH (от англ. Secure Shell — «безопасная оболочка») — сетевой протокол, который используется для удаленного управления ОС и проксировании TCP-соединений. Выполняет шифрование всего трафика (сюда же относятся пароли и другие важные для корпоративной безопасности данные). SSH-серверы работают с большинством сетевых операционных систем, представленных на рынке.
Подключиться по этому протоколу можно практически к любому серверу. Для организации безопасного соединения можно использовать так называемые SSH-туннели. Но с точки зрения терминологии — это не те туннели, о которых обычно идет речь, когда говорят о системном администрировании. Само наименование, SSH tunnel, сформировалось среди сисадминов для простоты обозначения технологии — SSH Port Forwarding (проброса портов). В ней реализовано сразу несколько возможностей сетевого протокола SSH, а именно — передача TCP-пакетов и трансляция IP-заголовка во время передачи информации при условии существования заранее заданного правила.
Главное отличие SSH tunnels от их аналогов с VPN — передача информации не происходит в любом направлении. Такой канал связи имеет одну точку входа и работает исключительно с TCP-пакетами. Создание SSH-туннелей скорее напоминает проброс портов поверх протокола, нежели туннелирование в чистом виде.
Как создать SSH-туннель и настроить его параметры
Для того, чтобы идентифицировать пользователя, требуется два ключа. Открытый ключ размещается непосредственно на сервере, а закрытый ключ создается и хранится на компьютере пользователя.
Создание ключа и установление соединения с удаленным сервером занимает несколько минут.
Создание SSH-ключа в Linux (Ubuntu)/MacOS. Пошаговая инструкция:
1. Для создания ключа требуется ввести следующую команду:
ssh-keygen -t rsa
2. После введения команды на экране управляющей консоли появится диалог:
Enter file in which to save the key (/home/user/.ssh/id_rsa):
3. Чтобы дополнительно защитить соединение, система предложит пользователю придумать и ввести специальное кодовое слово (фразу).
Enter passphrase (empty for no passphrase):
4. Разумеется, пункт № 3 можно пропустить, нажав Enter. То же самое следует сделать, отвечая на следующий вопрос.
5. Завершив создание двух типов ключей (публичного и закрытого), можно переходить к установке связи по SSH. На консоли появится сообщение:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
476:b2:a8:7f:08:b4:c0:af:81:25:7e:21:48:01:0e:98 user@localhost
The key's randomart image is:
+---[RSA 2048]----+
| ..o o |
| .. * * = . |
| . o O o B .|
| . . + = = o |
| oo S o = . .|
| .. B . = . . |
| . B o = ..|
| . .o.o.. o .. .|
| .oooE o. |
+----[SHA256]-----+
6. На следующем этапе в терминале необходимо ввести команду, которая покажет открытый ключ:
cat ~/.ssh/id_rsa.pub
7. Публичный ключ необходимо ввести в панели управления. Внимательно проверяйте корректность введения ключа.
8. Остается последний этап. Для создания SSH-туннеля к удаленному серверу достаточно выполнить одну команду:
ssh root@HOST
Параметр HOST ― публичный IP-адрес сервера.
Добавим, что введение дополнительных паролей не требуется. А при использовании сервера Selectel можно использовать свой скрипт (bash) для быстрой настройки.
Для удобства пользователей ОС Windows 10 можно создать SSH-туннель в эмуляторе под Windows (MinGW64).
Инструкция для создания SSH-туннеля в Windows 10 выглядит аналогичным образом:
1. Для генерации пары ключей используется команда:
ssh-keygen -t rsa
2. Желательно защитить приватный ключ паролем (или нажать Enter, если он не нужен):
3. Ключи сгенерированы:
4. Открытый ключ хранится в файле ~/.ssh/id_rsa.pub. Приватный ключ находится в файле id_rsa и должен храниться в секрете:
5. Чтобы посмотреть содержимое публичного ключа, используется команда:
cat ~/.ssh/id_rsa.pub
6. Этот ключ (всю строку, начинающуюся с ssh-rsa) необходимо вставить в панели управления Selectel, в поле Операционная система / SSH-ключ выбранного сервера. При установке ОС он будет скопирован в файл .ssh/authorized_keys. При смене ключа в панели управления Selectel текущий образ ОС будет пересоздан, а данные на сервере — утеряны.
7. Для подключения к серверу по SSH используется команда:
ssh root@84.38.187.48 (IP-адрес сервера будет другим).
8. При первом подключении утилита SSH сообщает о неизвестном хосте и спрашивает, уверены ли вы, что доверяете ему. Если ответ положительный (следует ответить yes), IP-адрес и открытый сертификат этого сервера будут добавлены в файл ~/.ssh/known_hosts на локальной машине:
9. Если ранее при генерации пары ключей был задан пароль, утилита SSH попросит ввести его:
10. После ввода пароля и нажатия Enter устанавливается зашифрованное соединение с сервером:
Еще один вариант, как можно использовать этот тип соединения, — создание канала связи по протоколу RDP. Этот вариант подходит, когда пользователь не может подключиться к узлу из-за отсутствия доступа к нему из сети. Зато у него есть доступ к маршрутизатору. Этого достаточно, чтобы использовать данный тип туннелирования.
Параметры канала связи устанавливает инициатор подключения. На втором конце канала связи всегда расположен целевой сервер. Так, клиентом может оказаться VPS-сервер, а точкой выхода — компьютер сисадмина. Точка входа может быть создана с любой стороны туннеля: именно через нее принимаются подключения. Обратная сторона туннеля — точка выхода — способна лишь на маршрутизацию пакетов информации с учетом установленных правил. Отдельная опция — соединение с удаленной машиной, на которой запущен модуль Docker (SSH Docker). Подробнее об этом мы расскажем в следующих публикациях.
Аналогичным образом проходит процесс установки соединения с определенным сервером. В качестве примера возьмем целевой сервер с адресом 192.168.0.105. При этом для пользователя доступен только маршрутизатор (192.168.0.1). В качестве точки входа прописывается 127.0.0.1:3389. Кроме того, задается правило трансляции, определяющее узел, принимающий данные на выходе из SSH-туннеля. В нашем случае в качестве правила указывается 192.168.0.105:3389. Проследите, чтобы указанный адрес действительно существовал, иначе вам не удастся подключиться к целевому серверу.
После того, как вы зададите исходные данные, появится TCP-сокет, который создает служба SSH. Этот локальный сокет следит за тем, когда начнутся подключения на порт 3389. Точкой назначения прописывается localhost (127.0.0.1). Отметим, что RDP-клиент не владеет информацией о настоящем назначении получателя пакета. Клиент только открывает динамический порт, чтобы отправить пакет данных, у которого задан адрес назначения (точка входа) и источника (127.0.0.1:61256).
Пакет с информацией следует от входной точки SSH tunnel на его противоположный конец. Адрес трансляции поменяется. Теперь там значится 192.168.0.105:3389. На следующем этапе SSH-сервер просто поставит свой адрес вместо адреса источника. Вся информация, которая передается внутри канала, будет отправлена поверх протокола. А RDP-клиент оперирует исключительно локальным сокетом. Важно, что вся информация внутри туннеля защищена — она шифруется. Но соединение между SSH- и RDP-серверами остается обычным. Разумеется, этот фактор стоит учитывать, если пользователь работает с небезопасными протоколами.
SSH Proxy: как организовать доступ к любой системе (обращение к проксируемому серверу)
С помощью SSH-туннеля можно воспользоваться домашней (или корпоративной) сетью, даже используя ненадежный бесплатный Wi-Fi. Для этого пользователю потребуется запустить SSH-прокси, а затем по аналогичному принципу создать туннель в целевую сеть (например, можно подключиться к домашней сети).
Важно, чтобы приложения, которые потребуются инициатору подключения для работы, поддерживали SOCKS-прокси. С помощью туннеля сетевые службы станут доступны для удаленной работы. Другой вариант: пользователь сможет выйти в интернет, используя домашнее подключение, но сидя при этом в другом конце мира и используя публичную сеть. Вся передаваемая через туннель информация будет зашифрована.
Это не единственный способ практического применения SSH-туннелирования. Один из самых популярных кейсов — SSH Proxy — открывает доступ к желаемой системе, если она доступна для удаленного сервера. При этом для туннелирования через прокси-сервер потребуется ввести всего одну команду:
localhost:~$ ssh -D 8888 user@remoteserver
localhost:~$ netstat -pan | grep 8888
tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 23880/ssh
Команда выше показывает, что пользователь запускает SOCKS-прокси. Портом для работы назначается 8888. Кроме того, необходимо проверить, активен ли этот TCP-порт (используется режим прослушивания). Служба работает исключительно на localhost (127.0.0.1). Если немного видоизменить команду, то можно прослушивать все интерфейсы (в том числе ethernet или Wi-Fi). Это позволяет приложениям подключаться к прокси-серверу через SSH-прокси:
localhost:~$ ssh -D 0.0.0.0:8888 user@remoteserver
Чтобы браузер работал корректно, необходимы настройки. Например, чтобы запустить Chrome с активированным SOCKS-прокси, потребуется команда:
localhost:~$ google-chrome --proxy-server="socks5://192.168.1.10:8888"
Она создает SOCKS-прокси, а также инициирует туннелирование DNS-запросов. Утилита tcpdump проверяет, видны DNS-запросы или нет.
Кроме браузеров, многие современные приложения работают с SOCKS-прокси: достаточно изменить их параметры, чтобы активировать прокси-сервер. Отдельно применяются инструменты, которые помогают приложениям использовать эту важную функцию — к примеру, proxychains позволяет запустить через SOCKS-прокси Microsoft RDP.
Зачем нужны динамические SSH tunnels
Динамический SSH tunnel отличается от рассмотренных выше типов соединений. Он открывает локальный TCP-сокет для его использования в качестве SOCKS4/SOCKS5 прокси. Обычно его применяют, когда требуется VPN, а его развертывание невозможно. Такой тип SSH-туннеля также отвечает необходимым требованиям безопасности.
Кроме того, создание динамического туннеля удобно, когда пользователю необходимо выйти в интернет однократно:
ssh -D 1080 user@vps.example.com
SOCKS-прокси работает через порт 1080.
Помимо этого, динамический туннель не предусматривает открытие дополнительных портов во внешнюю сеть. Весь трафик будет проходить исключительно через SSH-соединение, скрывая тем самым характер интернет-деятельности пользователя.
Команды и практическое применения функций SSH-туннелей
Рассмотрим несколько практических примеров применения SSH-туннелирования.
Проброс (перенаправление) портов — Port Forwarding
Чтобы осуществить проброс портов, потребуется создание SSH tunnel. Для этого в локальной системе открывается порт, а для создания канала связи пользователь должен выбрать порт на другом конце туннеля:
localhost:~$ ssh -L 9999:127.0.0.1:80 user@remoteserver
Команда устанавливает прослушку на порт 9999. Порт 80 используется для проброса. Для Port Forwarding также используются прокси-серверы или TCP-службы.
Автоматизация копирования публичного (открытого) ключа
Традиционно пользователю приходится копировать открытые ключи вручную. SSH-протокол существенно ускоряет этот процесс:
localhost:~$ ssh-copy-id user@remoteserver
Эта команда выполняет копирование публичного ключа по умолчанию или из директории ~/.ssh/id_rsa.pub в ~/.ssh/authorized_keys (она находится на удаленном сервере).
Обратный SSH-туннель (SSH reverse tunnel)
Очевидно, что SSH tunnel можно создать и в обратном направлении. Достаточно подключить прослушивающий порт к другому локальному порту:
localhost:~$ ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserver
Данный туннель работает следующий образом: от порта 1999 к remoteserver, а уже после этого обращается к порту 902 на локальном клиенте.
Удаленное выполнение команд с помощью SSH
SSH-команда позволяет создать интерфейс для работы с командами на удаленном хосте. Они прописываются в качестве последнего параметра:
localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.php
После скачивания лога grep можно запустить на удаленной стороне.
Копирование, функция rsync-копирования (rsync через SSH)
Чтобы создать дубликат папки на удаленном сервере, достаточно сначала сжать папку с помощью bzip2, а после извлечь поток bzip2 на другой стороне. Команда для этой операции следующая:
localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"
Для регулярных бэкапов важной информации используется rsync:
localhost:~$ rsync -az /home/testuser/data proglibserver:backup/
Функция rsync позволяет копировать отличия, сравнивая информацию в разных временных точках. Таким образом, можно восстановить важные данные в случае неудачного сеанса передачи.
GUI-приложения: удаленный запуск через SSH
SSH-туннель поддерживает функцию, позволяющую запускать GUI-приложения удаленно:
localhost:~$ ssh -X remoteserver vmware
Отметим: несмотря на то, что GUI выполняется на удаленном сервере, окно отображается на локальном рабочем столе. В примере для работы запущена консоль виртуальной машины VMware Workstation. Но для успешной реализации команды требуются пакеты X11 и YES для X11Forwarding в файле sshd_config.
Редактирование текстовых файлов
Метод редактирования файлов одной командой предусматривает создание файла в /tmp, а затем копирование в заданную директорию:
localhost:~$ vim scp://user@remoteserver//etc/hosts
Прыжки по хостам
Туннелирование предусматривает переход через несколько хостов, если пользователь сталкивается с сегментацией сети:
localhost:~$ ssh -J host1,host2,host3 user@host4.internal
Параметр -J использует переадресацию для установления сеанса с каждым следующим хостом в цепочке. При этом рабочий сеанс полностью зашифрован — от localhost и до host4.
Фильтрация трафика с помощью iptables
Утилита iptables позволяет устанавливать правила для блокировки или разрешения прохождения трафика: INPUT, FORWARD и OUTPUT. В случае если пользователь не задал никаких правил, этот межсетевой экран будет выполнять заданную по умолчанию фильтрацию. Для установления связи с целевым сервером утилита сравнит IP-адрес инициатора подключения с тем списком, что есть в правилах INPUT, а затем либо даст доступ к серверу, либо запретит его.
Однако работа с iptables требует определенной осторожности. Причина проста: если неверно задать правило фильтрации, удаленный доступ может оказаться просто невозможным до тех пор, пока пользователь не снимет ограничения, получив физический доступ к компьютеру.
Реализация SSH tunnels в Windows
Возможности туннелирования доступны и для тех, кто использует Windows 10: под эту ОС существует ряд SSH-клиентов. Один из самых применяемых — PuTTY. Запуск сервера под Windows — более сложная задача, которая требует от пользователя специализированной квалификации.
PuTTY настраивается достаточно просто: для этого во вкладке Connection открываем SSH Tunnels, где необходимо прописать базовые настройки соединения — Source port (точка входа), Destination (назначение); радиопереключатели Local — Remote — Dynamic определяют тип будущего канала связи. Адрес целевого узла указывается в другом разделе — Session.
Открытия дополнительных портов или развертывания VPN не требуется.
Безопасны ли SSH-туннели
Как мы уже отмечали, одна из их задач — создание безопасного соединения с удаленной машиной. Однако не стоит забывать о «побочных эффектах» таких туннелей. Кроме соединения с удаленным сервером, пользователь получает консоль, которая открывается на сервере.
Если пользователь забудет о своем подключении, то может выполнить те команды, которые изначально были предназначены к выполнению на локальном узле. Чтобы избежать подобной ошибки (особенно если пользователь имеет права суперпользователя), при запуске канала связи следует указывать параметр -N:
ssh -N -L -g 3389:192.168.0.105:3389 user@rt.example.com
Кроме того, не стоит использовать при подключении к удаленной машине аккаунт суперпользователя, для этих целей подойдет учетная запись с обычными правами. И не забывайте про то, что по завершении работы требуется удалить SSH-туннель.
SSH port forwarding is an essential aspect of securely accessing remote servers.
Before going into the details of how to use port forwarding, let’s break down the term SSH Port Forwarding to understand it better.
SSH stands for Secure Shell. It’s a protocol that allows you to securely connect to another computer over a network, typically the Internet. Port forwarding is a technique to redirect network traffic from one port to another. Ports are like numbered doors on a computer, and each service (for instance, web server and email server) often uses a specific port.
Hence, SSH port forwarding (also known as SSH tunneling) securely encrypts the communication between computers, making it more difficult for others to intercept sensitive information.
In this comprehensive introduction, we will explore SSH (or PuTTY) port forwarding to improve network access and security.
How to Use Port Forwarding in SSH (and PuTTY)
You can use SSH tunneling (port forwarding) in three configurations: local, remote, and dynamic. However, before exploring these , let’s look at the prerequisites for these modes.
Prerequisites
Before we dive into different types and usage of SSH port forwarding, you need the following things in place:
- An SSH Client: You should install an SSH client on your computer. Most Unix-like operating systems have a basic SSH client installed by default. For Windows users, tools like PuTTY provide SSH client functionality.
- Access to a Remote Server: You need access to a remote server you want to connect to using SSH Port Forwarding. Ensure you have the SSH credentials for this server, including the password or SSH key and the username.
How to Use Local Port Forwarding
SSH local port forwarding (tunneling) securely transports the data over the Internet by encrypting it within an SSH session. This tunnel safeguards network traffic on insecure networks.
Here’s how it works:
- Select The Local Port: Start by choosing a localhost port on your machine. Make sure that this port is not used by any service on your machine.
- Use the SSH Client: The SSH client receives data from the user, encrypts it, and sends it to the security checkpoint (the SSH server).
- SSH Server Receives the Data: The SSH server receives the encrypted data, decrypts it, and then forwards it to the destination service, typically on the same machine as the SSH server or within its local/internal network.
- The Destination Service: This could be a web server, database, or any other secure service you want to access on the destination.
- The Response Path: The response from the destination service is sent back to the SSH server, which encrypts it and sends it back to the SSH client on the source. The client then decrypts the response and sends it to the local application via (local) port.
This process effectively creates a secure “tunnel” through which data can move back and forth. The best part is that this tunnel works even if the intermediate route between the source and destination is not trustworthy.
This secure route makes SSH tunneling the preferred way of accessing remote network services or bypassing network restrictions securely.
Accessing remote servers that aren’t visible on the network is a critical use case of SSH port forwarding. In this scenario, the source system sends data through a secure tunnel to the SSH server, which then redirects it to the destination web server. The underlying tunneling mechanism is invisible during this process, and you can directly see the target machine and services.
Local Port Forwarding with OpenSSH
This is the most common form of port forwarding in Linux environments.
When using local port forwarding with OpenSSH on a Linux system, you must provide the following information to set up SSH port forwarding efficiently.
- Source (the starting point of the tunnel)
- Destination port number(s)
- Location of the destination server (This can be an IP address or a hostname).
Here’s the basic syntax for creating a local port forward using the -L flag with the ssh command:
# ssh -L local_port:destination_server_ip:remote_port ssh_server_hostname
Let’s break down this syntax into its components:
- ssh: This is the native Linux SSH utility that the system uses for opening a secure connection to the distant SSH server.
- -L local_port:destination_server_ip:remote_port: The -L flag takes the local port information and the destination server information. The local SSH client directs data forwarding from a local port on your machine to a designated port on the remote server.
- ssh_server_hostname: The hostname or IP address of the remote SSH server that you want to connect to the specified port.
Let’s run the following SSH port forwarding scenario that uses the following command:
# ssh -L 5901:184.107.122.14:4492 [email protected]
In this example, all data sent to port 5901 on your source machine will be seamlessly forwarded to port 4492 on the remote server, situated at the IP address 184.107.122.14.
Local Port Forwarding with PuTTY
You can use PuTTY to leverage local port forwarding in Windows. It is a user-friendly SSH client designed for Windows and offers a simple way of securely connecting to a remote server and accessing services through an encrypted tunnel.
Using PuTTY, you can configure the local machine to forward specific ports to the remote server. This ensures that sensitive data is encrypted during transmission, enhancing security, especially when dealing with untrusted networks like the Internet.
Follow these steps to use PuTTY to establish local port forwarding in the Windows environment:
1. Launch PuTTY and access the Sessions screen to input the destination SSH server’s hostname, IP address, and port number. For this demonstration, we’ll enter [email protected] and port number 22.
2. Add the hostname of the SSH server you wish to access remotely.
3. Use the Category list on the left to go to Connection > SSH > Tunnels.
4. Select Local to choose the type of the SSH port forward.
Follow these steps to set up SSH forwarding/tunneling in PuTTY:
- Enter the local port number in the Source port field.
- In the target box, provide the target address and port number in the following format: destination_server_ip:remote_port. For this demonstration, we’ll use: source port: 5901, Destination: 184.107.122.14:4492.
- Confirm the details are accurate and click Add.
5. At this point, the connection’s parameters have now been set up. Now click Open to start the local SSH port forward.
How to Use Remote Port Forwarding
SSH remote port forwarding, or reverse SSH tunneling, is a process that allows a user to expose a local service to a remote server.
The term reverse indicates that the traditional data direction (source to destination) is flipped. So, instead of initiating a connection from your local machine to a remote server, as is typical in SSH communication, you’re allowing the remote systems to initiate a connection back to your local machine.
This process is essential when you wish to allow remote access to your local services. This tunnel can work across firewalls and network restrictions.
Let’s see how to use remote port forwarding with OpenSSH and PuTTY.
Remote Port Forwarding with OpenSSH
Facilitating remote port forwarding with OpenSSH involves using the following command syntax. Note that the -R flag with the SSH command indicates the reverse connection:
# ssh -R remote_port:localhost:local_port ssh_server_hostname
For instance, in the following command, we have instructed the hosted.redswitches.com remote server to send all incoming connections on port 8080 to a local resource on our machine listening at port 5534:
# ssh -R 8080:localhost:5534 [email protected]
In this setup, users who have access to the hosted.redswitches.com SSH server can effortlessly use resources on this server.
Remote Port Forwarding with PuTTY
Implementing remote port forwarding with PuTTY involves the following steps:
1. Launch PuTTY and enter the SSH server’s IP address and port in the Sessions screen.
2. Add the hostname of the SSH server for the remote SSH tunneling session.
3. Navigate to Connection > SSH > Tunnels using the Category list on the left.
4. Choose Remote to specify the type of SSH port forward.
Follow these steps to establish a remote SSH tunneling connection:
- Choose Remote for SSH port forwarding.
- Enter a remote port (e.g., 8080) in the Source port field.
- Specify the target address and port (e.g., localhost:5534) in the Destination box.
- Verify the details and click Add.
5. Click Open to start the remote SSH port forward.
Now, remote users can connect to our SSH server at port 8080, which will redirect them to the local system at port 5534.
How To Use Dynamic Port Forwarding
SSH dynamic port forwarding is an advanced form of port forwarding using the Secure Shell (SSH) protocol, enabling more flexible and automatic forwarding of network traffic.
It is sometimes called SOCKS proxying because it uses the SOCKS protocol. Here’s how it works:
- Select the Dynamic Port: Choose a local port on your machine. This port will act as a listening point for the SOCKS proxy requests.
- SSH Client Configuration: Configure your SSH client to create a dynamic port forwarding tunnel. This instructs the local SSH client to listen to the chosen local port and forward traffic through the SSH tunnel.
- SOCKS Proxy: The local SSH client becomes a SOCKS proxy server. Now, you can set up local applications to use this proxy. The network requests of these apps go through the SOCKS proxy on the specified local port.
- Traffic Routing: The SSH client takes the applications’ requests and sends them through the SSH tunnel to the SSH server. The server decides where to send these requests based on their destination addresses.
- Response: Responses travel back to the SSH server, through the tunnel to your SSH client, and then to the original application making the request.
The primary benefit of SSH dynamic port forwarding is its flexibility, which results in the following:
- Automatic Routing: No need to set up individual port forwards; applications can dynamically determine destinations.
- Privacy and Security: It acts as a secure, encrypted proxy for Internet browsing, ideal for monitored or restricted access situations.
- Easy Configuration: Once set up, any SOCKS proxy-supporting application can use the SSH tunnel without specific configurations for each service.
Dynamic Port Forwarding with OpenSSH
To use dynamic port forwarding with OpenSSH, you must first create a local SOCKS proxy on your computer by running the ssh command with the –D flag:
# ssh –D local_port ssh_server_hostname
For example, the following command sets up a local SOCKS proxy at port 5534 on your computer:
# ssh –D 5534 [email protected]
This enables you to configure a local resource, such as a browser, to utilize port 5534. The SSH connections made for the designated port are then used to redirect all traffic from that resource.
Dynamic Port Forwarding with PuTTY
To enable dynamic port forwarding with PuTTY, follow these steps:
- Enter the target SSH server’s port number and hostname or IP address in the main PuTTY Sessions screen.
- Add the hostname of the SSH server specifically for dynamic port forwarding.
- Utilize the Category list to navigate to Connection > SSH > Tunnels.
- Choose Dynamic to specify the type of SSH port forward.
- Locate the options for establishing dynamic port forwarding.
- Enter the dynamic port number in the Source port field (e.g., 5534). The SOCKS proxy server will use this port on your local machine to forward traffic dynamically.
- Verify the information and click Add.
- The parameters for the connection are now configured. Select the Open option to initiate dynamic SSH port forwarding.
- For dynamic forwarding to function, you must configure and enable each application to utilize the SOCKS proxy server.
Conclusion
SSH Port Forwarding is a robust feature that enhances your network security and enables access to remote services. Whether you’re using OpenSSH on Linux systems or PuTTY on Windows, the ability to forward ports securely is a handy skill for system administrators and developers.
RedSwitches offers the best dedicated server pricing and delivers instant dedicated servers, usually on the same day the order gets approved. Whether you need a dedicated server, a traffic-friendly 10Gbps dedicated server, or a powerful bare metal server, we are your trusted hosting partner.
FAQs
Q. What is SSH Port Forwarding, and how does it work?
SSH port forwarding, also known as SSH Tunneling, allows you to securely forward network ports from your local machine to a remote machine over an SSH connection. This process creates a tunnel for data transmission, encrypting the data and bypassing unencrypted protocols, ensuring secure communication even over the public Internet.
Q. Is SSH port forwarding secure?
SSH port forwarding is secure as it encrypts the data transmitted between your local machine and the remote server, preventing unauthorized access and ensuring privacy over a public IP address.
Q. Can I use SSH port forwarding for file transfers?
Absolutely. SSH port forwarding can be used for secure file transfers using tools like SCP or SFTP, which utilize the secure channel established over an SSH connection to transmit files.
Q. Are there any alternatives to SSH port forwarding?
While VPNs and dedicated proxy servers are alternatives, SSH port forwarding is a lightweight and secure option for many use cases, especially when working within a private network or executing remote commands on a server machine.
Q. Can I use SSH port forwarding for remote desktop access?
SSH port forwarding can securely access remote desktops, such as with the VNC protocol, by forwarding the ports to the remote host.
Q. What are the types of SSH port forwarding?
There are mainly two types: local port forwarding and remote forwarding. Local forwarding allows you to forward a port from the client machine to the server machine. In contrast, remote forwarding enables forwarding from the server to the client, which is valid in scenarios like exposing local network services to a public network.
Q. How do I maintain a session active for SSH port forwarding?
To keep a terminal session active, use tools like Screen or tmux, which allow the SSH connection and port forwarding to persist even if the client host is disconnected.
Q. How can I forward a range of ports using SSH?
Forwarding a range of ports can be done by specifying the range in the SSH command for local and remote forwarding. This is particularly useful when multiple network services or sessions must be accessed or maintained concurrently.
Q. Can SSH port forwarding be configured for a remote machine with a dynamic IP?
Yes, SSH port forwarding can work with dynamic IP addresses. However, network configuration might require more attention, as the public IP address of the remote host can change. Using a dynamic DNS service can simplify this process.
Q. How do I set up SSH port forwarding with a single command?
You can set up SSH port forwarding using a single command line in your terminal. The specific command depends on whether you’re setting up local or remote forwarding and the particular ports and addresses involved.