Поиск по сайту:

Как настроить SSH-туннелирование на VPS


Введение

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

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

Связь в Интернете, сетевые протоколы и коммуникационные порты

Каждое программное обеспечение, установленное на вашем компьютере, которое хочет отправлять или получать данные через Интернет, должно использовать протокол прикладного уровня из стека 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 (обмен 3 сегментами между хостами): отправка запроса из клиент, отправив подтверждение с сервера, отправив ответ с сервера, а затем отправив подтверждение от клиента и разорвав соединение (4 сегмента).

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

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

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

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

О СШ. Теория, часть 1

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

Например:

  • используя имя пользователя и пароль
  • используя пару ключей - первый закрытый (совершенно секретный), а второй - общедоступный (на сервере): программа, которую вы используете для подключения по SSH, должна решить математическую задачу с использованием закрытого ключа и отправить решение для сервера. Проблема каждый раз разная, поэтому взломать ключ с помощью этого метода аутентификации сложно.

В настоящее время мы используем версию 2 SSH.

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

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

Понятия, которые будут использоваться

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

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

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

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

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

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

Unix и OpenSSH:

ssh abc@def -L 110:127.0.0.1:110
 
abc - username on server
def - server address
110: - local port that will be opened on loopback interface (127.0.0.1) on local machine
127.0.0.1 - IP address of computer that we creating a tunnel to via our SSH tunnel
:110 - port number of target machine we'll get to via tunnel

Windows и PuTTY:

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

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

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

Как я уже говорил ранее, протокол HTTP используется для загрузки веб-сайтов WWW в браузер.

Unix и OpenSSH:

ssh abc@def -L 8080:11.22.33.44:80
 
    abc - username on server
    def - server address
    8080: - port on the local machine that will be opened on loopback interface (127.0.0.1)
    11.22.33.44 - IP address of the server that we'll create a tunnel to using SSH

Windows и PuTTY:

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

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

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

127.0.0.1 website

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

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

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

Пример 3. SOCKS-прокси

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

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

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

Unix и OpenSSH:

ssh abc@def -D 5555
 
    abc - username
    def - server address
    5555 - local port number, where the tunnel will be created

Windows и PuTTY:

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

Пример 4. Обход NAT

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

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

Часть 1.

Во второй части хорошо создадим туннель между локальным портом 80 (на нашем компьютере — локальный HTTP-сервер) и портом 8080 на удаленном сервере. Однако из соображений безопасности удаленный порт 8080 будет открыт только на петлевом интерфейсе VPS — 127.0.0.1. Из-за этого нам нужно перенастроить наш сервер, чтобы открывать соединения на каждом порту. Ну сделай это сейчас.

  1. In your favorite editor, open the /etc/ssh/sshd_config (or /etc/openssh/sshd_config) file as root.
    nano /etc/ssh/sshd_config
  2. Find:
    #GatewayPorts no
  3. Change that line to:
    GatewayPorts yes
  4. Save the file and close the editor.
  5. Restart SSHD server:
    Debian/Ubuntu:
    service ssh restart
    

    CentOS: /etc/init.d/sshd restart

Часть 2.

В этом разделе мы создадим туннель.

Unix и OpenSSH:

ssh abc@def -R 8080:127.0.0.1:80
 
    abc - username
    def - server address
    8080 - port number that will be opened on remote server - our proxy server
    127.0.0.1 - IP address we open tunnel to
    80 - port number we open tunnel to

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

Windows и PuTTY:

После входа в систему мы можем получить доступ к нашему локальному HTTP-серверу из-за пределов нашей сети через прокси-сервер OpenSSH с общедоступным IP-адресом. Откройте в браузере следующее:

http://IP-address-or-domain-of-our-server-change-that-for-your-name:8080/

Теория продолжение

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

  • Локальный — вариант -L — туннель открывается на нашем локальном порту и прослушивает соединения, которые перенаправляются сначала на наше сохраненное соединение с сервером SSH, а затем на целевой хост.
  • Удаленно — опция -R — туннель открывается на SSH-сервере. После получения соединения сервером все передачи перенаправляются из нашего локального туннеля.
  • Опция
  • Динамический — -D — туннель открывается на локальном петлевом интерфейсе. Передача происходит по протоколу SOCKS. Через него можно туннелировать любые пакеты - TCP, UDP. Можно подключиться к любому серверу в Интернете через прокси-сервер SSH. Чтобы перенаправить весь системный трафик через SOCKS-прокси, вы можете использовать такую программу, как proxifier.