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

05.07.2020

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

Сетевые настройки сервера

Если мы используем VPN-туннель для маршрутизации всего трафика клиентов, нужно разрешить транзитный трафик между сетевыми интерфейсами и настроить SNAT (подмена адреса источника). Редактируем файл /etc/sysctl.conf:

$ sudo nano /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Чтобы внесенные изменения вступили в силу, выполняем команду:

$ sudo sysctl -p
net.ipv4.ip_forward = 1

После этого настраиваем netfilter с помощью утилиты iptables:

$ sudo iptables -P FORWARD DROP
$ sudo iptables -A FORWARD -i tun0 -o ens3 -s 10.8.0.0/24 -j ACCEPT # tun0 -> ens3
$ sudo iptables -A FORWARD -i ens3 -o tun0 -d 10.8.0.0/24 -j ACCEPT # ens3 -> tun0

На сервере два сетевых интерфейса:

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 4a:61:03:c8:18:60 brd ff:ff:ff:ff:ff:ff
    inet 123.123.123.123/24 brd 123.123.123.255 scope global dynamic ens3
       valid_lft 74635sec preferred_lft 74635sec
    inet6 fe80::4861:3ff:fec8:1860/64 scope link 
       valid_lft forever preferred_lft forever
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.1/24 brd 10.8.0.255 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::96a7:36f2:d777:9de6/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

Мы разрешили ходить транзитным пакетам для нашего диапазона ip адресов, а всё остальное запретили. Теперь настроим SNAT (подмена адреса источника), что позволит всем VPN-клиентам выходить в интернет, используя единственный ip-адрес 123.123.123.123:

$ sudo iptables -t nat -A POSTROUTING -o ens3 -s 10.8.0.0/24 -j MASQUERADE

Правила мы добавили, но они пропадут при перезагрузке VPN-сервера. Так что их нужно сохранить и восстанавливать при перезагрузке. В этом нам поможет установка пакета iptables-persistent, который добавит новую службу netfilter-persistent.service:

$ sudo apt install iptables-persistent

При установке пакета будет предложено сохранить текущие правила iptables:

  • в файл /etc/iptables/rules.v4 для протокола IPv4
  • в файл /etc/iptables/rules.v6 для протокола IPv6

Настройки сервера и клиента

В предыдущей части мы уже говорили об этом, но напомню еще раз. В файл конфигурации сервера надо добавить строки:

# использовать VPN-туннель для маршрутизации всего трафика клиентов
push "redirect-gateway def1 bypass-dhcp"
# отправить клиентам DNS-сервера 208.67.222.222 и 208.67.220.220
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

И не забыть изменить файл конфигурации клиента:

# следующие директивы нужны для обновления используемых DNS-серверов
# на клиенте при подключении к vpn-серверу и отключении
script-security 2
# выполнить команду или скрипт при запуске устройства tun/tap
up /etc/openvpn/update-systemd-resolved
# выполнить команды из директив down и up при перезапуске tun/tap
up-restart
# выполнить команду или скрипт при остановке устройства tun/tap
down /etc/openvpn/update-systemd-resolved
# выполнить команду из директивы down перед остановкой tun/tap
down-pre

Чтобы получить скрипт update-systemd-resolved — нужно установить пакет openvpn-systemd-resolved:

$ sudo apt install openvpn-systemd-resolved

Перезагружаем VPN-сервер с новым файлом конфигурации:

$ sudo systemctl restart openvpn-server@config.service

Перезагружаем VPN-клиент с новым файлом конфигурации:

$ sudo systemctl restart openvpn-client@config.service

И смотрим свой ip-адрес в браузере:

Маршруты на клиенте, когда нет соединения с VPN-сервером:

$ sudo systemctl stop openvpn-client@config.service
$ ip route show
default via 192.168.110.1 dev enp0s3 proto dhcp src 192.168.110.15 metric 100
192.168.110.0/24 dev enp0s3 proto kernel scope link src 192.168.110.15 metric 100
192.168.110.1 dev enp0s3 proto dhcp scope link src 192.168.110.15 metric 100

Маршруты на клиенте, когда есть соединение с VPN-сервером:

$ sudo systemctl start openvpn-client@config.service
$ ip route show
0.0.0.0/1 via 10.8.0.1 dev tun0
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.2
128.0.0.0/1 via 10.8.0.1 dev tun0
default via 192.168.110.1 dev enp0s3 proto dhcp src 192.168.110.15 metric 100
192.168.110.0/24 dev enp0s3 proto kernel scope link src 192.168.110.15 metric 100
192.168.110.1 dev enp0s3 proto dhcp scope link src 192.168.110.15 metric 100
123.123.123.123 via 192.168.110.1 dev enp0s3

При создании VPN-соединения добавляется маршрут до VPN-сервера 123.123.123.123 (выделен зеленым) — сам зашифрованный трафик не будет отправляться через туннель. Кроме того, добавляются маршруты 0.0.0.0/1 и 128.0.0.0/1 (выделены красным), которые охватывают все пространство IPv4 и являются более конкретными (/1), чем обычный шлюз (/0). Маршрутизация всегда происходит по более конкретным маршрутам — таким образом, весь трафик передается через VPN-туннель.

При остановке VPN-службы может получиться так, что часть добавленных маршрутов не будут удалены. Причина этого в директивах user nobody и group nogroup — для удаления не хватает прав. Можно удалить эти директивы или использовать плагин openvpn-plugin-down-root.so.

Предотвращение утечки DNS-запросов

Чтобы предотвратить утечку DNS-запросов по ненадежным сетям (например, по общедоступным точкам доступа WiFi), нужно указать systemd-resolved, чтобы он отправлял все DNS-запросы через VPN-туннель. Для этого добавляем либо строку в файл конфигурации сервера, либо строку в файл конфигурации клиента.

# для предотвращения утечки DNS-запросов (либо в файл конфигурации сервера)
push "dhcp-option DOMAIN-ROUTE ."
# для предотвращения утечки DNS-запросов (либо в файл конфигурации клиента)
dhcp-option DOMAIN-ROUTE .

Проверим, какие DNS-серверы использует клиент после создания VPN-туннеля:

$ systemd-resolve --status tun0
Link 7 (tun0)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 208.67.222.222
                      208.67.220.220
          DNS Domain: ~.
Для ОС Windows надо использовать директиву block-outside-dns в файле конфигурации клиента. Эта директива считается неизвестной на платформах, отличных от Windows. Чтобы избежать ошибки от использования неизвестной директивы, можно добавить в файл конфигурации клиента директиву ignore-unknown-option. Обратите внимание, что отправка неизвестных директив с сервера не вызывает ошибок.

GUI клиент для Ubuntu Desktop

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

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

Остановим VPN-клиент и удалим его из автозагрузки:

$ sudo systemctl stop openvpn-client@config.service
$ sudo systemctl disable openvpn-client@config.service

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

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

  • Шлюз (ip-адрес vpn-сервера) 123.123.123.123
  • Корневой сертификат /etc/openvpn/keys/ca.crt
  • Сертификат клиента /etc/openvpn/keys/sergey-ivanov.crt
  • Приватный ключ клиента /etc/openvpn/keys/sergey-ivanov.key

Далее внизу нажимаем кнопку «Дополнительно» и на первой вкладке «Общие» можем указать порт и протокол, если они отличаются от значений по умолчанию 1194 и UDP:

На второй вкладке «Безопасность» указываем криптографический шифр AES-256-CBC и алгоритм хеширования SHA256:

На третьей вкладке «Аутентификация TLS» включаем защиту от атаки «человек посередине», указываем ключ TLS /etc/openvpn/keys/ta.key и направление key-direction=1:

Все настройки можно импортировать из файла конфигурации клиента /etc/openvpn/client/config.conf, см. первый снимок экрана.

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

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

$ cd /home/evgeniy/easyrsa/
$ ./easyrsa revoke sergey-ivanov

Теперь нужно обновить список отозванных сертификатов:

$ ./easyrsa gen-crl

В результате будет создан файл pki/crl.pem, который нужно скопировать на VPN-сервер. У нас VPN-сервер на одной машине с центром сертификации, так что нет необходимости использовать команду scp, достаточно просто cp:

$ sudo cp /home/evgeniy/easyrsa/pki/crl.pem /etc/openvpn/keys/

Сервер должен иметь возможность прочитать файл crl.pem когда он уже работает от nobody и nogroup:

$ sudo chown nobody:nogroup /etc/openvpn/keys/crl.pem

Вносим изменения в файл конфигурации VPN-сервера:

$ sudo nano /etc/openvpn/server/config.conf
# список отозванных сертификатов
crl-verify /etc/openvpn/keys/crl.pem

Перезагружаем VPN-сервер, чтобы изменения вступили в силу:

$ sudo systemctl restart openvpn-server@config.service

Поиск: Linux • SSL • 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.