Установка OpenVPN на Ubuntu 18.04 LTS. Часть 3 из 12
05.07.2020
Теги: Linux • SSL • Ubuntu • VPN • Клиент • Ключ • Конфигурация • ЛокальнаяСеть • Маршрутизация • Настройка • Сервер
Сетевые настройки сервера
Если мы используем 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-туннель.
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: ~.
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
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 12 из 12
- Установка OpenVPN на Ubuntu 18.04 LTS. Часть 11 из 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
Поиск: Linux • SSL • Ubuntu • VPN • Клиент • Ключ • Конфигурация • Настройка • Сервер • Локальная сеть • Сертификат • Маршрутизация