Установка 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 на клиенте при подключении и отключении
script-security 2
up /etc/openvpn/update-systemd-resolved
up-restart
down /etc/openvpn/update-systemd-resolved
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
$ route -n
Destination   Gateway    Genmask         Flags   Metric   Ref   Use   Iface
0.0.0.0       10.0.2.2   0.0.0.0         UG      100      0     0     enp0s3
10.0.2.0      0.0.0.0    255.255.255.0   U       100      0     0     enp0s3

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

$ sudo systemctl start openvpn-client@config.service
$ route -n
Destination       Gateway    Genmask           Flags   Metric   Ref   Use   Iface
0.0.0.0           10.8.0.1   128.0.0.0         UG      0        0     0     tun0 # маршрут по умолчанию
0.0.0.0           10.0.2.2   0.0.0.0           UG      100      0     0     enp0s3
10.0.2.0          0.0.0.0    255.255.255.0     U       100      0     0     enp0s3
10.8.0.0          0.0.0.0    255.255.255.0     U       0        0     0     tun0
123.123.123.123   10.0.2.2   255.255.255.255   UGH     0        0     0     enp0s3 # маршрут до сервера
128.0.0.0         10.8.0.1   128.0.0.0         UG      0        0     0     tun0

При создании VPN-туннеля добавляется маршрут до VPN-сервера 123.123.123.123 и новый маршрут по умолчанию.

Предотвращение утечки 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.