Установка OpenVPN на Ubuntu 18.04 LTS. Часть 11 из 12

09.08.2020

Теги: LinuxSSLSystemdUbuntuVPNКлиентКлючКонфигурацияЛокальнаяСетьМаршрутизацияНастройкаСерверУстановка

Восстановление набора networks

Мне казалось, что теперь все готово — но созданный на gateway1, gateway2 и gateway3 набор networks пропал после перезагрузки. Как следствие — не были созданы и правила для netfilter (хотя они все еще в файле /etc/iptables/rules.v4), потому что в них используется несуществующий набор. Так что нам надо позаботиться о сохранении и восстановлении набора networks на каждом маршрутизаторе.

Создаем новую службу ipset-persistent.service:

$ sudo nano /etc/systemd/system/ipset-persistent.service
[Unit]
Description=ipset persistent configuration
Before=network.target
# запуск перед службой, которая восстанавливает правила netfilter
Before=netfilter-persistent.service
Before=ufw.service
ConditionFileNotEmpty=/etc/iptables/ipset
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/ipset restore -file /etc/iptables/ipset
# раскомментировать, чтобы сохранять наборы перед перезагрузкой
# ExecStop=/sbin/ipset save -file /etc/iptables/ipset
ExecStop=/sbin/ipset flush
ExecStopPost=/sbin/ipset destroy
[Install]
WantedBy=multi-user.target
RequiredBy=netfilter-persistent.service
RequiredBy=ufw.service

Сообщаем системе про новый unit-файл:

$ sudo systemctl daemon-reload

Добавляем новую службу в автозагрузку:

$ sudo systemctl enable ipset-persistent.service

Все это надо проделать на маршрутизаторах gateway1, gateway2 и gateway3. После этого создать заново набор networks на каждом маршрутизаторе и сохранить в файл:

$ sudo ipset save -file /etc/iptables/ipset

Проверяем, как все работает

С компьютера pc1 проверяем доступность компьютера pc3:

$ ping -c3 192.168.250.2
PING 192.168.250.2 (192.168.250.2) 56(84) bytes of data.
64 bytes from 192.168.250.2: icmp_seq=1 ttl=62 time=1.85 ms
64 bytes from 192.168.250.2: icmp_seq=2 ttl=62 time=1.86 ms
64 bytes from 192.168.250.2: icmp_seq=3 ttl=62 time=3.61 ms

--- 192.168.250.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 1.853/2.442/3.611/0.827 ms

С компьютера pc1 проверяем доступность компьютера pc5:

$ ping -c3 192.168.50.2
PING 192.168.50.2 (192.168.50.2) 56(84) bytes of data.
64 bytes from 192.168.50.2: icmp_seq=1 ttl=62 time=2.07 ms
64 bytes from 192.168.50.2: icmp_seq=2 ttl=62 time=2.87 ms
64 bytes from 192.168.50.2: icmp_seq=3 ttl=62 time=3.33 ms

--- 192.168.50.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 2.078/2.761/3.333/0.518 ms

Еще один VPN-клиент pc7

Теперь настроим компьютер pc7, чтобы сотрудник Сергей Иванов, работающий удаленно, мог подключаться к нашему VPN-серверу. После установки пакета openvpn копируем с gateway1 следующие файлы:

$ sudo mkdir /etc/openvpn/keys/ # создаем директорию для ключей и сертификатов
$ sudo scp evgeniy@123.123.123.123:/home/evgeniy/easy-rsa/pki/ca.crt /etc/openvpn/keys/
$ sudo scp evgeniy@123.123.123.123:/home/evgeniy/easy-rsa/ta.key /etc/openvpn/keys/

Создаем файл конфигурации клиента:

$ sudo nano /etc/openvpn/client/config.conf
# работа по протоколу UDP (для TCP нужно указать tcp-client)
proto udp4
# сетевой интерфейс TUN (или TAP)
dev tun
# принимать от сервера команды push, например маршруты
pull

# ip-адрес и порт сервера
remote 123.123.123.123 1194

# если не удалось получить ip-адрес сервера от DNS, то через указанное
# количество секунд попытаться снова; infinite — повторять бесконечно
resolv-retry infinite

# использовать динамический порт для подключения к серверу (клиенту не
# требуется привязка к определенному порту); актуально только для UDP
nobind

# включить TLS и при handshake представляться как клиент;
# TLS используется только для шифрования канала управления
tls-client

# корневой сертификат
ca /etc/openvpn/keys/ca.crt

# обратите внимание, что мы не указываем директивы cert и key
#cert /etc/openvpn/keys/sergey-ivanov.crt
#key /etc/openvpn/keys/sergey-ivanov.key

# для защиты от атаки «человек посередине», когда авторизованный клиент
# пытается подключиться к другому клиенту, выдавая себя за сервер; при
# указании этой директивы проверяется, что сертификат именно серверный
remote-cert-tls server

# добавляет дополнительную подпись HMAC ко всем пакетам handshake для
# проверки целостности; любой пакет, не имеющий правильной HMAC-подписи,
# будет отброшен без дальнейшей обработки; это для доп.безопасности
tls-auth /etc/openvpn/keys/ta.key
# для клиента направление ключа TLS — 1 (для сервера — 0)
key-direction 1

# использовать алгоритм AES-256-GCM шифрования пакетов канала данных;
# на данный момент это самый безопасный и быстрый алгоритм шифрования
cipher AES-256-GCM

# алгоритм хеширования — для проверки целостности передаваемых пакетов
# канала данных и (если включено tls-auth) пакетов канала управления
auth SHA256

# пользователь и группа с минимальными правами — для большей безопасности
user nobody
group nogroup

# не перечитывать файлы ключей при восстановлении туннеля после разрыва
persist-key
# оставлять без изменения устройства tun или tap при перезапуске службы
persist-tun

# логин и пароль клиента размещаем в файле — чтобы отправить их серверу
auth-user-pass /etc/openvpn/auth/user.pass

Создаем файл с логином и паролем:

$ sudo mkdir /etc/openvpn/auth/
$ sudo nano /etc/openvpn/auth/user.pass
sergey-ivanov
uvwxyz456789

Добавляем нового клиента на сервере:

$ sudo nano /etc/openvpn/auth/users.pass # файл с логинами и паролями на gateway1
branch-office-gw2:abcdef123456
branch-office-gw3:fedcba654321
sergey-ivanov:uvwxyz456789

Все готово, можно запускать VPN-клиент:

$ sudo systemctl start openvpn-client@config.service

Добавим запуск клиента в автозагрузку:

$ sudo systemctl enable openvpn-client@config.service

Проверяем доступность компьютеров pc1, pc3 и pc5:

$ ping -c3 192.168.150.2 # проверяем доступность pc1
PING 192.168.150.2 (192.168.150.2) 56(84) bytes of data.
64 bytes from 192.168.150.2: icmp_seq=1 ttl=63 time=2.77 ms
64 bytes from 192.168.150.2: icmp_seq=2 ttl=63 time=0.937 ms
64 bytes from 192.168.150.2: icmp_seq=3 ttl=63 time=2.30 ms

--- 192.168.150.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2034ms
rtt min/avg/max/mdev = 0.937/2.003/2.770/0.777 ms
$ ping -c3 192.168.250.2 # проверяем доступность pc3
PING 192.168.250.2 (192.168.250.2) 56(84) bytes of data.
64 bytes from 192.168.250.2: icmp_seq=1 ttl=63 time=1.58 ms
64 bytes from 192.168.250.2: icmp_seq=2 ttl=63 time=2.23 ms
64 bytes from 192.168.250.2: icmp_seq=3 ttl=63 time=2.40 ms

--- 192.168.250.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 1.588/2.077/2.409/0.353 ms
$ ping -c3 192.168.50.2 # проверяем доступность pc5
PING 192.168.50.2 (192.168.50.2) 56(84) bytes of data.
64 bytes from 192.168.50.2: icmp_seq=1 ttl=63 time=1.70 ms
64 bytes from 192.168.50.2: icmp_seq=2 ttl=63 time=3.31 ms
64 bytes from 192.168.50.2: icmp_seq=3 ttl=63 time=3.53 ms

--- 192.168.50.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2005ms
rtt min/avg/max/mdev = 1.700/2.852/3.537/0.819 ms

Еще один VPN-клиент pc8

Теперь настроим компьютер pc8, чтобы сотрудник Андрей Петров, работающий удаленно, мог подключаться к нашему VPN-серверу. После установки пакета openvpn копируем с gateway1 следующие файлы:

$ sudo mkdir /etc/openvpn/keys/ # создаем директорию для ключей и сертификатов
$ sudo scp evgeniy@123.123.123.123:/home/evgeniy/easy-rsa/pki/ca.crt /etc/openvpn/keys/
$ sudo scp evgeniy@123.123.123.123:/home/evgeniy/easy-rsa/ta.key /etc/openvpn/keys/

Создаем ovpn-файл конфигурации клиента:

$ sudo nano /home/petrov/anprey-petrov.ovpn
# работа по протоколу UDP (для TCP нужно указать tcp-client)
proto udp
# сетевой интерфейс TUN (или TAP)
dev tun
# принимать от сервера команды push, например маршруты
pull

# ip-адрес и порт сервера
remote 123.123.123.123 1194

# если не удалось получить ip-адрес сервера от DNS, то через указанное
# количество секунд попытаться снова; infinite — повторять бесконечно
resolv-retry infinite

# использовать динамический порт для подключения к серверу (клиенту не
# требуется привязка к определенному порту); актуально только для UDP
nobind

# включить TLS и при handshake представляться как клиент;
# TLS используется только для шифрования канала управления
tls-client

# корневой сертификат
#ca /etc/openvpn/keys/ca.crt

# обратите внимание, что мы не указываем директивы cert и key
#cert /etc/openvpn/keys/andrey-petrov.crt
#key /etc/openvpn/keys/andrey-petrov.key

# для защиты от атаки «человек посередине», когда авторизованный клиент
# пытается подключиться к другому клиенту, выдавая себя за сервер; при
# указании этой директивы проверяется, что сертификат именно серверный
remote-cert-tls server

# добавляет дополнительную подпись HMAC ко всем пакетам handshake для
# проверки целостности; любой пакет, не имеющий правильной HMAC-подписи,
# будет отброшен без дальнейшей обработки; это для доп.безопасности
#tls-auth /etc/openvpn/keys/ta.key
# направление ключа: для клиента — 1, для сервера — 0
key-direction 1

# использовать алгоритм AES-256-GCM шифрования пакетов канала данных;
# на данный момент это самый безопасный и быстрый алгоритм шифрования
cipher AES-256-GCM

# алгоритм хеширования — для проверки целостности передаваемых пакетов
# канала данных и (если включено tls-auth) пакетов канала управления
auth SHA256

# пользователь и группа с минимальными правами — для большей безопасности
user nobody
group nogroup

# не перечитывать файлы ключей при восстановлении туннеля после разрыва
persist-key
# оставлять без изменения устройства tun или tap при перезапуске службы
persist-tun

# клиент запросит у пользователя логин-пароль при подключении к серверу
auth-user-pass

<ca>
-----BEGIN CERTIFICATE-----
MIIDcjCCAlqgAwIBAgIUTHMD8QYP2viknCANQnaRFKgu8KYwDQYJKoZIhvcNAQEL
BQAwIzEhMB8GA1UEAwwYU29tZSBDb21wYW55IEF1dGggQ2VudGVyMB4XDTIwMDgw
NTEzNDE1MVoXDTMwMDgwMzEzNDE1MVowIzEhMB8GA1UEAwwYU29tZSBDb21wYW55
IEF1dGggQ2VudGVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvJux
JxzrLhWfwy4Q2N8WXKGKo/PCOuyEw7PS+YuOZNQfngopHxTRmOsjvuI+5QI+hl+z
JGMKIMdFtLrZ/R6n9YJCLrhjXg95RXqMa1fQ5NiXU58O0F6luYvtNMpn3OyQhIX2
CVGjCw4VmbcB4kLlD9wKlllTqV1g6pj7sHa8Tf2rlVSdfU5+TNq3mZDYgeFdi+lG
P8z9ZnZXDDNTpJwNWNgAvHRXEogjsELdDPD6Br6l3fkOFkrl6pEw4ZcjMLm0hflk
37L53goS3xT6E6TD8ZNWqTs0Sb1WdEiO6g8pduWdp1SdHWzicsBjTnGYXbp9cHS6
U7zfkIb6nJ2DCJRvwQIDAQABo4GdMIGaMB0GA1UdDgQWBBQh5ZZrvpQOv5LhAUBG
5ERsGs224zBeBgNVHSMEVzBVgBQh5ZZrvpQOv5LhAUBG5ERsGs2246EnpCUwIzEh
MB8GA1UEAwwYU29tZSBDb21wYW55IEF1dGggQ2VudGVyghRMcwPxBg/a+KScIA1C
dpEUqC7wpjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsF
AAOCAQEAc/Oipw7Bguewacq5PsQGRpxpmXPVSM/UiENUKb5HUIiMySXB97o1fFAw
KSXJc8fB8z6nG3aqzyRyAI3nxHxDiBAAJqphKh3rLIDl0bVvvz0lR7fylGSwPJvc
W6q6HrkL+0WR20y+MP6TeP6UR9nWFrwxEBl/YU2in5Vw1dwrqeCG1XKKgMDaWj1S
s6BZ0/mPZfDWUNUvuclPK1EmGzw8366IyBEcGWy/Qa0je9b56b4Iy0+x1UGcfnR3
RA5uCHNhv6glrJXJ2sogfFV0W4AyzPpFP6hx9flsdRz52olWWswMk351wVT3vKeG
uQHWSpT84cE9jSvHlgedFlipgr9OJA==
-----END CERTIFICATE-----
</ca>

<tls-auth>
-----BEGIN OpenVPN Static key V1-----
d2a37e6a2f08f3878d1d045538aa65f5
413bb45aa8ad4ba928da4451eb714cb4
319f82350fc2dab942242937150f0c37
b48b7a8eed3b289001da6d69e8398590
cd928b58d5518bea4342a7c1205af945
a61c431f4a40e612be2c9ae4ebe395ab
3c5be6a6b5ffbc2ad43f47c1296326c1
f11603855d11d5dd7f94988f805f66fb
6c116becf66018bda4103dc22dafc4f8
fb61b3bb40c9b2712f7ff73344cab80f
5eac4f220a9b382ded94e4d645c40306
92c4194194ed93546969feb5c629626f
a32333e958a10ddbec8f084a17bdaf0e
069b04a15af75b3849030cd92522b6dd
8c18ae25a161f93b0a2556ec68f4f9aa
2cc009ceba3032fabafb66f50301a64b
-----END OpenVPN Static key V1-----
</tls-auth>

Сразу расскажу, чем этот файл отличается от файла конфигурации для Сергея Иванова:

# gui-клиент не понимает значение udp4, так что надо использовать udp
proto udp

# корневой сертификат теперь внутри ovpn-файла, см. ниже блок <ca>...</ca>
#ca /etc/openvpn/keys/ca.crt

# файл ta.key теперь внутри ovpn-файла, см. ниже блок <tls-aut>...</tls-auh>
#tls-auth /etc/openvpn/keys/ta.key

# если направление ключа было указано в tls-auth вторым параметром, то надо
# добавить отдельную директиву, потому что директиву tls-auth удаляем
key-direction 1

# моя попытка использовать <auth-user-pass>...</auth-user-pass> не увенчалась
# успехом; также провалилась попытка указать файл с логином и паролем; но
# gui-клиент умеет сохранять логин и пароль, ввести их надо только один раз
auth-user-pass

<ca>
-----BEGIN CERTIFICATE-----
..........
-----END CERTIFICATE-----
</ca>

<tls-auth>
-----BEGIN OpenVPN Static key V1-----
..........
-----END OpenVPN Static key V1-----
</tls-auth>

Добавляем нового клиента на сервере:

$ sudo nano /etc/openvpn/auth/users.pass # файл с логинами и паролями на gateway1
branch-office-gw2:abcdef123456
branch-office-gw3:fedcba654321
sergey-ivanov:uvwxyz456789
andrey-petrov:qwerty123456

Дальше установим два пакета на клиенте и перезагрузим службу NetworkManager:

$ sudo apt install network-manager-openvpn
$ sudo apt install network-manager-openvpn-gnome
$ sudo systemctl restart NetworkManager.service

Идем в настройки и импортируем ovpn-файл, вводим логин-пароль:

Теперь в любой момент можем соединиться с VPN-сервером:

Создавать ovpn-файлы более логично в центре сертификации и раздавать клиентам, чтобы они самостоятельно настроили подключение к VPN-серверу. Просто мне удобнее делать это на клиенте в gui-редакторе, а не на сервере в режиме командной строки.

Файлы ca.crt и ta.key нужны только для создания ovpn-файла, после этого на клиенте их можно удалить.

Двойная аутентификация

Для этого нужно создать сертификаты для клиентов, отредактировать файл конфигурации сервера и клиентов:

# кроме логина и пароля запрашивать сертификат клиента
verify-client-cert require
# использовать UserName вместо CommonName сертификата
username-as-common-name
# сертификат клиента
cert /etc/openvpn/keys/andrey-petrov.crt
# приватный ключ клиента
key /etc/openvpn/keys/andrey-petrov.key

Также определиться, что будет использоваться в качестве имен файлов конфигурации клиентов в директории client-config-dir на сервере — CommonName сертификата клиента или UserName пользователя. Если использовать планируется CommonName — тогда директиву username-as-common-name нужно удалить.

При создании ovpn-файла клиента добавить еще два блока:

<cert>
-----BEGIN CERTIFICATE-----
.....
-----END CERTIFICATE-----
</cert>

<key>
-----BEGIN PRIVATE KEY-----
.....
-----END PRIVATE KEY-----
</key>

А директивы cert и key из ovpn-файла удалить:

# сертификат клиента
#cert /etc/openvpn/keys/andrey-petrov.crt
# приватный ключ клиента
#key /etc/openvpn/keys/andrey-petrov.key

Поиск: Linux • SSL • Systemd • Ubuntu • VPN • Клиент • Ключ • Конфигурация • Локальная сеть • Маршрутизация • Настройка • Сервер • Установка • Сертификат

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.