Обучение

Обучение

Life-Hack

Хотел бы поделиться своим небольшим опытом использования SSH для решения различных административных задач.

Оглавление:

1) Local TCP forwarding

2) Remote TCP forwarding

3) TCP forwarding chain через несколько узлов

4) TCP forwarding ssh-соединения

5) SSH VPN Tunnel

6) Коротко о беспарольном доступе



1) Local TCP forwarding

Начнем с простого — local TCP forwarding:

Имеем удаленный сервер «host2» с неким приложением, допустим, PostgreSQL server, которое принимает TCP-соединения на порту 5432. При этом вполне логично, что на этом сервере стоит файрвол, который прямых соединений извне на порт 5432 не разрешает, но при этом есть доступ по SSH (по-умолчанию порт 22, рекомендую его изменить). Требуется подключиться с нашего рабочего места «host1» клиентским приложением к серверу PostgreSQL на «host2».

Для этого на «host1» в консоли набираем:


host1# ssh -L 9999:localhost:5432 host2


Теперь на «host1» мы можем соединяться с PostgreSQL сервером через локальный порт 9999:


host1# psql -h localhost -p 9999 -U postgres


Если на «host1» Windows

Например, в PuTTy это делается так:

Идем по дереву настроек: Connection > SSH > Tunnels.

Далее в поле «Source port» вбиваем 9999, в «Destination» — localhost:5432, и нажимаем Add.

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

Как это работает

После успешного подключения к SSH-серверу на «host2», на «host1» SSH-клиент начинает слушать порт 9999. При подключении к порту 9999 на «host1», SSH-сервер на «host2» устанавливает соединение с localhost (коим и является для себя самого «host2») на порт 5432 и передает по этому соединению данные, принятые ssh-клиентом на «host1» на порт 9999.

ВАЖНО! Все указанные на схемах стрелками соединения являются отдельными TCP-соединениями (сессиями).


Настройка SSH-сервера

Port forwarding, как правило, уже включен в настройках sshd по-умолчанию.

/etc/ssh/sshd_config:

AllowTcpForwarding yes


Мы также можем соединяться с приложением не на самом «host2», а на любой доступной ему машине:

Для этого при пробросе портов вместо «localhost» указываем имя хоста, например «host3»:


host1# ssh -L 9999:host3:5432 host2


Тут важно заметить, что «host3» должен быть известен (если это имя, а не IP-адрес) и доступен для машины «host2».


Также можно через «host1» предоставить доступ любому другому узлу (назовем его «host1A») к сервису на «host3»:

Для этого нужно вставить в команду соединения ssh IP-адрес интерфейса, на котором будет поднят локальный порт 9999:


ssh -L 0.0.0.0:9999:host3:5432 host2


В данном примере порт 9999 будет открыт на всех доступных на «host1» IPv4 интерфейсах.


Report Page