LXF158:Применим VPN
|
|
|
Применим VPN
Спокойно открывайте свою локальную сеть с Virtual Private Network
Хотите дать доступ к вашей сети законным пользователям, отогнав интернетовский сброд? Нейл Ботвик учит это делать с OpenVPN.
› Создавайте сертификаты для сервера и клиентов, используя скрипты сборки, предоставленные OpenVPN.
Среди пользователей Linux популярны вопросы типа «Я хочу сделать службу XYZ доступны через Интернет, но только для авторизованных пользователей. Как это сделать безопасно?», где XYZ может быть VNC, NFS, Samba или локальный web-сервер. Ответ зависит от конкретного сервиса, который вы намерены предлагать, и от методов, предусмотренных сервисом для аутентификации и безопасности. Одни лучше, другие хуже, но это все равно потенциально означает вашу обязанность заботиться о нескольких сервисах, обеспечивая безопасность всех. С вашей локальной сетью таких проблем нет, потому что у вас только зарегистрированные пользователи – разве что в ваши компьютеры может забраться кто попало.
Альтернатива оголению отдельных частей сети для доступа из Интернета – разрешить авторизованным пользователям подсоединяться к сети извне так, как если бы они были подключены к локальной сети напрямую. Virtual Private Network (VPN) как раз и устанавливает безопасный, зашифрованный туннель между компьютером и сетью. Хотя тоннель проходит через публичное интернет-соединение, весь трафик между вашим компьютером и сетью остается внутри туннеля, зашифрованный и защищенный.
Есть несколько различных реализаций VPN, но мы здесь воспользуемся OpenVPN. Это, как следует из названия, полностью открытая система, и она использует для соединения солидный OpenSSL. Прежде всего настройте маршрутизатор на проброс порта 1194 на компьютер, предназначенный на роль сервера OpenVPN в вашей локальной сети, иначе подключиться вы не сможете. В простейшем случае, можно подключить компьютер к сети, выполнив первую команду на компьютере в сети (сервере OpenVPN), а вторую команду – на удаленном компьютере, откуда вы хотите подключаться к сети (клиенте):
sudo openvpn --remote адрес_клиента --dev tun 1 --ifconfig 10.0.1.1 10.0.1.2
sudo openvpn --remote адрес_сервера --dev tun 1 --ifconfig 10.0.1.2 10.0.1.1
Опция --remote дает имя или IP-адрес компьютера, к которому подключаются, а два адреса, выданных --ifconfig, выделяются на локальном и удаленных компьютерах, соответственно – именно поэтому во второй команде они идут в обратном порядке. Эти адреса должны лежать в одном из зарезервированных частных диапазонов, но в другой подсети вашей локальной сети, не то произойдут всякие ужасы. VPN – это отдельная сеть, а сервер служит шлюзом между ней и вашей локальной сетью. Если на любом из компьютеров вы получите с tun ошибку «устройство неизвестно», загрузите модуль tun командой
sudo modprobe tun
Хотя это и сработает, поскольку создаст подключение к одному из компьютеров сети, удобства тут мало, так как нужно, чтобы кто-то выполнил эту команду на каждом конце соединения, и должны быть заранее известны IP-адреса, а это не сильно вам поможет при подключении с помощью 3G-модема или открытого Wi-Fi во всяких местах общепита.
Наш ответ
Решение – постоянная (или, по крайней мере, в то время, когда он вероятнее всего будет необходим) работа сервера в вашей локальной сети, чтобы обеспечить соединение с любого IP-адреса и использовать сертификаты для аутентификации всех компьютеров, которые пытаются подключиться. Большинство настроек выполняется на сервере, в терминале, от имени суперпользователя-root (пользователям Ubuntu надо будет все команды предварять sudo). Ваша установка OpenVPN должна содержать скрипты для этого в /usr/share/openvpn/easy-rsa. Нам надо их отредактировать, так что скопируйте каталог easy-rsa в /etc/openvpn, чтобы пресечь порчу ваших настроек каким-нибудь обновлением. Отредактируйте файл vars, задав в нем переменные KEY_* – ни одной не оставляйте пустой. Следующий шаг – создание мастер-сертификата удостоверяющего центра (Certificate Authority, CA) при посредстве
source ./vars/
./clean-all
./build-ca
Вам зададут несколько вопросов, но будет нормально просто нажать Enter в ответ на каждый, поскольку ответы уже указаны в файле vars. В каталоге ключей keys создастся сертификат, используемый для подписи всех серверных и клиентских сертификатов, которые мы собираемся создать. Изготовим сертификат сервера командой
./build-key-server имя_сервера
Как и прежде, примите значения по умолчанию, но задайте Common Name [общее имя] как имя сервера, а затем ответьте y на вопрос, хотите ли вы подписать и применить сертификат. Теперь запустите эту команду для каждого клиента, которому вы хотите предоставить подключение, используя одно и то же имя клиента в командной строке и в ответе на вопрос про Common Name:
./build-key имя_клиента
Этот скрипт создает ключ, разрешающий подключение к VPN, так что любой, кто имеет доступ к компьютеру, сможет его получить. Если это ноутбук, и у вас нет других форм защиты от вора, используйте build-key-pass вместо build-key для создания ключа, прикрытого паролем.
Надо будет построить еще один файл, командой
./build-dh
Скопируйте файл ca.crt и файлы .crt and .key этого компьютера в каталог /etc/openvpn каждого компьютера. На сервере также необходимо скопировать файлы ca.key и dh1024.pem, созданные командой build-dh. Сделайте это безопасно, с помощью cменного носителя либо SSH – не посылайте их по электронной почте, поскольку с этими файлами к вашей сети сможет подключиться любой. Задайте разрешения на секретный файл .key file как rw-------. Не забудьте, что копирование их на USB-брелок с форматом FAT установит их в гораздо более либеральные, что неприемлемо.
И серверу, и клиенту нужен файл конфигурации в /etc/openvpn. Файлы-примеры, обычно помещаемые в /usr/share/doc/openvpn/examples/sample-config-files, будут лучшей отправной точкой. Скопируйте файл client.conf в /etc/openvpn/ openvpn.conf и отредактируйте его на сервере. Большинство строк файла являются комментариями, и настройки по умолчанию хороши, но убедитесь, что параметры ca, cert, key и dh соответствуют созданным вами файлам, желательно с указанием полного пути.
Скопируйте файл client.conf в /etc/openvpn/openvpn.conf на клиент и отредактируйте его. Измените строку remite, чтобы она указывала на IP-адрес (или имя) вашего сервера и открытый на нем порт (по умолчанию, 1194). Вы можете иметь и не одну такую строку – в этом случае они будут опрашиваться по очереди, пока не установится соединение.
remote gateway.example.com 1194
remote 123.124.125.126 1194
Используйте публичный IP-адрес вашего интернет-соединения. Если ваш шлюз находится за маршрутизатором, пробросьте порт 1194 на сервер OpenVPN в настройках маршрутизатора. Измените строки cert и key, чтобы они содержали имена сертификата клиента и файлы ключей. Если вы меняли параметры по умолчанию в настройках сервера, убедитесь, что все настройки здесь им соответствуют. Теперь вы увидите, как все это работает, запустив
/etc/init.d/openvpn start
на сервере, а затем на клиенте. Запуск ifconfig на каждом компьютере должен показать интерфейс tun с адресом в диапазоне 10.8.0.* (если вы не меняли этого в настройках), и вы должны быть в состоянии пинговать между ними. Убедившись, что это работает, вы можете воспользоваться услугами менеджера сервисов вашего дистрибутива, чтобы настроить автоматический запуск OpenVPN при загрузке.
Добраться до всей сети
Пока что мы соединили два компьютера, но мы хотим, чтобы клиент мог получить доступ к всей локальной сети, а не только к серверу. OpenVPN изменил таблицу маршрутизации на клиенте, пропустив весь трафик сети 10.8.0.0 через VPN. Чтобы сервер направлял трафик для локальной сети правильным получателям, добавьте в его файл настройки
push “route 192.168.1.0 255.255.255.0”
используя соответствующий адрес и маску для локальной сети. Тогда не только установится маршрутизация на сервере, но сервер использует это для отправки правильных настроек маршрутизации на клиент при его подключении. Если вы скомандуете route -n после открытия VPN на клиенте, он покажет нечто вроде
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0
Это будет хорошо работать, если ваш сервер OpenVPN служит также и шлюзом для сети, то есть другие компьютеры в локальной сети будут посылать на него весь не-LAN трафик в любом случае. В противном случае у вас есть два варианта. Вы можете изменить таблицы маршрутизации у всех компьютеров в сети, к которым вы хотите иметь доступ через VPN, выполнив на них команду
route add -net 10.8.0.0 netmask 255.255.255.0 gw 192.168.1.1
или можно изменить настройки маршрутизатора, направив трафик в сети 10.8.0.0 через сервер – в данном примере, 192.168.1.1. Некоторые маршрутизаторы, особенно те, что работают на ОС DD-WRT или OpenWrt, поддерживают OpenVPN напрямую. Если у вас есть такой маршрутизатор, переложите задачу на него, с помощью web-интерфейса.
Детали различаются в зависимости от прошивки маршрутизатора, но в основном это вставка содержимого вашего сертификата, ключа и файлов конфигурации в текстовые поля web-интерфейса маршрутизатора. |