Настройка OpenVPN сервера
Задача: настроить 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
Выставляем права
# chmod +x *
Правим конфиг с переменными /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/whichopensslcnf $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 # протокол, можно поставить 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