Настройка OpenVPN сервера

Материал из megapuper
Перейти к: навигация, поиск

Задача: настроить OpenVPN сервер с сертификатной аутентификацией. Сервер будет на FreeBSD 9.1

OpenVPN поддерживает несколько видов аутентификации.

  • Предустановленный ключ — самый простой вариант.
  • Аутентификация по сертификатам — наиболее гибкий в настройках метод.
  • Аутентификация по логину и паролю — клиентский сертификат при этом можно не использовать.


Использовать будем второй вариант, т.е. аутентификацию клиентов с помощью сертификатов, поскольку он является самым гибким из перечисленных. Погнали.

# cd /usr/ports/security/openvpn/
# make install

Всё необходимое поставлено, переходим к конфигурированию.


Создаём каталоги:

# mkdir -p /usr/local/etc/openvpn/easy-rsa
# mkdir -p /usr/local/etc/openvpn/keys/server


Копируем все скрипты:

# cp -r /usr/local/share/easy-rsa/ /usr/local/etc/openvpn/easy-rsa


Необходимо создать сертификаты и ключи. Заходим в /usr/local/etc/openvpn/easy-rsa/ и изменяем файл vars:

export EASY_RSA="`pwd`"
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"
export KEY_CONFIG=`$EASY_RSA/which openssl.cnf $EASY_RSA`
export KEY_DIR="/usr/local/etc/openvpn/keys/server"   # папка для ключей

echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR

# PKCS11 fixes
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"

export KEY_SIZE=1024   # длина ключа

export CA_EXPIRE=3650   # срок действия корневого сертификата
export KEY_EXPIRE=3650   # срок действия ключа

export KEY_COUNTRY="RU"
export KEY_PROVINCE="RU"
export KEY_CITY="Voronezh"
export KEY_ORG="Organization"
export KEY_EMAIL="email@email.com"
export KEY_CN=changeme
export KEY_NAME=changeme
export KEY_OU=changeme
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234


Внимание! Чтобы не отступать от мануала, следующие операции нужно проводить в консоли sh.

Загружаем переменные в оболочку:

# cd /usr/local/etc/openvpn/easy-rsa
# sh
# . ./vars


Очищаем от старых сертификатов и ключей папку keys/server и создаем серийный и индексные файлы для новых ключей:

# ./clean-all


Создаём самоподписанный корневой сертификат с секретным ключом, в процессе отвечаем на вопросы:

# ./build-ca

Generating a 1024 bit RSA private key
...++++++
.........++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [RU]:
Locality Name (eg, city) [Voronezh]:
Organization Name (eg, company) [Organization]:
Organizational Unit Name (eg, section) [changeme]:
Common Name (eg, your name or your server's hostname) [changeme]:
Name [changeme]:
Email Address [email@email.ru]:


Теперь создаём сертификат и секретный ключ для сервера:

# ./build-key-server server

Generating a 1024 bit RSA private key
.........................++++++
......++++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [RU]:
Locality Name (eg, city) [Voronezh]:
Organization Name (eg, company) [Organization]:
Organizational Unit Name (eg, section) [Organization]:
Common Name (eg, your name or your server's hostname) [server]:
Name [changeme]:server
Email Address [email@email.ru]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/local/etc/openvpn/easy-rsa/openssl-0.9.8.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'RU'
localityName          :PRINTABLE:'Voronezh'
organizationName      :PRINTABLE:'Organization'
organizationalUnitName:PRINTABLE:'Organization'
commonName            :PRINTABLE:'server'
name                  :PRINTABLE:'server'
emailAddress          :IA5STRING:'email@email.ru'
Certificate is to be certified until Apr 28 13:29:10 2023 GMT (3650 days)
Sign the certificate? [y/n]:y
 
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated


Создаём ключ и сертификат для клиента:

# ./build-key client01

Generating a 1024 bit RSA private key
........++++++
.......++++++
writing new private key to 'client01.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [RU]:
Locality Name (eg, city) [Voronezh]:
Organization Name (eg, company) [Megapuper]:
Organizational Unit Name (eg, section) [Megapuper]:
Common Name (eg, your name or your server's hostname) [client01]:
Name [changeme]:client01
Email Address [finn@megapuper.ru]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/local/etc/openvpn/easy-rsa/openssl-0.9.8.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'RU'
stateOrProvinceName   :PRINTABLE:'RU'
localityName          :PRINTABLE:'Voronezh'
organizationName      :PRINTABLE:'Organization'
organizationalUnitName:PRINTABLE:'Organization'
commonName            :PRINTABLE:'client01'
name                  :PRINTABLE:'client01'
emailAddress          :IA5STRING:'email@email.ru'
Certificate is to be certified until Apr 28 13:37:41 2023 GMT (3650 days)
Sign the certificate? [y/n]:y
CERTIFICATE WILL NOT BE CERTIFIED

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated


Генерим ключ Диффи-Хелмана. Алгоритм Диффи-Хелмана позволяет получить двум сторонам общий секретный ключ, использующийся для дальнейшего симметричного шифрования данных:

# ./build-dh

Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
............................................................++*++*++*


Теперь выходим из sh написав команду exit. И в конце создаем ключ для tls-аутентификации:

# openvpn --genkey --secret /usr/local/etc/openvpn/keys/server/tls.key


Создадим папку для индивидуальных настроек каждого клиента:

# mkdir -p /usr/local/etc/openvpn/ccd


Переходим к конфигам.

# touch /usr/local/etc/openvpn/openvpn.conf
# ee /usr/local/etc/openvpn/openvpn.conf

port 1194 # порт на котором сервер будет принимать соединения
local X.X.X.X # адрес, на котором будет висеть openvpn сервер
proto tcp-server # протокол, можно поставить tcp или udp. Вопрос что выбрать, не однозначный и зависит от конкретных условий. Протокол udp работает побыстрей, но не всегда применим.
dev tun0 # устройство туннеля
server 10.10.10.0 255.255.255.0 # виртуальная сеть, которая будет установлена между клиентом и сервером
  
# Ключи и сертификаты
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh1024.pem
tls-auth keys/tls.key 0 # на стороне сервера 0, на стороне клиента 1

cipher AES-256-CBC # алгоритм шифрования, в данном случае 256-битный AES
user nobody # пользователь от которого будет работать OpenVPN сервер 
group nobody # группа
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3 # уровень логирования 
mute 20 # не выводить повторять сообщение после 20 повторов
max-clients 30 # максимальное количество клиентов
keepalive 10 120 # каждые 10 секунд слать пинг, по истечении таймаута 120 секунд, перезапустить туннель
client-config-dir /usr/local/etc/openvpn/ccd # директория для индивидуальных настроек каждого клиента
tls-server # явное указание, что данный хост является TLS сервером
comp-lzo # сжатие трафика
persist-key # не трогать tun устройство при перезапуске openvpn сервера
persist-tun # не перечитывать файлы ключей при перезапуске туннеля
push "redirect-gateway def1" # протолкнуть клиенту новый шлюз по умолчанию
push "dhcp-option DNS 8.8.8.8" # назначить для клиента DNS сервер, в данном случае публичный DNS от гугла


Запускаем сервер:

# ee /etc/rc.conf
openvpn_enable="YES"
# /usr/local/etc/rc.d/openvpn start
Starting openvpn.
# ifconfig
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
       options=80000<LINKSTATE>
       inet 10.10.10.1 --> 10.10.10.2 netmask 0xffffffff 
       nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
     Opened by PID 15702


Если не запустилось, смотрим логи, всё станет ясно.


Настраиваем конфиг клиента(для Windows).

client
remote X.X.X.X 1194 # адрес и порт OpenVPN сервера
proto tcp # протокол, должен совпадать с сервером
dev tun0 # устройство
# Сертификаты и ключи
ca ca.crt
dh dh1024.pem
cert client01.crt
key client01.key
tls-auth tls.key 1

cipher AES-256-CBC # алгоритм шифрования, должен совпадать с серверным
verb 3
mute 20
keepalive 10 120
comp-lzo
persist-key
persist-tun
resolv-retry infinite
nobind


Сохраняем его client01.ovpn и отдаём клиенту. Устанавливаем на винде openvpn-клиент.
Клиентские ключи и конфиг client01.ovpn нужно скинуть на машину-клиента и скопировать в папку ..\OpenVPN\config\client01
Далее запускаем OpenVPN GUI. Соединение берет имя файла конфигурации клиента, в нашем случае это client01.ovpn