Настройка SSH-туннелей

Туннелирование сетевого трафика через безопасный SSH-туннель — это отличный способ обойти ограничительные настройки брандмауэра и зашифровать незашифрованный сетевой трафик.

Настройка локального туннелирования к серверу

SSH-соединения можно использовать для туннелирования трафика от портов локального хоста к портам удаленного хоста.

Локальное соединение — это способ доступа к сетевому местоположению с вашего локального компьютера через удаленный хост. Сначала устанавливается SSH-соединение с удаленным хостом. На удаленном сервере устанавливается соединение с внешним (или внутренним) сетевым адресом, предоставленным пользователем, и трафик в это местоположение туннелируется на ваш локальный компьютер по указанному порту.

Это часто используется для доступа к менее ограниченной сетевой среде за пределами брандмауэра. Другое распространенное применение — доступ к веб-интерфейсу «только для локального хостинга» из удаленного местоположения.

Чтобы установить локальный туннель к удаленному серверу, используйте параметр -L при подключении и предоставьте три дополнительных элемента информации:

  1. Локальный порт, через который вы хотите получить доступ к туннельному соединению.
  2. Хост, к которому вы хотите подключиться на вашем удаленном хосте.
  3. Порт, к которому вы хотите подключить ваш удаленный хост.

Они указываются в порядке: «локальный порт:хост:удаленный порт» в качестве аргументов для флага -L. Мы также используем флаг -f, чтобы SSH перешел в фоновый режим перед выполнением, и флаг -N, чтобы не открывать оболочку или не выполнять программу на удаленной стороне.

Например, чтобы подключиться к вашему удаленному хосту с портом 80 через порт 8888 на вашем локальном компьютере, вы можете ввести:

~$ ssh -f -N -L 8888:your_domain:80 username@remote_host

Теперь, если вы откроете свой веб-браузер и перейдете на 127.0.0.1:8888, вы увидите содержимое вашего удаленного хоста, работающего на порту 80.

Более общий синтаксис:

~$ ssh -L your_port:your_domain:domain_port username@remote_host

Поскольку соединение выполняется в фоновом режиме, для его отключения вам нужно будет найти его PID. Вы можете сделать это, выполнив поиск порта, который вы перенаправили:

~$ ps aux | grep 8888
Output
1001      5965  0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -L 8888:your_domain:80 username@remote_host
1001      6113  0.0  0.0  13648   952 pts/2    S+   12:37   0:00 grep --colour=auto 8888

Затем остановите процесс, выбрав PID, соответствующий вашей SSH-команде:

~$ kill 5965

Другой вариант — запустить соединение без флага -f, чтобы сохранить его на переднем плане и легко отключить, нажав CTRL-C.

Настройка удаленного туннелирования к серверу

SSH-подключения можно эффективно использовать для туннелирования трафика с портов локальной машины к портам на удалённом сервере.

При создании удалённого туннеля устанавливается связь с удалённым сервером, при этом указывается удалённый порт. После этого этот порт на удалённой машине будет направлен к комбинации хоста и порта, к которой привязан локальный компьютер. Такой подход позволяет удалённой машине взаимодействовать с хостом через вашу локальную машину.

Этот механизм может быть особенно полезен, если требуется открыть доступ к внутренней сети, недоступной извне. При наличии разрешающего подключения на уровне брандмауэра это позволяет подключиться к удалённой машине и направить трафик от этой машины к внутренней сети.

Для установки удалённого туннеля к вашему удалённому серверу используется параметр -R во время подключения, требуется также указать три дополнительных параметра:

  1. Порт, через который удалённый сервер получит доступ к туннельному соединению.
  2. Хост, к которому вы желаете подключить свою локальную машину.
  3. Порт, к которому вы планируете подключиться на вашей локальной машине.

Эти параметры передаются в указанном порядке (разделённые двоеточиями) в качестве аргументов для флага -R. Кроме того, для перевода SSH в фоновый режим перед выполнением используется флаг -f, а флаг -N предотвращает открытие оболочки или выполнение программы на удалённой стороне.

Например, чтобы подключиться к your_domain через порт 80 на нашем локальном компьютере, сделав соединение доступным на нашем удаленном хосте через порт 8888, вы могли бы ввести:

~$ ssh -f -N -R 8888:your_domain:80 username@remote_host

Теперь, открыв веб-браузер на удаленном хостинге, 127.0.0.1:8888 вы сможете увидеть все содержимое, находящееся на your_domain порту 80.

Более общее руководство по синтаксису:

~$ ssh -R remote_port:site_or_IP_to_access:site_port username@host

Для прекращения туннелирования действуйте так-же, как делали выше, узнайте PID и сделайте kill.

Заключение

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