Linux. Строим туннель (VPN), с помощью OpenSSH

Не все знают, что с помощью обычного 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% исключим возможность подбора пароля через брутфорс.

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