ssh
February 3, 2023

Настройка SSH туннеля без доступа к SHELL и без VPN

Исходные данные:

Имеем ПК в собственной ЛВС ip_pc1 за натом, , сервер в DMZ (ip_server), ПК клиента ip_other тоже за натом.

Собственная ЛВС закрыта фаерволом, доступ можно получить только изнутри до сервера ip_server

Цель:

Получить доступ по SSH с ip_pc1 до ip_other

Процесс настройки:

На сервере ip_server создаем нового пользователя:

useradd -m -s /bin/false -g nogroup -G nogroup user

-m - Create the user's home directory if it does not exist
-s - The name of the user's login shell.
-g - The group name or number of the user's initial login group.
-G - A list of supplementary groups which the user is also a member of.

Задаем новому пользователю пароль:

sudo passwd user

Логинимся под пользователем, генерируем пару ключей

su user cd ~ ssh-keygen

Создаем файл ~/.ssh/authorized_keys и добавляем в него следующие строки:

command="read a; exit",no-agent-forwarding,no-X11-forwarding,no-user-rc ssh-rsa <<здесь вставляем только что созданный публичный ключ>>

где:
command="read a; exit" - позволяет при поднятии соединения закрыть доступ к shell. При нажатии любой клавиши будет выполнен exit.
no-agent-forwarding,no-X11-forwarding,no-user-rc - запрещаем любые другие возможности пользователя

Закрытый ключ передаем клиенту

Клиент на своей машине подключается к нашему серверу:

sh -R 4897:localhost:22 user@server

где:
22 - порт ssh который слушает машина клиента
4897 - порт перенаправления на наш сервер, можно выбрать любой другой

На собственном пк подключаемся к серверу:

ssh -L 2222:localhost:4897 user@server

где:
2222 - порт куда мы будем коннектится по SSH
4897 - порт должен совпадать с портом перенаправления на наш сервер из прошлого шага (с него забираем туннель)

Теперь на нашем пк открываем новый терминал и можем войти на ПК клиента:

ssh -o "StrictHostKeyChecking=no" -p 2222 -i id_rsa_client another_user@localhost

Где:
-o "StrictHostKeyChecking=no" - отключает проверку публичного ключа тачки, куда мы подключаемся, т.к. это всегда будет localhost
-p 2222 принудительно указываем порт для подключения
-i id_rsa_client путь до закрытого ключа для подключения к клиенту (может отсутствовать при авторизации по паролю)
another_user@localhost - пользователь another_user должен существовать на ПК ip_other, адрес сервера localhost, т.к. подключаемся через открытый порт на своей машине.

Готово!

Посмотреть активные туннели можно командой:

sudo lsof -i -n | egrep '\<ssh\>'

Что-бы принудительно отключить сессию (и все процессы) пользователя, на сервере выполнить:

pkill -u username