Как настроить 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. Из-за этого нам нужно перенастроить наш сервер, чтобы открывать соединения на каждом порту. Ну сделай это сейчас.
- In your favorite editor, open the /etc/ssh/sshd_config (or /etc/openssh/sshd_config) file as root.
nano /etc/ssh/sshd_config
- Find:
#GatewayPorts no
- Change that line to:
GatewayPorts yes
- Save the file and close the editor.
- 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.