Введение ¶
Если нужно добраться до сервера, который находиться за NAT, то напрямую это сделать нельзя, нужно как-то извращаться. Рассмотрим как можно использовать прямые и обратные SSH туннели для этих целей.
О туннелях ¶
- Обратный туннель – создаётся от целевого сервера (ЦС) к промежуточному (ПС). Сокет в этом случае создаётся на ПС.
- Прямой туннель – создаётся от начального сервера (НС) к ПС. Сокет в этом случае находиться на НС.
Используя два туннеля мы можем добраться до ЦС. Можно пробросить порт какого-то сайта или просто выбросить порт SSH сервера ЦС, а через него войти в систему. Так же можно пробросить SOCKS5 прокси и выходить в сеть через ЦС. Вариантов достаточно.
Промежуточный сервер обязательно должен быть доступен как с целевого, так и с начального
Создание пользователя на ПС ¶
Удобно и безопасно использовать пользователя, который может только создавать тунели, чтобы через него нельзя было зайти на ПС. Код представленный ниже как раз наценен на создание пользователя без домашнего каталога и интерпретатора для входа.
|
|
Обратный тунель ¶
Теперь давайте приступим к созданию тунелей. Нам понадобиться обратный от ПС к ЦС. Далее используется sshpass, который нужен для автоматического ввода пароля при подключении по SSH.
Для создания обратного тунеля, его нужно создавать со стороны ЦС. Добавим ПС в список известных на ЦС.
|
|
И создадим тунель.
|
|
- 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 но уже ПС. Теперь мы можем достучаться до ЦС с ПС. Проверить можно командой ниже
|
|
Начало тунеля на ПС, конец на ЦС. Для прямого было бы наоборот. Если обратиться на внешний IP адресс ПС на порт 22, то в тунель мы не попадём, так как трафик должен заходить только с 127.0.0.1, то есть с самого ПС
Прямой тунель ¶
Для того, чтобы попасть в обратный тунель от ПС до ЦС, нам нужно пробросить трафик с НС внутрь ПС. Для этого создадим прямой тунель выполнив код представленный ниже на НС.
|
|
- 1234:localhost:2222 – проксируем трафик с 127.0.0.1:1234 НС на 127.0.0.1:2222 ПС, а фактически трафик пойдёт сразу по обратноме тунелю к ЦС на порт 22.
SOCKS5 proxy ¶
Мы можем настроить любой браузер, чтобы тот использовал SOCKS5 прокси для направления всего трафика. Это удобно, если нужно обратиться к ресурсам в локальной сети ЦС с НС. Выполним команду ниже на НС (после создания всех тунелей).
|
|
Осталось настроить использование прокси. Может выглядеть так.