Переадресация портов SSH: объяснение локальных, удаленных и динамических туннелей.

Раскройте мощь переадресации портов SSH с помощью этого подробного руководства. Научитесь создавать защищенные туннели, используя локальную, удаленную и динамическую переадресацию. Изучите практические сценарии использования, от доступа к ограниченным базам данных до безопасного просмотра в общедоступных сетях Wi-Fi, и освойте основные команды для повышения безопасности вашей сети и возможностей доступа.

37 просмотров

Разбираемся с перенаправлением портов SSH: локальные, удаленные и динамические туннели

Secure Shell (SSH) — это основа безопасного удаленного доступа, обеспечивающая зашифрованные каналы связи для управления серверами и передачи файлов. Помимо основных функций, SSH предлагает мощную, но часто недоиспользуемую возможность: перенаправление портов. Эта техника позволяет создавать безопасные туннели, распространяя шифрование SSH на другой сетевой трафик, получая доступ к службам, которые не доступны напрямую из интернета, или безопасно соединяя сетевые сегменты.

В этой статье мы углубимся в тонкости перенаправления портов SSH, разбив его на три основные формы: локальное, удаленное и динамическое. Мы рассмотрим, как работает каждый тип, его конкретные случаи использования и предоставим практические примеры, которые помогут вам использовать эту расширенную возможность SSH для повышения безопасности и гибкости сети.

Понимание основ: что такое перенаправление портов?

По сути, перенаправление портов SSH, также известное как туннелирование SSH, перенаправляет сетевой трафик с одного сетевого интерфейса и порта на другой. Вместо установления прямого соединения со службой на удаленной машине вы устанавливаете SSH-соединение, а затем указываете SSH перенаправить трафик, отправленный на локальный порт, на определенный целевой порт на удаленной машине (или наоборот), и все это в зашифрованном SSH-канале.

Это дает несколько преимуществ:

  • Безопасность: Шифрует трафик, который в противном случае был бы незашифрованным между вашим клиентом и целевой службой.
  • Контроль доступа: Обеспечивает доступ к службам, работающим в частных сетях или за брандмауэрами, которые недоступны напрямую из вашего текущего местоположения.
  • Соединение сетей: Безопасно соединяет различные сетевые сегменты.

1. Локальное перенаправление портов (-L)

Локальное перенаправление портов — наиболее распространенный тип. Оно позволяет перенаправлять соединения с порта на вашей локальной машине на порт на удаленной машине через SSH-сервер. По сути, вы делаете так, чтобы служба, работающая в удаленной сети, выглядела так, как будто она работает на вашей локальной машине.

Как это работает:

  1. Вы запускаете SSH-клиент на своей локальной машине.
  2. Вы указываете локальный порт (local_port), на котором SSH будет прослушивать.
  3. Любое соединение, установленное с local_port на вашей локальной машине, перенаправляется через SSH-соединение на remote_host и remote_port.

Синтаксис:

ssh -L [local_bind_address:]local_port:remote_host:remote_port [user@]ssh_server_host
  • local_bind_address: (Необязательно) Адрес на вашей локальной машине, к которому будет привязан прослушиваемый порт. По умолчанию localhost.
  • local_port: Порт на вашей локальной машине, который будет прослушивать SSH.
  • remote_host: Имя хоста или IP-адрес целевой машины, к которой будет подключаться SSH-сервер.
  • remote_port: Порт на remote_host, на который будет направлен трафик.
  • user@ssh_server_host: Ваше имя пользователя и имя хоста/IP-адрес SSH-сервера, к которому вы подключаетесь.

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

Представьте сервер баз данных (например, PostgreSQL на 192.168.1.100:5432), доступный только из внутренней сети вашей компании. Вы можете использовать локальное перенаправление портов, чтобы получить к нему доступ с вашего ноутбука дома:

ssh -L 5433:192.168.1.100:5432 your_user@your_ssh_server.com
  • Эта команда подключает вас к your_ssh_server.com.
  • Она открывает порт 5433 на вашей локальной машине (по умолчанию localhost).
  • Любое соединение с localhost:5433 будет перенаправлено через your_ssh_server.com на 192.168.1.100:5432.

Теперь вы можете настроить свой локальный клиент базы данных для подключения к localhost:5433, и трафик будет безопасно туннелирован к удаленному серверу базы данных.

Совет: Используйте ssh -N для создания туннеля без выполнения удаленной команды. Это полезно для фоновых туннелей.

ssh -N -L 5433:192.168.1.100:5432 your_user@your_ssh_server.com

2. Удаленное перенаправление портов (-R)

Удаленное перенаправление портов позволяет перенаправлять соединения с порта на удаленном SSH-сервере на порт на вашей локальной машине или другой машине, доступной с вашей локальной машины. Это полезно для того, чтобы сделать службу, работающую на вашей локальной машине, доступной для удаленного сервера или его сети.

Как это работает:

  1. Вы запускаете SSH-клиент на своей локальной машине.
  2. Вы указываете удаленный порт (remote_port) на SSH-сервере, который будет прослушивать SSH.
  3. Любое соединение, установленное с remote_port на SSH-сервере, перенаправляется через SSH-соединение обратно на вашу локальную машину, а затем на указанный destination_host и destination_port.

Синтаксис:

ssh -R [remote_bind_address:]remote_port:destination_host:destination_port [user@]ssh_server_host
  • remote_bind_address: (Необязательно) Адрес на SSH-сервере, к которому будет привязан прослушиваемый порт. По умолчанию localhost (что означает, что только сам SSH-сервер может подключаться к этому порту). Используйте 0.0.0.0 или *, чтобы разрешить другим машинам в удаленной сети подключаться.
  • remote_port: Порт на SSH-сервере, который будет прослушивать SSH.
  • destination_host: Имя хоста или IP-адрес целевой машины, к которой будет подключаться ваш SSH-клиент (часто localhost, если служба находится на вашей локальной машине).
  • destination_port: Порт на destination_host, на который будет направлен трафик.
  • user@ssh_server_host: Ваше имя пользователя и имя хоста/IP-адрес SSH-сервера, к которому вы подключаетесь.

Практический сценарий использования: Предоставление доступа к локальному веб-серверу из удаленной сети.

Предположим, вы разрабатываете веб-причение на своем ноутбуке и хотите продемонстрировать его коллеге, у которого есть доступ только к внутренней сети вашей компании, а у вас есть SSH-сервер (your_ssh_server.com), доступный из этой сети.

На своем ноутбуке вы запустите:

ssh -R 8080:localhost:3000 your_user@your_ssh_server.com
  • Эта команда подключает вас к your_ssh_server.com.
  • Она указывает your_ssh_server.com прослушивать порт 8080.
  • Любое соединение с your_ssh_server.com:8080 будет перенаправлено обратно через SSH-туннель на ваш ноутбук (localhost) на порт 3000 (где работает ваш веб-сервер).

Теперь ваш коллега сможет получить доступ к вашему веб-причению, перейдя по адресу http://your_ssh_server.com:8080 в своем браузере. Трафик идет от их браузера к SSH-серверу, через туннель к вашему ноутбуку, а затем к вашему веб-серверу.

Предупреждение: По умолчанию remote_port привязывается к localhost на SSH-сервере. Чтобы разрешить другим машинам в удаленной сети доступ к перенаправленному порту, вы должны явно установить remote_bind_address на 0.0.0.0 или * и убедиться, что конфигурация SSH-сервера (GatewayPorts yes в sshd_config) допускает это.

ssh -R 0.0.0.0:8080:localhost:3000 your_user@your_ssh_server.com

3. Динамическое перенаправление портов (-D)

Динамическое перенаправление портов создает SOCKS-прокси на вашей локальной машине. Это, пожалуй, самый гибкий тип, поскольку он позволяет туннелировать любое приложение, поддерживающее SOCKS-прокси, через ваше SSH-соединение. Вместо перенаправления определенного порта SSH прослушивает локальный порт и действует как SOCKS-прокси-сервер.

Как это работает:

  1. Вы запускаете SSH-клиент на своей локальной машине.
  2. Вы указываете локальный порт (local_port), который SSH будет прослушивать как SOCKS-прокси.
  3. Вы настраиваете свои приложения (веб-браузер и т. д.) для использования localhost:local_port в качестве своего SOCKS-прокси.
  4. Когда приложение отправляет запрос через этот прокси, SSH перенаправляет трафик на SSH-сервер, который затем устанавливает соединение с конечным назначением от имени вашего приложения.

Синтаксис:

ssh -D [local_bind_address:]local_port [user@]ssh_server_host
  • local_bind_address: (Необязательно) Адрес на вашей локальной машине, к которому будет привязан прослушиваемый порт SOCKS-прокси. По умолчанию localhost.
  • local_port: Порт на вашей локальной машине, который SSH будет прослушивать как SOCKS-прокси.
  • user@ssh_server_host: Ваше имя пользователя и имя хоста/IP-адрес SSH-сервера, к которому вы подключаетесь.

Практический сценарий использования: Безопасный просмотр веб-страниц через общедоступный Wi-Fi.

При подключении к недоверенной сети Wi-Fi ваш трафик уязвим. Вы можете использовать динамическое перенаправление портов для туннелирования всего вашего трафика веб-просмотра через зашифрованное SSH-соединение с доверенным сервером.

На своем ноутбуке выполните:

ssh -D 1080 your_user@your_trusted_server.com
  • Эта команда подключает вас к your_trusted_server.com.
  • Она открывает порт 1080 на вашей локальной машине, выступая в роли SOCKS-прокси.

Затем настройте свой веб-браузер (или другие приложения) для использования SOCKS-прокси на localhost по порту 1080.

Теперь все запросы вашего браузера в интернет будут отправляться на ваш SSH-сервер, который затем будет извлекать данные и отправлять их вам обратно, и все это в зашифрованном SSH-туннеле. Это фактически создает видимость, будто ваш веб-трафик исходит от your_trusted_server.com.

Совет: Вы можете комбинировать -D с -C для сжатия, что может быть полезно на медленных сетевых соединениях.

ssh -C -D 1080 your_user@your_trusted_server.com

Дополнительные соображения и лучшие практики

  • Конфигурация SSH-сервера (sshd_config): Некоторые функции перенаправления портов, особенно удаленное перенаправление, позволяющее внешние соединения (GatewayPorts), требуют специальных настроек на SSH-сервере. Убедитесь, что GatewayPorts yes раскомментировано и установлено в /etc/ssh/sshd_config, если вам требуется, чтобы удаленное перенаправление было доступно с других машин в сети SSH-сервера.
  • Брандмауэры: Помните, что брандмауэры на стороне клиента, сервера или промежуточных сетей могут блокировать SSH-соединения или порты, используемые для перенаправления. Убедитесь, что необходимые порты (обычно 22 для самого SSH) открыты.
  • Безопасность: Хотя перенаправление портов шифрует трафик, безопасность туннеля зависит от безопасности вашего SSH-сервера. Используйте надежные SSH-ключи, отключите аутентификацию по паролю и регулярно обновляйте ваш SSH-сервер.
  • Постоянство: Для длительных туннелей рассмотрите возможность использования таких инструментов, как autossh, который может отслеживать и автоматически перезапускать SSH-туннели в случае их обрыва.

Заключение

Перенаправление портов SSH — это универсальный инструмент, который значительно расширяет возможности протокола Secure Shell. Освоив локальное, удаленное и динамическое перенаправление, вы можете повысить безопасность, получить доступ к ограниченным ресурсам и создавать безопасные мосты между сетями. Независимо от того, нужно ли вам защитить незашифрованный трафик, получить доступ к внутренним службам или просто безопасно просматривать веб-страницы через общедоступный Wi-Fi, перенаправление портов SSH предлагает элегантное и мощное решение.

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