VPN расшифровывается как Virtual Private Network, а по русски виртуальная частная сеть. Так что если вам надо соединить два удаленных офиса в одну локальную сеть, то технология VPN как раз решает эту проблему. В данной статье инструментом решения поставленной задачи будет свободная программа OpenVPN.
У меня была задача подключить пару удаленных клиентов на машинах с ОС windows к локальной сети предприятия. На пограничном интернет сервере стоит ОС linux, куда мы и будем устанавливать OpenVPN сервер. Имя сервера N213 – при создании сертификатов это важно!
На рисунке ниже структура сети.
Требования к OpenVPN
Перед установкой убедитесь что ядро вашего сервера имеет поддержку tun/tap устройств. Для стандартных ядер дистрибутивов эта поддержка есть в виде модулей, поэтому можно уже подгрузить модуль
#modprobe tun
И в дальнейшем включить tun модуль в автозагрузку при старте системы.
Для тех, кто собирает ядро сам в состав ядра должен быть включен модуль TUN/TAP device driver support в разделе Device Drivers/Network Device Support Universal
Также OpenVPN требует установленный пакет openssl для сертификатов и пакет lzo для сжатия трафика.
Скачать исходники или готовый пакет OpenVPN можно с официального сайта.
Возможно вам захочется попробовать платную версию OpenVPN Access Server с управлением через web. Там же на сайте есть готовые пакеты для CentOS, Ubuntu, Redhat, Fedora, а для 2 клиентов можно использовать в тестовом режиме бесплатно.
Генерируем сертификаты сервера и клиентов
Важно знать, что раньше до версий openvpn-2.3. генерация ключей и сертификатов отличалась.
Под спойлером показано создание сертификатов и ключей для версий до 2.3.xx.
Начиная с версий openvpn-2.3.xx скрипты easy-rsa уже не входит в комплект установки, их надо качать отдельно здесь.
Скачанный архив распакуем в любую директорию в папке /etc/openvpn. Во вновь созданной папке найдем директорию где лежат файлы easyrsa, openssl-x.x.cnf, vars.example.
easyrsa – скрипт для создания сертификатов и ключей
openssl-x.x.cnf – конфиг программы openssl, откуда скрипт будет брать заданные в конфиге переменные для создания сертификатов
vars.example – пример конфига самых основных переменных. По желанию этот файл можно переименовать в vars и изменить в нем общие переменные. Я бы советовал создать файл vars, это избавит вас от лишних вопросов во время создания сертификатов, также тут можно выставить время действия сертификатов.
Ну а теперь от слов к делу. От суперпользователя или через sudo выполняем команды генерации сертификата сервера. Первая команда подготавливает директории для новых сертификатов, а вторая команда уже генерирует сам корневой сертификат для сервера.
Важно! Во время генерации корневого сертификата надо будет задать парольную фразу. Обязательно ее запомните, т.к. эта фраза понадобится при создании сертификатов клиентов.
./easyrsa init-pki
./easyrsa build-ca
После успешной генерации корневого сертификата должен появиться файл ./pki/ca.crt.
Теперь готовим сертификат самого сервера. Я сертификат делаю с ключем nopass, чтобы сервер запускался без пароля. Кому нужна особая защита уберите ключ. Вместо SERVER подставляем имя нашего сервера openvpn. Команда спросит парольную фразу, которую мы придумали при создании сертификата CA.
./easyrsa build-server-full SERVER nopass
Получим сертификат и закрытый ключ сервера. В папке ./issued – сертификат, в папке ./private – ключ.
Далее по аналогии с сервером создаем ключи и сертификаты для клиентов. Которые появятся в тех же папках. Вместо слова CLIENT задаем понятное нам имя клиента. Я также делаю на клиентах без парольной авторизации.
./easyrsa build-client-full CLIENT nopass
Всё. С сертификатами покончено. Переходим к созданию вспомогательных ключей для установления соединения между клиентом и сервером openvpn.
Создаем ключ Диффи Хеллмана. Создание этого ключа достаточно ресурсоёмкое задание и на слабых машинах может длиться долго.
./easyrsa gen-dh
В итоге получаем файл ./pki/dh.pem
Мы будем настраивать сервер с tls аутентификацией, то создаем специальный ключ tlsa.key
# openvpn --genkey --secret /etc/openvpn/keys/tlsa.key
Небольшое отступление.. В файлах crt если их просматривать редактором можно заметить способ шифрования. Иногда бывает так, что ключи зашифрованы каким-нибудь методом, который не поддерживается уже или еще на том компьютере где вы собираетесь использовать этот сертификат. Так что будьте внимательны. Задать способ шифрования при создании сертификатов можно в файле vars переменной EASYRSA_DIGEST
Настраиваем конфигурацию сервера OpenVPN
Вся конфигурация о сервере по умолчанию хранится в файле /etc/openvpn/openvpn.conf
В результате разных тестирований у меня получился такой файл с комментариями для ясности
#какой протокол используем
proto udp
#номер порта, 1194 порт по умолчанию
port 1194
#имя интерфейса для OpenVpn
dev tun0
#при запуске входим в режим демона
daemon
#задаем виртуальную сеть интерфейса tun. Задавать произвольно,
#лучше если сеть не будет пересекаться с клиентами или вашими сетями
server 192.168.11.0 255.255.255.0
#маршруты для сервера, своя сеть tun и 2 маршрута чтобы видеть клиентов
route 192.168.11.0 255.255.255.252
route 192.168.15.0 255.255.255.0
route 192.168.21.0 255.255.255.0
#задаем ключи сервера, подставьте свои ключи по имени сервера OpenVPN
ca /etc/openvpn/easy-rsa/keys/ca.crt
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
cert /etc/openvpn/easy-rsa/keys/N213.crt
key /etc/openvpn/easy-rsa/keys/N213.key
#Клиенты OpenVPN могут общаться друг с другом
client-to-client
#директория для настройки конфигов клиентов OpenVPN
client-config-dir /etc/openvpn/ccd
#Задействуем TLS аутентификацию
tls-server
#ключ TLS, 0 для сервера, а 1 для клиента
tls-auth /etc/openvpn/easy-rsa/keys/tlsa.key 0
#задаем определенную аутентификация при установке соединения
#обязательно на клиентском конфиге выставляем такую же
auth SHA256
#определенный способ шифрования данных в канале vpn
#можно задавать или использовать по умолчанию
#но если задали, то у клиента задать такой же метод!
cipher AES-256-CBC
#не закрывать соединение через интерфейс при перезапуске демона OpenVPN при
#получении команды SIGUSR1 или по таймауту --ping-restart
persist-tun
#аналогично команде выше, только не перечитываем ключи
persist-key
#включаем сжатие трафика
comp-lzo
#Уровень детализации логов, для отладки можно выставить 6
verb 1
#основной лог сервера
log-append /var/log/openvpn.log
#лог, где можно посмотреть какие клиенты находятся в данный
#момент на сервере и их маршруты
status /var/log/openvpn-status.log
#если хотите запускать сервер от определенного пользователя или группы
#раскомментируйте эти параметры, а так запускается от root
#user nobody
#group nobody
#Вспомогательная опция, каждые 10 секунд проверяется канал с клиентом,
#и если в течение 120с, ответа нет, то считаем что канал отвалился
keepalive 10 120
#MTU значение для виртуального тоннеля
tun-mtu 1500
#Ограничение размера TCP пакетов в результате UDP пакет,
#который будет посылать OpenVPN будет не более чем 1450 байт.
mssfix 1450
Затем создаем дирректорию конфигов для клиентов – /etc/openvpn/ccd и создаем два файла по имени клиента, которое мы давали в сертификатах для клиентов. Пусть для определенности эти файлы называются client1 и client2.
В файл client1 заносим следующее:
#задаем ip клиенту 11.2, а шлюз 11.1, это если требуется,
#чтобы клиент получал всегда один и тот-же адрес.
ifconfig-push 192.168.11.2 192.168.11.1
#проталкиваем клиенту маршрут до нашей локальной сети
push "route 192.168.0.0 255.255.255.0"
#сами загружаем маршрут до локальной сети клиента (если она есть)
iroute 192.168.21.0 255.255.255.0
а в client2 аналогично специфике сети для этого клиента
ifconfig-push 192.168.11.6 192.168.11.5
push "route 192.168.0.0 255.255.255.0"
iroute 192.168.15.0 255.255.255.0
ip клиентов и их шлюзы выдаем из сети нашего tun интерфейса 192.168.11.0/30 (обратите внимание на маску сети).
Вот таблица ip и соответствующих шлюзов (таблицу можно получить командой openvpn –show-valid-subnets из-под windows клиента openvpn)
[ 1, 2] [ 5, 6] [ 9, 10] [ 13, 14] [ 17, 18]
[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]
Запуск сервера выполняем командой
#openvpn /path/to/openvpn.conf
или используя скрипты
#/etc/init.d/openvpn start
После запуска обязательно смотрим логи сервера – /var/log/openvpn.log. Критических ошибок быть не должно 🙂 Если что-то упустили, то по логам можно сразу понять чего не хватает в openvpn.conf. После любых изменений в файле сервера или в файлах клиентов требуется перезапуск OpenVPN.
Пишем правила для брандмауэра, чтобы могли соединиться с сервером.
OPENVPN_IFACE="tun0"
OPENVPN_PORT="1194"
#Открываем доступ к tun интерфейсу с любых источников
iptables -A INPUT -p udp -s 0/0 --destination-port $OPENVPN_PORT -j ACCEPT
#пропускаем все через tun интерфейс
iptables -A INPUT -i $OPENVPN_IFACE -j ACCEPT
iptables -A OUTPUT -o $OPENVPN_IFACE -j ACCEPT
#включаем forward пакетов
echo 1 > /proc/sys/net/ipv4/ip_forward
#разрешаем взаимодействие от сети интерфейса tun во все локальные сети
iptables -A FORWARD -p all -s 192.168.0.11/24 -d 192.168.0.0/16 -j ACCEPT
Настройка клиентов OpenVPN на удаленных компьютерах
У меня все клиенты используют ОС windows, поэтому буду писать применительно к этой ОС. Но подозреваю что конфиг для unix клиентов ничем принципиальным отличаться не будет.
1. Устанавливаем openvpn под windows. По умолчанию ставится в каталог “C:\Program Files\OpenVPN\” .
2. Создаем пустой каталог с названием “config” в папке OpenVpn.
3. В каталог config копируем файлы сертификатов для клиента и общие файлы аутентификации. Например для client1 потребуется скопировать следующие файлы:
- ca.crt
- tlsa.key
- client1.crt
- client1.key
4. В этом же каталоге “config” создаем текстовый файл с названием “openvpn.ovpn” такого содержания.
dev tun
proto udp
;ip нашего сервера OpenVPN
remote 217.15.19.18
port 1194
client
ca ca.crt
cert client1.crt
key client1.key
tls-client
tls-auth tlsa.key 1
remote-cert-tls server
;нижестоящие 2 строчки надо если сервер настроен на
;определенные методы шифрования. В документации описаны все методы.
auth sha256
cipher AES-256-CBC
;нижестоящую переменную можно использовать на openvpn до 2.3.
;ns-cert-type server
;отключаем в логах ошибки про повторяющиеся пакеты
mute-replay-warnings
comp-lzo
persist-key
persist-tun
verb 1
5. Запускаем графическую программу OpenVPN GUI. В трее появится иконка дополнительного сетевого подключения. Павой кнопкой мыши по иконке и “Connect”
Если все в порядке, то через некоторое время появится информация об успешном соединении с сервером.
Если что-то не соединяется, то включаем подробную детализацию логов на клиенте и сервере и читаем FAQ на сайте openvpn 🙂