Featured image of post Обратные SSH тунели

Обратные SSH тунели

Выбрасываем порт по SSH тунннелю сквозь NAT

Введение

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

О туннелях

  1. Обратный туннель – создаётся от целевого сервера (ЦС) к промежуточному (ПС). Сокет в этом случае создаётся на ПС.
  2. Прямой туннель – создаётся от начального сервера (НС) к ПС. Сокет в этом случае находиться на НС.

Схема работы предложенного метода

Используя два туннеля мы можем добраться до ЦС. Можно пробросить порт какого-то сайта или просто выбросить порт SSH сервера ЦС, а через него войти в систему. Так же можно пробросить SOCKS5 прокси и выходить в сеть через ЦС. Вариантов достаточно.

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

Создание пользователя на ПС

Удобно и безопасно использовать пользователя, который может только создавать тунели, чтобы через него нельзя было зайти на ПС. Код представленный ниже как раз наценен на создание пользователя без домашнего каталога и интерпретатора для входа.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
sudo adduser -s /bin/false -M -N tunnel
sudo usermod -d / tunnel
echo 'tunnel:tunnel' | sudo chpasswd
cat <<EOF | sudo tee -a /etc/ssh/sshd_config

Match User tunnel
    PasswordAuthentication yes
    AuthenticationMethods "password"
EOF
sudo systemctl restart sshd

Обратный тунель

Теперь давайте приступим к созданию тунелей. Нам понадобиться обратный от ПС к ЦС. Далее используется sshpass, который нужен для автоматического ввода пароля при подключении по SSH.

Для создания обратного тунеля, его нужно создавать со стороны ЦС. Добавим ПС в список известных на ЦС.

1
2
mkdir -p ~/.ssh
ssh-keyscan -H jump-host >> ~/.ssh/known_hosts

И создадим тунель.

1
sshpass -p 'password' ssh -fNR 2222:localhost:22 tunnel@jump-host
  • ssh-keyscan -H jump-host - добавляем ключи SSH сервера на ПС в список доверенных на ЦС
  • sshpass -p ‘password’ – sshpass введёт пароль к новосозданному ранее пользователю на ПС
  • -fN – выполнить команду и не создавать сессию tty
  • -R - создание обратного тунеля
  • 2222:localhost:22 – формат такой <адрес в начале тунеля>:<порт в начале тунеля>:<адрес на конце тунеля>:<порт на конце тунеля>. Стало быть, команда делает конкретно следующее: проксирует 127.0.0.1:2222 (адрес начала по умолчанию это localhost) к ПС на 127.0.0.1:22 но уже ПС. Теперь мы можем достучаться до ЦС с ПС. Проверить можно командой ниже
1
ssh -p 2222 localhost hostname

Начало тунеля на ПС, конец на ЦС. Для прямого было бы наоборот. Если обратиться на внешний IP адресс ПС на порт 22, то в тунель мы не попадём, так как трафик должен заходить только с 127.0.0.1, то есть с самого ПС

Прямой тунель

Для того, чтобы попасть в обратный тунель от ПС до ЦС, нам нужно пробросить трафик с НС внутрь ПС. Для этого создадим прямой тунель выполнив код представленный ниже на НС.

1
2
3
mkdir -p ~/.ssh
ssh-keyscan -H jump-host >> ~/.ssh/known_hosts
sshpass -p 'password' ssh -fNL 1234:localhost:2222 tunnel@jump-host
  • 1234:localhost:2222 – проксируем трафик с 127.0.0.1:1234 НС на 127.0.0.1:2222 ПС, а фактически трафик пойдёт сразу по обратноме тунелю к ЦС на порт 22.

SOCKS5 proxy

Мы можем настроить любой браузер, чтобы тот использовал SOCKS5 прокси для направления всего трафика. Это удобно, если нужно обратиться к ресурсам в локальной сети ЦС с НС. Выполним команду ниже на НС (после создания всех тунелей).

1
ssh -fND 1329 -p 1234 user-on-th@localhost

Осталось настроить использование прокси. Может выглядеть так.

Настройки прокси в KDE Plasma

Licensed under Apache License, Version 2.0
Обновлено нояб. 19, 2024 10:58 +0200
All rights reserved
Создано при помощи Hugo
Тема Stack, дизайн Jimmy