OpenVPN Ubuntu Server

В данном примере собран стенд, в который входит основной офис, удаленный офис и удаленный клиент. Основной офис состоит из маршрутизатора gw1, за которым находится частная сеть 172.16.1.0/24. В этой сети есть контроллер домена dc1, и клиент cl1. Удаленный офис состоит из маршрутизатора gw2, за которым находится частная сеть 172.16.2.0/24. В этой сети расположен клиент cl2. Сеть 192.168.1.0/24 имитирует сеть интернет, которая объединяет два офиса и удаленного клиента remote client.

Задача состоит в том, чтобы связать офисы и удаленного клиента общей VPN сетью. gw1 и gw2 будут работать на Ubuntu server 16.04 LTS. Все клиенты работают под управлением Windows 10. Для реализации VPN соединения, будет использоваться OpenVPN. В качестве локального центра сертификации будет выступать EasyRSA.

 

Включение маршрутизации между интерфейсами. NAT и firewall.

Для gw1 и gw2 нужно включить возможность пересылки пакетов между сетевыми интерфейсами. Также настроить правило nat, для локальной сети и запретить все входящие подключения из сети интернет, кроме SSH и OpenVPN.

Включаем пересылку пакетов между сетевыми интерфейсами. В файле /etc/sysctl.conf нужно раскоментировать строку

net.ipv4.ip_forward=1

и выполнить команду

# sysctl -p
net.ipv4.ip_forward = 1

Включаем nat для внутренней сети (ens32 — интерфейс, смотрящий в сеть интернет)

# iptables -t nat -A POSTROUTING -o ens32 -j MASQUERADE

Разрешаем установленные ранее соединения, а так же трафик для SSH и OpenVPN

# iptables -A INPUT -i ens32 -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A INPUT -i ens32 -p tcp --dport ssh -j ACCEPT
# iptables -A INPUT -i ens32 -p udp --dport 1194 -j ACCEPT

последнее правило нужно добавить только на gw1. gw2 является клиентом.

Выставляем политику для входящих подключений в DROP

# iptables -P INPUT DROP
# ip6tables -P INPUT DROP

Сохраняем изменения при загрузке

# iptables-save > /etc/iptables.rules
# ip6tables-save > /etc/ip6tables.rules

# echo "pre-up iptables-restore < /etc/iptables.rules" >> /etc/network/interfaces
# echo "pre-up ip6tables-restore < /etc/ip6tables.rules" >> /etc/network/interfaces

 

Действия на gw1

Устанавливаем OpenVPN и EasyRSA

# apt install openvpn easy-rsa

Конфигурация локального центра сертификации

Создаем в домашнем каталоге папку со скриптами EasyRSA и перемещаемся в неё

# make-cadir ~/openvpn-ca
# cd ~/openvpn-ca

Отредактируем файл с переменными EasyRSA

# nano vars
. . .
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Msc"
export KEY_CITY="Moscow"
export KEY_ORG="4skill inc."
export KEY_EMAIL="support@4skill.ru"
export KEY_OU="IT Department"
. . .

Импортируем переменные в систему, и выполним скрипт очистки от старых сертификатов

# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/username/openvpn-ca/keys
# ./clean-all

Создаем сертификат корневого центра сертификации. Им будут подписываться все остальные сертификаты

# ./build-ca
Generating a 2048 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) [Msc]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [4skill inc.]:
Organizational Unit Name (eg, section) [IT Department]:
Common Name (eg, your name or your server's hostname) [4skill inc. CA]:
Name [EasyRSA]:
Email Address [support@4skill.ru]:

Создаем сертификат для сервера

# ./build-key-server server
Generating a 2048 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) [Msc]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [4skill inc.]:
Organizational Unit Name (eg, section) [IT Department]:
Common Name (eg, your name or your server's hostname) [server]:gw1
Name [EasyRSA]:
Email Address [support@4skill.ru]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /home/uid881/openvpn-ca/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'RU'
stateOrProvinceName :PRINTABLE:'Msc'
localityName :PRINTABLE:'Moscow'
organizationName :PRINTABLE:'4skill inc.'
organizationalUnitName:PRINTABLE:'IT Department'
commonName :PRINTABLE:'gw1'
name :PRINTABLE:'EasyRSA'
emailAddress :IA5STRING:'support@4skill.ru'
Certificate is to be certified until Nov 13 09:02:10 2026 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-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
..................+..................................++*++*

Создаем HMAC ключ

# openvpn --genkey --secret keys/ta.key

Для создания пользовательских сертификатов используются скрипты build-key и build-key-pass. Разница в том, что build-key-pass создает сертификат, защищенный паролем. То есть при запуске клиента, нужно будет вводить пароль, который указывался на этапе создания сертификата.

Создаем сертификат для gw2

# ./build-key gw2
Generating a 2048 bit RSA private key
...............................................+++
...........+++
writing new private key to 'gw2.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) [Msc]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [4skill inc.]:
Organizational Unit Name (eg, section) [IT Department]:
Common Name (eg, your name or your server's hostname) [gw2]:
Name [EasyRSA]:
Email Address [support@4skill.ru]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /home/uid881/openvpn-ca/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'RU'
stateOrProvinceName :PRINTABLE:'Msc'
localityName :PRINTABLE:'Moscow'
organizationName :PRINTABLE:'4skill inc.'
organizationalUnitName:PRINTABLE:'IT Department'
commonName :PRINTABLE:'gw2'
name :PRINTABLE:'EasyRSA'
emailAddress :IA5STRING:'support@4skill.ru'
Certificate is to be certified until Nov 13 09:25:24 2026 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

Создаем сертификат для remote client

# ./build-key remote-client
Generating a 2048 bit RSA private key
.........+++
...........................................+++
writing new private key to 'remote-client.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) [Msc]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [4skill inc.]:
Organizational Unit Name (eg, section) [IT Department]:
Common Name (eg, your name or your server's hostname) [remote-client]:
Name [EasyRSA]:
Email Address [support@4skill.ru]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /home/uid881/openvpn-ca/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'RU'
stateOrProvinceName :PRINTABLE:'Msc'
localityName :PRINTABLE:'Moscow'
organizationName :PRINTABLE:'4skill inc.'
organizationalUnitName:PRINTABLE:'IT Department'
commonName :PRINTABLE:'remote-client'
name :PRINTABLE:'EasyRSA'
emailAddress :IA5STRING:'support@4skill.ru'
Certificate is to be certified until Nov 13 09:26:48 2026 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

Создаем в домашнем каталоге папку для генерации и хранения клиентских конфигурационных файлов и выставляем на неё права

# mkdir -p ~/client-configs/files
# chmod 700 ~/client-configs/files

Скопируем шаблон для клиентских конфигурационных файлов

# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

Отредактируем шаблон

# nano ~/client-configs/base.conf
. . .

Указываем адрес сервера OpenVPN

remote 192.168.1.31 1194

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

;ca ca.crt
;cert client.crt
;key client.key

Выставляем key-direction в значение «1», тем самым указывая, что это клиент, у сервера должно быть значение «0»

key-direction 1

Указываем метод и алгоритм шифрования, такие же как на сервере

cipher AES-128-CBC
auth SHA256

Linux клиенты не способны автоматически добавлять в систему информацию о DNS. Для этих целей используется скрипт /etc/openvpn/update-resolv-conf. Добавим в шаблон необходимые для работы скрипта строки. На Linux клиентах эти строки нужно будет раскоментировать

# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf

Создаем скрипт генерации клиентских конфигурационных файлов. Идея скрипта взята отсюда.

# nano ~/client-configs/make_config.sh
. . .
#!/bin/bash

# First argument: Client identifier

KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-auth>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-auth>') \
> ${OUTPUT_DIR}/${1}.ovpn

Выставляем права на скрипт

# chmod 700 ~/client-configs/make_config.sh

Сгенерируем конфигурационные файлы для gw2 и remote client

# cd ~/client-configs
# ./make_config.sh gw2
# ./make_config.sh remote-client

Конфигурационные файлы клиентов добавляются в папку ~/client-configs/files. Из этой папки их нужно перенести на клиентские компьютеры. Можно использовать Flash накопитель, или для linux клиентов воспользоваться утилитой scp

# scp /home/username/client-configs/files/gw2.ovpn username@192.168.1.32:
username@192.168.1.32's password:
gw2.ovpn 100% 13KB 12.9KB/s 00:00

Конфигурация сервера OpenVPN

Копируем необходимые для работы OpenVPN сервера ключи и сертификаты

# cd ~/openvpn-ca/keys
# cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn

Копируем из шаблона конфигурационный файл сервера

# gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf

Отредактируем конфигурационный файл сервера OpenVPN

# nano /etc/openvpn/server.conf
. . .

Поскольку в нашем примере есть две частные сети 172.16.1.0/24 и 172.16.2.0/24, добавим маршруты до этих сетей

push "route 172.16.1.0 255.255.255.0"
push "route 172.16.2.0 255.255.255.0"

Первый маршрут указывает на сеть за сервером gw1. Маршрут до сети 172.16.2.0/24 находится за клиентом gw2. Для работоспособности маршрутов, находящихся за клиентами, нужно добавить следующие строки

client-config-dir ccd
route 172.16.2.0 255.255.255.0

Первая строка указывает на папку, в которой OpenVPN будет искать  файл с именем клиента. В дальнейшем нужно будет создать этот файл для gw2 и указать в нем маршрут до 172.16.2.0/24. Вторая строка указывает маршрут до сети за клиентом.

Если раскоментировать строку

;push "redirect-gateway def1 bypass-dhcp"

подключаемые клиенты будут использовать OpenVPN сервер в качестве шлюза по умолчанию.

Добавим строки, указывающие DNS сервер и DNS суффикс

push "dhcp-option DNS 172.16.1.2"
push "dhcp-option DOMAIN 4skill.loc"

Раскоментируем данную строку, чтобы remote client мог попасть в сеть 172.16.2.0/24

client-to-client

Раскоментируем строку с указанием HMAC ключа

tls-auth ta.key 0 # This file is secret

Указываем метод и алгоритм шифрования

cipher AES-128-CBC # AES
auth SHA256

Указываем пользователя и группу, от имени которых будет работать служба OpenVPN

user nobody
group nogroup

Активируем логирование. Лог будет записываться в /etc/openvpn/openvpn.log

log         openvpn.log

Создаем папку для клиентских файлов с информацией о маршрутах

# mkdir /etc/openvpn/ccd

Создаем файл с маршрутами для gw2

# nano /etc/openvpn/ccd/gw2
. . .
iroute 172.16.2.0 255.255.255.0

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

# service openvpn@server start

@serverv совпадает с названием конфигурационного файла, а нашем случае это server.conf.

 

Действия на gw2

Устанавливаем OpenVPN

# apt install openvpn

Перемещаем сгенерированный ранее конфигурационный файл gw2.ovpn в папку OpenVPN. При перемещении нужно заменить .ovpn на .conf

# mv ~/gw2.ovpn /etc/openvpn/gw2.conf

Изменим некоторые настройки в gw2.conf

# nano /etc/openvpn/gw2.conf
. . .

Указываем пользователя и группу, от имени которых будет работать служба OpenVPN

user nobody
group nogroup

Раскоментируем строки запуска DNS скрипта

script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf

Запускаем клиент

# service openvpn@gw2 start

В данный момент мы связали VPN сетью основной и удаленный офис. Компьютеру cl1 должен быть доступен компьютер cl2 и наоборот.

 

Действия на remote client

На Windows машине нужно скачать OpenVPN клиент и установить его. Затем в папку C:\Program Files\OpenVPN\config переместить конфигурационный файл remote-client.ovpn. После чего запустить OpenVPN клиент, в трее найти иконку OpenVPN, нажать правой кнопкой мышки и выбрать «Подключиться».

win_ovpn

 

 

 

 

 

 

 

После подключения, удаленному клиенту remote client должны быть доступны компьютеры cl1 и cl2.

 

Отзыв сертификата

Для отзыва сертификата используется скрипт revoke-full. Отзовем сертификат remote-client

# cd ~/openvpn-ca/
# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/username/openvpn-ca/keys
# ./revoke-full remote-client
Using configuration from /home/uid881/openvpn-ca/openssl-1.0.0.cnf
Revoking Certificate 03.
Data Base Updated
Using configuration from /home/username/openvpn-ca/openssl-1.0.0.cnf
remote-client.crt: C = RU, ST = Msc, L = Moscow, O = 4skill inc., OU = IT Department, CN = remote-client, name = EasyRSA, emailAddress = support@4skill.ru
error 23 at 0 depth lookup:certificate revoked

Посмотреть список отозванных сертификатов можно скриптом list-crl

# ./list-crl
Certificate Revocation List (CRL):
Version 1 (0x0)
Signature Algorithm: sha256WithRSAEncryption
Issuer: /C=RU/ST=Msc/L=Moscow/O=4skill inc./OU=IT Department/CN=4skill inc. CA/name=EasyRSA/emailAddress=support@4skill.ru
Last Update: Nov 15 11:37:39 2016 GMT
Next Update: Dec 15 11:37:39 2016 GMT
Revoked Certificates:
Serial Number: 03
Revocation Date: Nov 15 11:37:39 2016 GMT
Signature Algorithm: sha256WithRSAEncryption
62:13:71:df:98:10:72:c0:26:89:80:f1:89:01:7d:3d:d7:de:
04:08:b5:07:c3:f0:7d:87:c3:ed:3f:2d:75:27:09:44:9a:c2:
6c:ca:85:32:69:2e:c7:fe:63:45:da:60:1e:57:77:ad:d0:06:
76:92:69:06:40:08:eb:ab:7a:34:32:19:3c:21:5a:64:d5:17:
9b:4e:7c:ef:37:fa:c3:f4:7f:f0:c4:59:9c:eb:12:fb:7d:9d:
87:f0:d2:f6:65:df:8f:1e:6e:35:04:9f:dd:6f:a0:05:fe:b7:
d8:09:89:1e:cf:20:b7:68:14:88:87:a6:71:55:95:cb:7f:19:
71:fd:b8:76:ed:09:8b:21:a4:39:ab:4e:73:5e:ad:1e:12:76:
bd:1f:e3:c5:07:9b:b5:2c:9f:7b:5f:bc:d9:c8:2e:ec:1b:3d:
b1:69:95:05:6c:03:4d:b2:04:0b:3f:9b:dc:e6:57:7b:5a:f5:
e4:20:03:0f:39:88:cf:8e:4d:d7:f5:dc:65:31:68:b8:c2:b2:
0e:3a:43:fc:9e:1b:10:c8:e1:b1:ad:02:14:87:1e:07:0c:e9:
17:a8:ca:4a:3d:de:8c:8a:fd:35:87:c8:3b:21:4d:ac:c0:18:
54:3a:cd:be:25:4b:56:4b:57:cc:3b:78:3b:d3:69:22:3a:3e:
a0:ba:7c:e5

Список отозванных сертификатов хранится в файле crl.pem. Его нужно скопировать в папку /etc/openvpn

# cd ~/openvpn-ca/keys
# cp crl.pem /etc/openvpn/

Далее нужно указать в server.conf путь к crl.pem

# nano /etc/openvpn/server.conf
. . .
crl-verify crl.pem

и перезапустить службу

# service openvpn@server restart

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *