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

Первое (и очевидное), на клиенте и сервере должен быть установлен пакет OpenSSH. Кстати, возможность создавать полноценные туннели появилась с версии 4.3, так что если у вас совсем старенький сервер, и вы не заботитесь о безопасности, придется-таки обновляться.
Обычно, в современных дистрибутивах Linux, OpenSSH установлен сразу же, из коробки. Он же de facto используется для удаленного администрирования. Вот почему VPN через SSH, в нашем случае, крайне удобен. Не требуется никакого дополнительного ПО.
Второе что нужно сделать, как вы наверняка догадались, ознакомившись со схемой, включить поддержку tun устройств в ядре Linux. На Debian обычно пересборка ядра не требуется, поскольку в нем из коробки включено все, что только нужно и не нужно. Для Gentoo, и некоторых других «строгих» дистрибутивов, драйвер можно найти по следующему пути (menuconfig):
Device drivers ---> [*] Network device support ---> [*] Universal TUN/TAP device driver support
Поскольку, туннель «поднимается» со стороны клиента и требует привилегий рута на обеих сторонах, удобно организовать авторизацию с помощью ключей. Кстати, клиент может находиться за NAT и не иметь внешнего IP адреса. Итак, генерируем пару ключей на клиенте – private и public.
R2# ssh-keygen
После чего будет запрошен путь, по которому сохранять ключи (по умолчанию ~/.ssh/id_rsa). Идем в эту папку, находим в ней id_rsa.pub и копируем его содержимое на R1, в файл /root/.ssh/authorized_keys. Вот и всё, авторизация по ключам готова. Могут потребоваться изменения sshd.conf, но обычно всё работает с конфигами по умолчанию.
Принципиальная схема работы авторизации по ключу:

Переходим к главному – поднимаем туннель:
R2# ssh -S /var/run/ssh-vpn -M -f -w 0:0 1.1.1.1 -N
Разберем эту команду. Ключ S создает по указанному пути специальный файл-сокет. Он нам нужен еще и для другой цели. По его присутствию можно сделать вывод о состоянии нашего туннеля. Если файл отсутствует, значит, по каким-то причинам, наше соединение разорвалось.
-M, применяется вместе с ключом S, создает «мастер» подключение. Используется в нашем случае для принудительного разрыва соединения. Вообще, это мультиплексирование ssh соединения. Если интересно, почитайте об этом отдельно.
-f, переводит в фоновый режим.
-w, указывает какое tun устройство использовать на клиенте:сервере, здесь tun0 и на клиенте и на сервере. Можно указать any, то есть занять/создать первое свободное tun устройство. Но тогда мы лишимся возможности конфигурировать, поскольку не будем знать какое именно.
Далее следует адрес машины R1, с которой устанавливаем туннель.
В конце, можно передать команду, вместо ключа -N, она будет отправлена серверу, после установления соединения. Например, для конфигурирования интерфейса tun0 и маршрутизации. Однако, устройства можно (и нужно) поднять заранее. Иначе, каждый раз после разрыва, tun0 будет удаляться, вместе с записями из таблицы маршрутизации. Что совсем неудобно.
R1# ip tuntap add name tun0 mode tun
R1# ifconfig tun0 10.10.10.1/30
R1# route add –net 192.168.2.0/24 dev tun0
R2# ip tuntap add name tun0 mode tun
R2# ifconfig tun0 10.10.10.2/30
R2# route add –net 192.168.1.0/24 dev tun0
Теперь, команда на отключение. Вот тут как раз нам пригодится и файл-сокет и контроль соединения через него. Напоминаю, мы перевели процесс в background. Без ключа S и M закрыть сессию было бы проблематично.
R2# ssh -S /var/run/ssh-vpn -O exit 1.1.1.1
Удачи в администрировании!
F.A.Q.
Q: Почему не использовать встроенные средства ядра, например IP-IP tunnel?
A: Данный вид во-первых не поддерживает шифрования, во-вторых требует внешних IP адресов с обеих сторон. Что не всегда соответствует требованиям.
Q: Почему не использовать pptpd или OpenVPN?
A: Эти пакеты нужно устанавливать и настраивать отдельно. OpenSSH, как правило, уже установлен и готов к организации туннеля. Обратите внимание, что наш туннель (так называемая сигнатура), кроме всего прочего, ничем не отличается от обыкновенного администрирования через терминал.
Q: Безопасно ли делать авторизацию по ключам?
A: Безусловно. Более того, я бы рекомендовал вовсе отказаться от классической, с логином и паролем. Отключить ее в настройках сервера. Таким образом, мы на 100% исключим возможность подбора пароля через брутфорс.
root4root aka admin
Добавить комментарий
X