Использование SSH для создания туннеля - это самый простой и быстрый способ организовать защищенный шифрованный канал связи. Для организации такого туннеля потребуется один компьютер с SSH-сервером и другой с SSH-клиентом. Технология SSH есть практически на любом компьютере с операционной системой Linux. С некоторых пор Microsoft тоже внедрила SSH в свои операционные системы: сервер OpenSSH доступен на Windows Server 2019, а клиент на Windows 10.
Содержание
Использование SSH для создания туннеля - это самый простой и быстрый способ организовать защищенный шифрованный канал связи. Для организации такого туннеля потребуется один компьютер с SSH-сервером и другой с SSH-клиентом. Технология SSH есть практически на любом компьютере с операционной системой Linux. С некоторых пор Microsoft тоже внедрила SSH в свои операционные системы: сервер OpenSSH доступен на Windows Server 2019, а клиент на Windows 10.
Что такое SSH-туннель?
Если обратиться к справке SSH, то там SSH-туннель именуется как Port Forwarding (проброс портов). Такое название наиболее точно выражает суть данной технологии. SSH port forwarding позволяет послать TCP пакет с одной стороны SSH соединения на другую его сторону и произвести трансляцию заголовка по заранее определенному правилу в процессе передачи.
Особенности SSH-туннеля:
- SSH работает на транспортном уровне, используя протокол TCP. Поэтому завернуть в SSH туннель UDP трафик или пингануть ICMP запросом удаленный хост не получится;
- В отличии от VPN туннелей, где любой хост может инициировать сеанс, в ssh-туннеле необходимо явно задать "точку входа".
SSH-туннели не подойдут для организации полноценного VPN между двумя сетями так как они создают TCP-соединение, которое всего лишь транслирует адрес источника или назначения (пробрасывают порт) и не позволяет задействовать другие протоколы транспортного уровня (UDP, ICMP и пр.). Такое соединение не позволит взаимодействовать любому хосту одной сети с любым хостом другой сети.
Есть возможность обойти вышесказанные ограничения, путем создания программного сетевого интерфейса TUN, но здесь тоже есть свои недостатки. Об этом в конце статьи.
Виды ssh-туннелей
Есть несколько способов организации SSH-туннеля: прямой, обратный, динамический (прокси) и туннель сетевого уровня. Каким способом создать SSH-туннель зависит от той задачи, которую вы хотите с его помощью решить. Ниже представлены различные способы настройки туннеля через SSH и приведены примеры их практического применения.
1. Прямой SSH-туннель: подключаемся к серверу за NAT
Прямой ssh-туннель применяется для того, чтобы перенаправить соединение с заданным TCP-портом на локальном (клиентском) хосте на порт удаленного хоста (сервера). Всякий раз, когда устанавливается соединение с локальным портом или сокетом, соединение пересылается по защищенному каналу, и с удаленного компьютера устанавливается соединение либо с хост-портом, либо с сокетом Unix.
Представляйте этот туннель как проброс порта удаленного хоста через SSH на порт своего компьютера.
Практический пример:
Вам очень нужно подключится к корпоративному веб-сайту, но сделать это из сети интернет нет возможности так как на корпоративном роутере не проброшен через 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-клиенте TCP-пакеты с адресом источника Src 127.0.0.1:65235 и адресом назначения Dst 127.0.0.1:8080 отправляются в сокет открытый процессом SSH 127.0.0.1:8080;
- Процесс SSH переписывает адрес назначения tcp-пакета согласно заданного правила трансляции на 172.16.0.2:80 и отправляет на ssh-сервер роутера;
- Процесс 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.
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
2. Обратный SSH-туннель: выставляем ресурсы в Интернет
Обратный 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-туннелю:
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
После создания туннеля необходимо указать адрес прокси сервера в настройках операционной. Подробно об этом можете прочесть в статье "Как настроить параметры прокси в 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 на клиенте и сервере.
Затем необходимо настроить 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-сетей. Благодаря простоте и быстроте настройки они идеально подходят для проброса портов, получения удаленного доступа или траблшутинга.