Введение
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.
Эти навыки необходимы для безопасного системного администрирования, удаленной разработки и безопасной навигации по сложным сетевым топологиям.



