OpenVPN это мощнейший программный комплекс с открытым исходным кодом для создания VPN-сетей любой сложности. Он завоевал огромную популярность и на данный момент поддерживает все платформы. Отвечает всем стандартам безопасности, надежности и гибкости. Единственный минус, требования установки программного обеспечения на стороне клиента, но плюсы перекрываю все минусы.
Возможности OpenVPN:
- Предустановленный ключ — самый простой метод аутентификации.
- Сертификатная аутентификация — наиболее гибкий в настройках метод.
- С помощью логина и пароля — может использоваться без создания клиентского сертификата (серверный сертификат всё равно нужен).
- Сжатия трафика с помощью lzo.
- Использование на выбор TCP/UDP протокола.
- Использование IP tunneling/Ethernet tunnel.
Для установки выполним команду :
apt-get install openvpn
Основной способ аутентификации это конечно сертификат, с этого мы и начнем для начала.
Нам потребуется:
- Сертификат сервера, ключ сервера(секретный).
- Сертификат клиента, ключ клиента(секретный).
- Ключ Диффи Хельман для TLS сессии.
- Сертификат CA (Создадим центр сертификации для подписки сертификата сервера и клиента,данный способ удобен для управления сертификатами).
- Ключ CA (очень секретный).
- Последний ключ для TLS-аутентификации(подпись HMAC).
Не пугайтесь сразу, если вы не очень сильны в сертификатах за вас все придумали. В состав OpenVPN входит набор скриптов для генерации сертификатов easy-rsa расположенный в /usr/share/easy-rsa/ . Мы создадим папку и перенесем для удобства easy-rsa в /etc/openvpn/easy-rsa.
mkdir /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa
Далее нам надо настроить переменный скрипта для генерации сертификатов. Откроем и отредактируем файл /etc/openvpn/easy-rsa/vars :
export KEY_SIZE=2048 #Размер ключа. export CA_EXPIRE=3650 #Время действия сертификата CA,дней. export KEY_EXPIRE=3650 #Время действия сертификата, дней. export KEY_COUNTRY="US" #Страна export KEY_PROVINCE="CA" #Используется только в США export KEY_CITY="SanFrancisco" #Город export KEY_ORG="Fort-Funston" #Организация export KEY_EMAIL="me@myhost.mydomain" #Почта сервера. export KEY_OU="MyOrganizationalUnit" #Мое Подразделение.
export KEY менять не обязательно, в процессе генерации сертификатов и ключей вы можете вести данные вручную. Запускаем оболочку скрипта и генерируем CA сертификат:
cd /etc/openvpn/easy-rsa/
source vars
./clean-all # Очистит все сертификаты в папке /etc/openvpn/keys.
./build-ca
Создадим теперь сертификат и ключ сервера :
./build-key-server server
Заполняем поля, на вопросы A challenge password []: , An optional company name []: отвечаем N. Подписываем сертификат Sign the certificate? [y/n] отвечаем y.
Далее мы генерируем Ключ Диффи Хельман (DH), это может занять некоторое время, не волнуемся:
./build-dh
Ключ TLS-аутентификации :
openvpn —genkey —secret keys/ta.key
Последняя цель ключ и сертификат клиента. Это можно сделать как на сервере и передать клиенту ключ по ЗАЩИЩЕННОМУ каналу или с генерировать на клиентской машине и подписать центром сертификации сервера. Для простоты мы будем с генерируем все на сервере и передадим ключ и сертификат потом клиенту.
./build-key user # Если у вас много клиентов , по аналогии меняем имена user1,user2 и т.д.
Можно создать и защищенный паролем ключ клиента командой ./build-key-pass user.
Клиенту понадобятся следующие ключи:
- user.crt
- user.key
- ca.crt
- ta.key
Теперь перейдем к настройке файла конфигурации сервер OpenVPN. Пример конфига лежит в /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz, можем его скопировать в папку с openvpn или создать новый :
nano /etc/openvpn/server.conf
mode server port 1194 #Порт. proto udp #Протокол. dev tun #Тип соединения. ca ca.crt #Путь к сертификату. cert server.crt key server.key #Путь к ключу сервера. dh dh2048.pem #Путь к dh. server 10.0.0.1 255.255.255.0 ifconfig-pool-persist ipp.txt # файл, в котором будут храниться связи "профиль клиента, выделенный ip-адрес". keepalive 10 120 # устанавливаем количество секунд для ping и ping-restart соответственно. comp-lzo #Включаем компрессию трафика persist-key #при получении сигнала SIGUSR1 или срабатывания ping-restart не нужно перечитывать сертификаты, так как у сервера не хватит привелегий persist-tun # Тоже самое для туннеля. status openvpn-status.log log /var/log/openvpn.log verb 3 #Детализация логов 0-11. tls-auth ta.key 0 #tls авторизация cipher AES-256-CBC #официально рекомендованное шифрование или AES-128-CBC. auth SHA512 # По умолчанию используется SHA1 что уже не так безопасно. #client-to-client позволяет клиентам VPN-сервера связываться друг с другом. max-clients 5 # ограничение максимального числа одновременно подключенных клиентов #Понизить права vpn-сервера для большей безопасности user nobody group nogroup
Запускаем сервере и если все хорошо то появиться интерфейс tun0 :
root@debian:/# service openvpn start (restart)
Если возникли какие то проблемы смотрим журнал и разбираемся :
journalctl | grep ovpn-server
Теперь нам надо настроить клиента для подключения к серверу. Для примера я покажу настройку на Windows. Для начало качаем сам клиент с официального сайта(https://openvpn.net/). После установки нам придется сделать файл конфигурации который имеет вид *.ovpn и создать его можно в любом текстовом редакторе.
client.ovpn :
client proto udp port 1194 dev tun remote 192.168.0.1 #Адрес сервера OpenVPN. ca ca.crt cert client.crt key client.key tls-auth ta.key 1 auth SHA512 cipher AES-256-CBC comp-lzo
Возможно вам потребуется выход в интернет через VPN. Для этого на сервере нужно разрешить форвардинг :
Включаем форвардинг в ядре, в файле /etc/sysctl.conf раскомментируем строчку:
net.ipv4.ip_forward=1
Чтобы не перезагружаться сообщаем ядру о включении форвардинга:
echo 1 > /proc/sys/net/ipv4/conf/all/forwarding
Теперь нужно еще настроить iptables для прохождения пакетов NAT :
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
В файл конфигурации OpenVPN нужно добавить :
push "redirect-gateway" # при успешном подключении к серверу, клиенту будет установлен новый default-gateway от vpn-сервера. push "dhcp-option DNS 8.8.8.8" # передать адрес DNS сервера.
На этом основная настройка закончена. Приятного использования.