Как создать SSH-туннель

Использование SSH для создания туннеля - это самый простой и быстрый способ организовать защищенный шифрованный канал связи. Для организации такого туннеля потребуется один компьютер с SSH-сервером и другой с SSH-клиентом. Технология SSH есть практически на любом компьютере с операционной системой Linux. С некоторых пор Microsoft тоже внедрила SSH в свои операционные системы: сервер OpenSSH доступен на Windows Server 2019, а клиент на Windows 10.

Если обратиться к справке SSH, то можно увидеть что SSH-туннели именуется как Port Forwarding (проброс портов). Такое название наиболее точно выражает суть данной технологии. SSH port forwarding позволяет послать TCP пакет с одной стороны SSH соединения на другую его сторону и произвести трансляцию заголовка по заранее определенному правилу в процессе передачи.

Особенности SSH-туннеля:

  1. SSH работает на транспортном уровне, используя протокол TCP. Поэтому завернуть в SSH туннель UDP трафик или пингануть ICMP запросом удаленный хост не получится;
  2. В отличии от VPN туннелей, где любой хост может инициировать сеанс, в ssh-туннеле необходимо явно задать "точку входа".

SSH-туннели не подойдут для организации полноценного VPN между двумя сетями так как они создают TCP-соединение, которое всего лишь транслирует адрес источника или назначения (пробрасывают порт) и не позволяет задействовать другие протоколы транспортного уровня (UDP, ICMP и пр.). Такое соединение не позволит взаимодействовать любому хосту одной сети с любым хостом другой сети.

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

Виды ssh-туннелей

Есть несколько способов организации SSH-туннеля. Выбор типа туннеля зависит от той задачи, которую вы хотите решить.

1. Прямой SSH-туннель: подключаемся к серверу за NAT

Прямой ssh-туннель применяется для того, чтобы перенаправить соединение с заданным TCP-портом на локальном (клиентском) хосте на порт удаленного хоста (сервера). Всякий раз, когда устанавливается соединение с локальным портом или сокетом, соединение пересылается по защищенному каналу, и
с удаленного компьютера устанавливается соединение либо с хост-портом, либо с сокетом Unix.

Практический пример:

Вам очень нужно подключится к корпоративному веб-сайту, но сделать это из сети интернет нет возможности так как на корпоративном роутере не проброшен через NAT 80 порт. Но на роутере есть ssh-сервер к которому можно подключиться из сети интернет.

Вы устанавливаете соединение SSH-сервером роутера (внешний ip 1.1.1.1), но перед логином с паролем передаете аргумент -L (local port) с правилами проброса порта (точка входа и трансляция). Например, точкой входа будет локальный порт вашего компьютера 8080, который будет транслироваться на 80 порт корпоративного веб сервера (ip 172.16.0.2).

ssh -L 127.0.0.1:8080:172.16.0.2:80 user@1.1.1.1

После успешного создания ssh-туннеля корпоративный веб-сайт будет доступен вам по локальному адресу http://127.0.0.1:8080.

Кстати, локальный ip можно не указывать и сократить строку подключения до следующего вида:

ssh -L 8080:172.16.0.2:80 user@1.1.1.1
прямой ssh-туннель

Как проходят пакеты по прямому ssh-туннелю:

  1. На ssh-клиенте TCP-пакеты с адресом источника Src 127.0.0.1:65235 и адресом назначения Dst 127.0.0.1:8080 отправляются в сокет открытый процессом SSH 127.0.0.1:8080;
  2. Процесс SSH переписывает адрес назначения tcp-пакета согласно заданного правила трансляции на 172.16.0.2:80 и отправляет на ssh-сервер роутера;
  3. Процесс SSHD на роутере смотрит адрес назначение tcp-пакета и отправляет его на порт веб-сервера 172.16.0.2:80. При этом адрес источника Src 127.0.0.1:65235 роутер переписывает на свой 172.16.0.1:11505, чтобы веб сервер отправил ответный пакет роутеру, а не на свой локальный адрес 127.0.0.1.

1.1 Прямой SSH-тунель с перенаправление на локальный порт SSH-сервера

Прямой ssh-тунель можно использовать для подключения к другому порту хоста, на котором установлен ssh-сервер. Например, у вас нет доступа к веб-интерфейсу роутера из сети интернет, но есть к порту ssh. Вы создаете ssh-сеанс с аргументом -L, а в качестве точки входа и адреса трансляции указываете сокеты соответственно 127.0.0.1:8080 и 127.0.0.1:88 (в реальности веб-интерфейсы используют порт 80).

ssh -L 127.0.0.1:8080:127.0.0.1:88 user@1.1.1.1 

Таким образом веб-интерфейс роутера станет доступен на локальном сокете вашего компьютера по адресу http://127.0.0.1:8080.

прямой ssh-туннель с перенаправлением на локальный порт сервера


1.2. Прямой SSH-туннель с предоставлением доступа другим участникам сети

Есть еще один весьма интересный способ создания прямого ssh-туннеля - туннель с предоставление доступа другим участникам своей локальной сети. По сути, этот тот же прямой туннель, но в качестве точки входа указан не локальный адрес хоста, а его адрес в локальной сети - например, 192.168.0.1.

ssh -L 192.168.0.1:8080:172.16.0.2:80 user@1.1.1.1

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

Если для локальной точки входа указать адрес 0.0.0.0:8080, то доступ к туннелю можно будет получить из любой логической сети. Это может быть удобно в случае получения адреса от dhcp-сервера, так как избавляет от необходимости выяснять какой ip получен.

ssh -L 0.0.0.0:8080:172.16.0.2:80 user@1.1.1.1

прямой ssh-туннель с предоставлением доступа другим участникам сети

2. Обратный SSH-туннель: выставляем ресурсы в Интернет

Обратный SSH-туннель применяется для того, чтобы на удаленном хосте (ssh-сервере) открыть сокет и перенаправлять соединения, устанавливаемые с этим сокетом, на порт локального хоста (ssh-клиента).

Практический пример:

Вы работаете дома, на удаленке, и завершили разработку веб-сайта. Коллеги с работы просят вас показать результат. Для этого вам нужно сделать так, чтобы 80 порт вашего веб-сервера стал доступен вашим коллегам.

Вы устанавливаете соединение с ssh-сервером корпоративного роутера (публичный ip 1.1.1.1) и задаете правило обратной трансляции с помощью аргумента -R (remote port). Затем указываете точку входа, находящуюся на удаленном хосте (ssh-cервере), 172.16.0.1:8080 и адрес трансляции на порт локального хоста (ssh-клиента) 127.0.0.1:

обратный ssh-туннель

Что происходит с пакетом отправленным по обратному SSH-туннелю:

1. Источник с адресом192.168.0.200 отправляет пакет с адресом назначения 192.168.0.1:8080, который поступив на ssh-сервер попадает в сокет, открытый процессом sshd;

2. Процесс sshd переписывает адрес и порт назначения с 192.168.0.1:8080 на 127.0.0.1:80 и отправляет и отправляет его по SSH туннелю стороне инициатору сеанса;

3. На хосте процесс ssh смотрит адрес назначения полученного пакета и переписывает адрес отправителя с 192.168.0.200 на адрес своего loopback, затем отправляет его в локальный сокет 127.0.0.1:80, открытый процессом веб-сервера.

3. Динамический SSH-туннель: создаем SOCKS-прокси

SSH-туннели позволяют создать соединение, работающее как SOCKS-прокси. На локальном хосте создается динамический сокет, который превращает ваш компьютер в прокси сервер, переадресующий весь трафик на удаленный ssh-сервер.

Практическое применение:

Вы находитесь в кафе и подключились к публичной сети wi-fi, а доступ к ресурсу в интернете заблокирован владельцем точки wi-fi или провайдером. Чтобы обойти эти ограничение нужно создать динамический ssh-туннель до своего хоста с публичным ip-адресом.

ssh -D 8888 user@3.3.3.3
динамический ssh-туннель

После создания туннеля необходимо указать адрес прокси сервера в настройках операционной. Подробно об этом можете прочесть в статье "Как настроить параметры прокси в Windows 10"

4. SSH-туннель Layer 3 (сетевой уровень): туннелируем udp-трафик

В начале статьи было сказано о том, что ssh-туннель базируется на транспортном протоколе tcp и поэтому отправить в такой туннель udp-трафик не получится. Однако в операционных системах семейства Linux есть возможность создавать tun-интерфейсы, которые работают на сетевом уровне модели OSI и оперируют ip-пакетами.

В организации ssh-туннеля с помощью tun-интерфейсов есть один серьезный недостаток - авторизация на ssh-сервере должна происходить под учетной записью root. Это создает уязвимость вашей компьютерной сети т.к. пароль root будет передаваться через открытую сеть Интернет.

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

  • Использовать для root довольно сложный пароль на подобии хэша md5;
  • Или настроить авторизацию по ключам.

Для создания туннеля необходимо в конфигурационном файле OpenSSH разрешить туннелирование. Добавьте в файл /etc/ssh/ssh_config следующую строку:

PermitTunnel point-to-point 

Для того чтобы можно было использовать парольную авторизацию root:

PermitRootLogin yes 

Для подключения к ssh-серверу и создания туннеля через tun-интерфейсы используется следующая команда:

sudo ssh root@3.3.3.3 -w 0:0

Аргумент -w создает интерфейсы tun0 на клиенте и сервере.

ssh туннель layer3 с tun интерфейсами

Затем необходимо настроить ip адреса tun интерфейсов и добавить необходимые маршруты.

На клиенте:

ifconfig tun0 10.0.0.2/30 pointopoint 10.0.0.1
ip route add 172.16.0.0/24 via 10.0.0.1

На сервере:

ifconfig tun0 10.0.0.1/30 pointopoint 10.0.0.2
ip route add 192.168.0.0/24 via 10.0.0.1

Туннели с tun-интерфейсами работают на 3 уровне модели OSI, а значит должны пропускать ICMP и UDP трафик. Поэтому проверку работоспособности туннеля можно выполнить, послав icmp-запрос на какой-либо хост из удаленной сети: ping 172.16.0.100.

В качестве заключения:
SSH-туннели позволяют просто и быстро создать защищенный канал и получить доступ к тем ресурсам, к которым казалось невозможым подключиться. Главное помнить, что такие туннели нельзя расценивать как средство создания vpn-сетей. Благодаря простоте и быстроте настройки они идеально подходят для проброса портов, получения удаленного доступа или траблшутинга.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *