SSH-туннелирование и перенаправление портов

КибербезопасностьBeginner
Практиковаться сейчас

Введение

Secure Shell (SSH) — это не просто инструмент для удаленного доступа к терминалу; это еще и мощная сетевая утилита. SSH-туннелирование, также известное как перенаправление портов SSH (SSH Port Forwarding), позволяет направлять локальный сетевой трафик через безопасное SSH-соединение к удаленным хостам.

Основная идея заключается в «заимствовании» сетевых возможностей другого компьютера. Туннель не создает новую сетевую доступность из ниоткуда; он использует возможности и права доступа удаленного хоста.

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

В этой лабораторной работе вы изучите концепции и практическое применение двух основных типов перенаправления портов SSH:

  • Локальное перенаправление портов (-L): перенаправляет порт с вашего локального компьютера на удаленный пункт назначения.
  • Удаленное перенаправление портов (-R): перенаправляет порт с удаленного сервера обратно на ваш локальный компьютер.

Изучение топологии сети

На этом этапе мы изучим симулированную сетевую среду, подготовленную для вас.

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

Вот концептуальная схема нашей симуляции. Ваш локальный компьютер представлен текущим сеансом терминала. Бастион-хост (или пограничный сервер) симулируется с помощью Docker-контейнера, который открывает SSH на 127.0.0.1:2222. Внутренняя служба — это веб-сервер, работающий в той же частной сети Docker по адресу 172.31.0.20:80. Концептуально представьте, что эта служба находится глубоко внутри корпоративной сети и заблокирована брандмауэром, что означает, что доступ к ней возможен только с бастион-хоста. Наконец, локальная служба — это веб-сервер, работающий на порту 8000 на виртуальной машине LabEx. Вы можете рассматривать это как сервер разработки, запущенный на вашем личном ноутбуке, которым вы хотите поделиться с кем-то в интернете.

Давайте проверим, работают ли наши симулированные службы. Мы будем использовать команду curl — инструмент командной строки для передачи данных с использованием URL-адресов.

Сначала проверьте «Локальную службу», работающую на порту 8000:

curl http://127.0.0.1:8000

Вы должны увидеть вывод Local Developer Machine Data.

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

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

Настройка локального перенаправления портов (-L)

На этом этапе вы настроите локальное перенаправление портов.

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

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

Синтаксис локального перенаправления портов: ssh -L [local_port]:[destination_host]:[destination_port] [user]@[ssh_server]

Локальное перенаправление проще всего понять как «сделать удаленную службу локальной для меня».

Мы перенаправим наш локальный порт 8080 на внутреннюю службу (172.31.0.20:80) через наш симулированный SSH-бастион. Мы также будем использовать два дополнительных флага. Флаг -N указывает SSH не выполнять удаленную команду, что полезно, когда вы хотите только перенаправлять порты. Флаг -f указывает SSH работать в фоновом режиме, позволяя нам продолжать использовать наш терминал.

Выполните следующую команду, чтобы создать туннель:

ssh -N -f -L 8080:172.31.0.20:80 \
  -o StrictHostKeyChecking=no \
  -o UserKnownHostsFile=/dev/null \
  -i ~/project/pivot_key -p 2222 pivot@127.0.0.1

Туннель теперь работает в фоновом режиме.

Теперь давайте протестируем туннель. Вместо прямого обращения к внутреннему адресу Docker вы будете обращаться к своему недавно открытому локальному порту 8080. SSH-туннель перехватит этот запрос, зашифрует его, отправит на бастион-хост, который затем перенаправит его на 172.31.0.20:80.

curl http://127.0.0.1:8080

Вы должны увидеть вывод Secret Internal Corporate Data. Вы успешно обошли концептуальный брандмауэр!

Настройка удаленного перенаправления портов (-R)

На этом этапе вы настроите удаленное перенаправление портов.

Представьте, что вы разрабатываете веб-приложение на своем локальном ноутбуке (наша служба на порту 8000). Вы хотите показать свои успехи клиенту, но ваш ноутбук находится за домашним маршрутизатором (NAT) и не имеет публичного IP-адреса.

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

Синтаксис удаленного перенаправления портов: ssh -R [remote_port]:[local_host]:[local_port] [user]@[ssh_server]

Удаленное перенаправление меняет перспективу: «сделать мою локальную службу доступной с удаленной стороны».

Мы выставим нашу локальную службу (127.0.0.1:8000) на бастион-хост через порт 8081.

Выполните следующую команду, чтобы создать удаленный туннель:

ssh -N -f -R 8081:127.0.0.1:8000 \
  -o StrictHostKeyChecking=no \
  -o UserKnownHostsFile=/dev/null \
  -i ~/project/pivot_key -p 2222 pivot@127.0.0.1

Туннель установлен в фоновом режиме. Бастион-хост теперь прослушивает порт 8081. Когда кто-то обращается к порту 8081 на удаленном сервере, трафик отправляется обратно на ваш локальный порт 8000.

Давайте протестируем это, сделав запрос к перенаправленной службе через контейнер бастион-хоста:

docker exec bastion_host curl -s http://127.0.0.1:8081

Вы должны увидеть вывод Local Developer Machine Data. Вы успешно выставили локальную службу на удаленный сервер!

Доступ к внутренней веб-службе

На этом заключительном этапе мы закрепим наши знания, используя созданные туннели для загрузки данных и сохранения их в файлы в нашем каталоге проекта.

Убедитесь, что вы находитесь в каталоге проекта по умолчанию:

cd ~/project

Сначала давайте используем туннель локального перенаправления портов (порт 8080), чтобы получить внутренние корпоративные данные и сохранить их в файл с именем internal_data.txt. Мы будем использовать флаг -o с curl, чтобы указать выходной файл.

curl http://127.0.0.1:8080 -o internal_data.txt

Затем давайте используем туннель удаленного перенаправления портов (порт 8081), чтобы получить данные локального разработчика через бастион-хост и сохранить их в файл с именем remote_data.txt.

docker exec bastion_host curl -s http://127.0.0.1:8081 > remote_data.txt

Наконец, давайте проверим содержимое файлов, которые вы только что загрузили, с помощью команды cat:

cat internal_data.txt
cat remote_data.txt
Secret Internal Corporate Data
Local Developer Machine Data

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

Резюме

Поздравляем! Вы успешно завершили лабораторную работу по SSH-туннелированию и перенаправлению портов.

В этой работе вы изучили концепции SSH-туннелирования и то, как его можно использовать для обхода сетевых ограничений. Вы настроили локальное перенаправление портов (-L) для безопасного доступа к скрытым внутренним службам путем маршрутизации локального трафика через бастион-хост. Кроме того, вы настроили удаленное перенаправление портов (-R) для предоставления доступа к локальным службам разработки с удаленного сервера, успешно обойдя локальный NAT и брандмауэры. Наконец, вы узнали, как запускать SSH-туннели в фоновом режиме с помощью флагов -N и -f.

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