Установка OpenVPN на Ubuntu 18.04 LTS. Часть 11 из 12
09.08.2020
Теги: Linux • SSL • Systemd • Ubuntu • VPN • Клиент • Ключ • Конфигурация • ЛокальнаяСеть • Маршрутизация • Настройка • Сервер • Установка
Восстановление набора 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 # использовать динамический порт для подключения к серверу (клиенту не # требуется привязка к определенному порту) 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 # использовать динамический порт для подключения к серверу (клиенту не # требуется привязка к определенному порту) 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
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 12 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 10 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 9 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 8 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 7 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 6 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 5 из 12
Поиск: Linux • SSL • Systemd • Ubuntu • VPN • Клиент • Ключ • Конфигурация • Локальная сеть • Маршрутизация • Настройка • Сервер • Установка • Сертификат