Настройка SSH-туннелирования на VPS

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

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

Теория: Cвязь в Интернете, сетевые протоколы и порты

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

  • HTTP используется для загрузки веб-сайтов и файлов в веб-браузере.
  • FTP используется для отправки файлов между клиентом и сервером.
  • DNS используется для преобразования имени хоста в IP-адрес и наоборот.
  • POP3 и (или) IMAP предназначены для загрузки и просмотра электронной почты.
  • SMTP используется для отправки электронной почты.
  • telnet предназначен для удаленного подключения к серверу.
  • SSH похож на telnet, но это его безопасная, зашифрованная версия (благодаря этому никто не может видеть передаваемые данные).

Затем сообщения данного протокола должны быть упакованы в сегмент TCP или UDP-дейтаграмму (на транспортном уровне). Эти протоколы используются для передачи данных через Интернет – они работают на транспортном уровне. Протокол TCP является протоколом с установлением соединения, а это означает, что перед отправкой данных между удаленными машинами требуется создать соединение. TCP всегда предоставляет данные в правильном порядке. Если какой-либо сегмент будет потерян во время передачи по сети, он будет отправлен снова. TCP считается достаточно надежным протоколом.

UDP является протоколом без установления соединения. Он не обеспечивает повторную передачу потерянных дейтаграмм. Если пакеты не были получены в правильном порядке, UDP все равно будет передавать их в приложение в том порядке, в котором он их получил. Из-за этого UDP в основном используется для передачи мультимедийных данных в реальном времени – переговоров по VoIP, видеоконференций, аудио и видео. UDP иногда используется другими протоколами на прикладном уровне – например, в случае DNS.

В этом случае протокол более высокого уровня должен повторно отправить запрос, не получив ответа за заданный промежуток времени. UDP используется здесь главным образом потому, что требует мало ресурсов: отправка 1 маленького запроса в 1 датаграмме и получение ответа занимает меньше времени и требует передачи меньшего количества данных, чем создание TCP-соединения (это отправка клиентского запроса, подтверждение с сервера, отправка ответа с сервера, а затем подтверждение клиента и прерывание соединения).

Чтобы идентифицировать разные соединения с одним и тем же IP-адресом, используются номера портов. Каждый сервер данного протокола прикладного уровня связывается с определенным номером порта и ожидает входящего соединения. Клиент подключается к этому порту (в случае TCP-соединения) или отправляет на этот порт дейтаграмму (в случае UDP). Для наиболее часто используемых протоколов есть зарезервированные номера портов. Например, HTTP-сервер обычно прослушивает порт 80 TCP (в некоторых случаях клиенты должны указывать номер порта в адресе – http://example.org:1234/), DNS-сервер обычно прослушивает порт 53 UDP (иногда 53 TCP). Клиент также должен использовать порт на своей стороне. Они генерируются случайным образом.

Здесь вы можете просмотреть список зарезервированных портов, которые вы используете каждый день.

Сегменты и дейтаграммы затем упаковываются в IP-пакеты на сетевом уровне. В пакетах исходный и целевой компьютер идентифицируются по IP-адресам. Они глобальны – только один хост может использовать один и тот же адрес за раз (за исключением NAT, что используется в домашних маршрутизаторах с частными IP-адресами: 192.168.xx, 10.xxx, 172.16-31.xx; где x – число от 1 и 255). На основе этих адресов маршрутизаторы могут решить, как отправить пакет на целевой компьютер.

Затем пакеты упаковываются в ячейки на канальном уровне, а затем передаются по кабелю или в виде радиоволн в локальной сети. На канальном уровне компьютеры идентифицируются по их MAC-адресам. Ячейки с MAC-адресами полностью удаляются из маршрутизаторов, которые извлекают из них пакеты. Они решают, в какую сеть отправлять пакеты, упаковывают их в новые ячейки и отправляют их. Если сеть между обоими маршрутизаторами использует MAC-адреса, исходный и целевой адреса этих маршрутизаторов включены в ячейку. Невозможно установить связь между двумя компьютерами в разных сетях, используя только MAC-адреса, даже если они не дублируются.

Что такое SSH?

SSH – это протокол, который работает на прикладном уровне. Это наследник telnet, который используется для удаленного подключения к VPS в текстовом режиме. Но в отличие от telnet, SSH шифруется. Он использует порт 22 TCP, но вы можете легко изменить порт в конфигурации вашего сервера. SSH позволяет пользователю аутентифицироваться несколькими различными способами:

  • С помощью имени пользователя  пароля;
  • С помощью пары ключей – открытого и закрытого; программа, которую вы используете для подключения к SSH, должна решить математическую задачу с помощью закрытого ключа и отправить решение серверу. Каждый раз решается новая задача, поэтому ключ трудно взломать.

Наиболее популярной версией SSH-сервера является OpenSSH. Наиболее популярными клиентами являются PuTTY (для Windows) и OpenSSH (для Linux). И PuTTY и OpenSHH позволяют пользователям создавать туннели.

SSH позволяет пользователям создавать туннель TCP между сервером и клиентом и отправлять данные через этот туннель. SSH поддерживает только TCP-туннели, но вы можете обойти это, например, через прокси-сервер SOCKS. Подобный туннель устанавливается между выбранным TCP-портом на сервере и локальным портом. Конечно, он незашифрованный, так что любой пользователь может проверить, для чего он используется.

Основные понятия

Loopback интерфейс (или интерфейс обратной петли) – это виртуальная сетевая карта, установленная в системе, с IP-адресом 127.0.0.1. Доступ к этому адресу имеют только приложения, установленные в системе. Удаленный доступ к этому интерфейсу невозможен. Вы можете запустить на этом интерфейсе VPS и получить к нему удаленный доступ только из той же системы или через туннель.

SMTP – это протокол прикладного уровня, который позволяет отправлять электронные письма. Он используется как для связи между почтовыми серверами, так и между сервером и почтовым клиентом. SMTP использует порт 25 TCP для незашифрованной связи и порт 587 TCP или 465 TCP (устарел – использовать не рекомендуется) для зашифрованного соединения (SSL).

POP3 — протокол прикладного уровня, используемый для загрузки новых сообщений электронной почты с сервера на локальный почтовый клиент. Он редко используется в наши дни, поскольку он был заменен IMAP. Для незашифрованных соединений он использует порт 110 TCP, для зашифрованных – 995 TCP.

IMAP – протокол, похожий на POP3, но с поддержкой папок, ярлыков, чтения и управления сообщениями и папками на сервере без необходимости загружать все на локальный ПК и удалять с сервера. IMAP использует TCP порт 143 для незашифрованных соединений и порт 993 TCP для зашифрованных соединений.

Пример 1: Туннель к серверу IMAP

Попробуйте создать туннель между локальным портом 143 на интерфейсе loopback (127.0.0.1) и IMAP-сервером для приема почты (незашифрованное соединение) на одном удаленном компьютере.

Unix и OpenSSH

ssh abc@def -L 110:127.0.0.1:110

Где:

  • abc – имя пользователя на сервере
  • def – адрес сервера
  • 110: — локальный порт, который будет открыт по интерфейсу loopback (127.0.0.1) на локальной машине
  • 127.0.0.1 – IP-адрес компьютера, с которым создается туннель
  • :110 – номер порта целевой машины, к которому подключится туннель

Windows и PuTTY

В этом разделе вы узнаете, как создать соединение с вашим VPS с помощью PuTTY. Это соединение требуется для создания туннеля.

  • Выберите соединение, загрузите данные и перейдите в Connection-> SSH-> Tunnels и укажите:

Source port: 110
Destination: 127.0.0.1:110

  • Поставьте галочки в Local и Auto.
  • Нажмите Add. В Forwarded ports появится L110   127.0.0.1:110.
  • Сохраните сессию и подключитесь с ее помощью.

Теперь вы можете просто настроить почтовый клиент для непосредственного подключения к VPS, используя порт 110 интерфейса loopback – 127.0.0.1. Вы можете сделать то же самое с разными протоколами – SMTP (25), IMAP (143) и т. д.

Пример 2: Туннель к веб-серверу

Туннель между локальным портом 8080 на локальном интерфейсе (127.0.0.1) и WWW-сервером привязан к порту 80 удаленной машины. На этот раз мы подключимся к нему, используя интерфейс loopback.

Для загрузки сайтов в браузере используется протокол HTTP.

Unix и OpenSSH

ssh abc@def -L 8080:11.22.33.44:80

Где:

  • abc – имя пользователя на сервере
  • def – адрес сервера
  • 8080: — порт на локальной машине, который будет открыт в интерфейсе loopback (127.0.0.1)
  • 22.33.44 – IP-адрес сервера, с которым создается SSH-туннель

Windows и PuTTY

  • Выберите соединение и загрузите параметры.
  • Выберите Connection->SSH->Tunnels.
  • Установите Forwarded ports: L8080 22.33.44:80. Поставьте галочки в Local и Auto.
  • Кликните Add.
  • Сохраните сессию и используйте ее для подключения.

Теоретически, перейдя к 127.0.0.1:8080 в браузере, вы должны увидеть веб-сайт, расположенный на удаленном сервере, к которому мы подключились.

Практически, HTTP 1.1 представил параметр Host для запросов. Этот параметр используется для отправки домена DNS VPS, к которому вы подключаетесь. Если он использует механизм Virtual Host, вы получите либо страницу ошибки, либо главную страницу сервера, но не через туннель.

В этом случае нужно сделать еще одно: в файле hosts на локальном ПК добавьте адрес VPS и интерфейс loopback:

127.0.0.1 website

Где website – это адрес сайта, к которому вы хотите подключиться (без http:// в начале и / в конце).

Файл Hosts находится в каталоге /etc/hosts (Linux) или C:\Windows\system32\drivers\etc\hosts (Windows). Чтобы отредактировать этот файл, вы должны быть администратором или иметь административные привилегии.

Важно! Если вы хотите создать туннель в Unix-системах по локальному порту с номером ниже 1024, вы должны иметь права root.

Пример 3: Прокси-сервер SOCKS

Прокси-сервер SOCKS позволяет отправлять трафик с любого протокола через туннель. Со стороны он выглядит как одно TCP-соединение.

В этом примере попробуйте создать туннель между сервером SSH и клиентом по порту 5555 на интерфейсе loopback. Затем нужно настроить браузер для поддержки SOCKS в качестве прокси-сервера для каждого исходящего соединения.

Это средство может быть полезно для предотвращения ограничений в корпоративных сетях. Если порт, который использует SSH, заблокирован, можно настроить сервер для прослушивания порта 443 с помощью параметра Listen в конфигурационном файле OpenSSH (/etc/ssh/sshd_config or /etc/openssh/sshd_config).

Unix and OpenSSH

ssh abc@def -D 5555

Где:

  • abc – имя пользователя
  • def – адрес сервера
  • 5555 – номер локального порта, на котором создается туннель

Windows and PuTTY

  • Выберите соединение и загрузите настройки.
  • Выберите Connection-> SSH-> Tunnels.
  • Установите в Forwarded ports D5555, поставьте галочки в Dynamic и Auto.
  • Нажмите Add.
  • Сохраните сессию и подключитесь с ее помощью.

В настройках браузера укажите прокси-сервер SOCKS, который будет работать на 127.0.0.1:5555, пока вы не закроете соединение в PuTTY или OpenSSH.

4: Обход NAT

NAT – это механизм, который позволяет многим людям использовать одно подключение к Интернету. Маршрутизатор, использующий NAT, имеет один публичный адрес и заменяет все частные адреса в пакетах, полученных из внутренней сети, своим собственным публичным адресом и отправляет их в Интернет. При возврате пакетов он выполняет обратное действие – он запоминает IP-адреса и номера портов в специальной таблице NAT.

Внешнее соединение возможно только при настройке соответствующей переадресации портов на маршрутизаторе. Однако можно обойти эту проблему и создать туннель между компьютером и сервером для непосредственного подключения к нему.

Из соображений безопасности удаленный порт 8080 будет открыт только на интерфейсе loopback VPS. Чтобы открывать соединения на каждом порту, нужно перенастроить сервер.

Откройте в текстовом редакторе файл /etc/ssh/sshd_config (или /etc/openssh/sshd_config) как root.

nano /etc/ssh/sshd_config

Найдите строку:

#GatewayPorts no

Раскомментируйте ее и измените значение:

GatewayPorts yes

Сохраните файл и закройте редактор.

Перезапустить SSHD-сервер:

# Debian/Ubuntu:
service ssh restart
# CentOS:
/etc/init.d/sshd restart

Теперь можно создать туннель.

Unix и OpenSSH

ssh abc@def -R 8080:127.0.0.1:80

Где:

  • abc – имя пользователя
  • def – адрес сервера
  • 8080 – номер порта, который нужно открыть на удаленном сервере (прокси-сервере)
  • 0.0.1 – IP-адрес, для которого создается туннель.
  • 80 – номер порта, на котором откроется туннель.

На этот раз туннель будет локальным, но вы можете подключить туннель к другим компьютерам в одной сети с помощью NAT.

Заключение

Как видите, есть три типа SSH-туннелей:

  1. Локальный (опция –L) – туннель открывается на локальном порту и прослушивает подключения, которые сначала перенаправляются на сохраненное соединение с сервером SSH, а затем на целевой хост.
  2. Удаленный (опция –R) – туннель открывается на сервере SSH. Все передачи перенаправляются из локального туннеля после получения соединения сервером.
  3. Динамический (опция –D) – туннель открывается на локальном loopback интерфейсе. Передача осуществляется по протоколу SOCKS. Вы можете передавать через этот туннель все пакеты — TCP, UDP. К любому серверу в Интернете можно подключиться через прокси-сервер SSH. Чтобы перенаправить весь системный трафик через прокси-сервер SOCKS, вы можете использовать специальные программы.
Tags: , , , , , , ,