Настройка OpenVPN сервера на Linux.

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 сервера.

На этом основная настройка закончена. Приятного использования.