Настройка OpenVPN в Ubuntu
OpenVPN - открытая реализация одной из технологий VPN, предназначенная для организации защищенных виртуальных частных сетей между территориально удаленным локальными сетями, а также отдельными клиентами. Безопасность туннелей обеспечивается шифрованием с помощью OpenSSL.
Как работает OpenVPN?
По окончании настройки сервера и его запуске, он перейдет в режим готовности приема и перенаправления внешних защищенных SSL-соединений на виртуальный сетевой адаптер (tun/tap).
По желанию, маршрутизация сервера может быть настроена таким образом, чтобы Интернет-трафик клиентов проходил через сервер и становился трафиком сервера. В этом случае OpenVPN будет выполнять проксирование трафика (proxy).
Что требуется от операционной системы?
Перед установкой OpenVPN необходимо убедиться в корректности базовых параметров.
1. У сервера есть хотя бы один “белый” статичный IP-адрес. Т.е. сервер должен быть доступен из сети Интернет. Если адрес динамический, но сервер все же остается быть доступным из глобальной сети - воспользуйтесь услугами DynDNS.
2. Разрешена загрузка и установка пакетов из официальных репозиториев. Для проверки выполните cat /etc/apt/sources.list. Строки с указаниями репозиториев должны быть раскомментированы (не должно быть символа “#” решетка в начале строки).
3. Должны быть верно указаны параметры сети - hostname, параметры DNS-серверов.
Для обеспечения должного уровня безопасности, рекомендуем ознакомиться с нашими рекомендациями.
Приступаем к установке.
Все действия по установке будем выполнять от пользователя root.
1. Обновляем информацию о репозиториях:
apt-get update
2. Устанавливаем текущие обновления системы и установленных программ:
apt-get upgrade
3. Устанавливаем OpenVPN:
apt-get install openvpn
Важно. В базовых репозиториях, зачастую отсутствует новейшая версия пакета. Разработчики OpenVPN ведут собственный репозиторий, о том как его настроить можно ознакомиться на официальном сайте.
4. Аналогичным образом устанавливаем пакет easy-rsa:
apt-get install easy-rsa
Действия после установки.
Размещаем скрипты easy-rsa:
cd /etc/openvpn/ && make-cadir easy-rsa
Подготавливаем публичные ключи (PKI - Public Key Infrastructure):
1. Переходим в директорию /etc/openvpn/easy-rsa:
cd /etc/openvpn/easy-rsa
2. Создаем символьную ссылку на файл конфигурации openssl:
ln -s openssl-1.0.0.cnf openssl.cnf
3. Инициализируем скрипт vars:
source ./vars
Система сообщит: NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
4. Выполняем
./clean-all
5. Для создания центра сертификации выполняем скрипт:
./build-ca
В ходе своей работы, программа задаст несколько вопросов. Отвечать на них следует латиницей. Если вы не заполните какое-либо поле, программа подставит значения по умолчанию, обычно указанные в скобках.
Создаем ключ сервера.
Для создания ключа сервера выполним команду:
./build-key-server server
Следует обратить внимание, что процесс похож на генерацию сертификата центра сертификации, однако, перед подписанием сертификата программа задаст 2 уточняющих вопроса. Если все указано верно, отвечаем “y”.
Генерация клиентских ключей.
Аналогично генерации серверных ключей создаются и клиентские:
./build-key client1
Следует обратить внимание, что созданный client1.key не имеет парольной или криптографической защиты. Это может привести к тому, что любой пользователь завладевший файлом может попробовать подключиться к серверу. Если такая угроза существует, лучше генерировать ключи другим скриптом:
./build-key-pass client2
Скрипт запросит парольную фразу в самом начале. Далее процесс ничем не отличается от генерации ключей сервера и простого клиента.
Следует помнить, что имена ключей должны быть уникальными. Один пользователь - один ключ с уникальным именем.
Бывает так, что в процессе работы сервера, по прошествии некоторого времени, необходимо создать еще один или несколько сертификатов. Для этого потребуется повторно инициализировать скрипт vars и только потом запустить процесс генерации ключа:
cd /etc/openvpn/easy-rsa
source ./vars
./build-key client3
Генерация ключа Диффи-Хеллмана
Благодаря протоколу Диффи-Хеллмана, две и более стороны могут получить один секретный ключ, который позволит выстроить защищенный канал связи. Генерируются ключи командой:
./build-dh
Результат будет примерно таким.
По окончании работы программы, в директории /etc/openvpn/easy-rsa/keys/ появится файл dh2048.pem
Перемещение сертификатов и ключей
Сервер
Ключи и сертификаты созданы. Настало время раздать их пользователям, а серверные ключи скопировать в соответствующие каталоги на сервере.
1. Переходим в каталог с ключами:
cd /etc/openvpn/easy-rsa/keys
2. Копируем только необходимые серверу файлы:
cp ca.crt ca.key dh2048.pem server.crt server.key /etc/openvpn
Важно понимать, что перечисленные выше файлы являются основой работы и безопасности VPN сервера. Утеря или подмена этих файлов может иметь крайне негативные последствия. Важно хранить их в надежном месте и не передавать по открытым каналам связи.
Клиенты
Клиенту понадобится всего 3 файла ca.crt, client1.crt, client1.key. Каждому клиенту необходимо отдавать только его ключи. Данные файлы можно разместить в директории /etc/openvpn на машине клиента, если она под управлением Linux-подобной ОС.
В ОС Windows их следует разместить в пользовательский каталог.
Настройка сервера и клиента
Сервер
Большинство устанавливаемых программ в ОС Linux имеют так называемые sample-файлы. Эти файлы содержат примеры настройки и объяснения их. OpenVPN не стал исключением. Распакуем серверный конфигурационный файл в директорию /etc/openvpn:
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
С полученным файлом сервер уже готов к работе. Он сконфигурирован с возможностью туннелирования, однако не имеет возможности к проксированию, т.е. отправки клиентского трафика от своего имени. Исправим это.
Для начала, проверяем какие файлы оказались в директории /etc/openvpn:
ls /etc/openvpn
Открываем файл конфигурации:
nano /etc/openvpn/server.conf
И проверяем соответствие файлов прописанных в конфигурации с файлами находящимися в каталоге. Интересны строки после “SSL/TLS root certificate (ca), certificate (cert), and private key (key).”
Если имена отличаются от существующих, следует внести необходимые исправления. Выходим из редактора сочетанием клавиш Ctrl + X.
Запускаем сервер:
/etc/init.d/openvpn start
Проверим результат запуска:
/etc/init.d/openvpn status
Настройки клиента.
Предполагается, что на стороне клиента уже установлен пакет OpenVPN.
1. Копируем файл клиентских настроек в домашний каталог пользователя:
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /root
2. Копируем сгенерированные ключи - client1.key, client1.crt, ca.crt:
cd /etc/openvpn/easy-rsa/keys
cp client1.key client1.crt ca.crt /root
3. Редактируем файл конфигурации клиента:
nano /root/client.conf
4. Находим закомментированные строки “# The hostname/IP and port of the server”. Для параметра remote меняем my-server-1 на IP-адрес сервера или его доменное имя.
5. В том же файле, ниже, находим блок “#SSL/TLS parms.”. Редактируем имена ключей.
6. Выходим из редактирования сочетанием Ctrl + X. На вопрос о сохранении изменений отвечаем “Y”. Имя файла оставляем неизменным.
7. Переносим файлы client1.key, client1.crt, ca.crt и client.conf на компьютер клиента с которого будет происходить подключение к серверу OpenVPN.
Важно! Некоторые клиентские реализации OpenVPN работают только с файлами *.ovpn. В подобных случаях достаточно изменить расширение файл (переименовать) с client.conf на client.ovpn.
8. Подключаемся к серверу командой:
openvpn openvpn.conf
Следует обратить внимание, что проксирование до сих пор не настроено. При этом, когда клиентская машина подключена к OpenVPN-серверу, доступ в Интернет прекращается. Связано это с тем, что созданный адаптер TUN, а в месте с ним и сам сервер, являются шлюзом по умолчанию.
Настройка маршрутизации.
1. На сервере редактируем файл server.conf:
nano /etc/openvpn/server.conf
2. В файле находим следующую строку и удаляем перед ней символ “;”, таким образом раскомментируем ее:
push "redirect-gateway def1 bypass-dhcp"
3. Сохраняем и закрываем редактор.
4. Редактируем файл /etc/sysctl:
nano /etc/sysctl.conf
5. В конец файла добавляем следующую строку:
net.ipv4.ip_forward=1
Это разрешит системе пересылать трафик между интерфейсами, но изменения вступят в силу только после перезагрузки. Сохраняем файл и закрываем редактор.
6. Разрешаем форвардинг пакетов без перезагрузки сервера:
echo 1 > /proc/sys/net/ipv4/ip_forward
7. Настроим NAT в iptables. Поочередно вводим команды:
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A INPUT -i tap+ -j ACCEPT
iptables -A FORWARD -i tap+ -j ACCEPT
Также их можно просто вписать в файл /etc/rc.local до строки “exit 0” или выполнить настройку firewall как это указано в нашей статье.
Сервер уже готов к использованию. Однако, задача проксировать весь трафик, а следовательно необходимо настроить форвардинг DNS-запросов. Настроим.
1. Устанавливаем dnsmasq
Если установка выполняется в ОС Ubuntu:
apt-get install dnsmasq
Несмотря на то, что в большинстве современных версий ОС Ubuntu dnsmasq уже предустановлен, в старых версиях необходимо выполнить так:
apt-get install dnsmasq && dpkg-reconfigure resolvconf
Возможно запустится диалоговое окно мастера установки. В нем будет 2 вопроса. В первом случае, на вопрос “prepare /etc/resolv.conf for dynamic updates” отвечаем “Yes”, а на следующий - “Append original file to dynamic file?” отвечаем “No”.
Для ОС Debian 7:
apt-get install dnsmasq resolvconf
2. Отредактируем файл настроек dnsmasq:
nano /etc/dnsmasq.conf
Добавим следующие параметры:
listen-address=10.8.0.1
bind-interfaces
Сохраняем файл и закрываем редактор.
3. Редактируем файл сетевых настроек:
nano /etc/network/interfaces
Требуется указать адрес DNS-серверов в соответствующих секциях настроек адаптера:
dns-nameservers 8.8.8.8 8.8.4.4
Возможно это действие уже произведено,. Повторно его выполнять не нужно.
4. Учитывая особенность запуска и последующей работы dnsmasq - возможность аварийного завершения до инициализации виртуального tun-адаптера, добавим следующую строчку в файл rc.local, перед “exit 0”:
/etc/init.d/dnsmasq restart
5. Теперь разрешим клиентам OpenVPN-сервера использовать DNS. С помощью редактора nano раскомментируем строку:
push "dhcp-option DNS 10.8.0.1"
Фиксируем изменения в файле.
6. Перезагружаем сервер:
reboot
Проверка работы
Выполняем повторное подключение к серверу. Пробуем открыть сайт для проверки IP-адреса. В результате должен быть IP-адрес сервера.