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

31.07.2020

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

Static key и point-to-point

До этого момента мы говорили о режиме «сервер + клиенты» и применяли аутентификацию с помощью сертификатов. Но если нужно сделать простое соединение point-to-point между двумя узлами — можно использовать режим p2p. Кроме того, вместо сертификатов можно использовать static key (аналог PSK авторизации).

В криптографии, общий ключ (PSK, pre-shared key) является общим секретом, который должен быть доставлен на обе стороны с помощью какого-то безопасного канала, прежде чем он будет использован.

У этой конфигурации есть некоторые недостатки:

  • Ограниченная масштабируемость — один клиент, один сервер.
  • Секретный ключ хранится в текстовой форме на каждом VPN узле.
  • Кража ключа ведет к раскрытию информации из предыдущих сессий.

Давайте реализуем соединение двух локальных сетей из пятой части с использованием режима p2p и static key:

У нас уже установлен VPN-сервер на gateway1 и VPN-клиент на gateway2. Так что нам нужно будет создать статический ключ на сервере, скопировать его на клиент и создать новые файлы конфигурации сервера и клиента.

Настройка VPN-сервера

Создаем на сервере статический ключ:

$ sudo mkdir /etc/openvpn/keys/
$ sudo openvpn --genkey --secret /etc/openvpn/keys/static.key

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

$ sudo nano /etc/openvpn/server/static.conf
# минимальная конфигурация сервера
dev tun
ifconfig 10.8.0.1 10.8.0.2
local 111.111.111.111
secret /etc/openvpn/keys/static.key 0

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

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

Запустим VPN-сервер и добавим его в автозагрузку:

$ sudo systemctl start openvpn-server@static.service
$ sudo systemctl enable openvpn-server@static.service

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

Копируем статический ключ с сервера:

$ sudo scp evgeniy@111.111.111.111:/etc/openvpn/keys/static.key /etc/openvpn/keys/static.key

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

$ sudo nano /etc/openvpn/client/static.conf
# минимальная конфигурация клиента
dev tun
ifconfig 10.8.0.2 10.8.0.1
remote 111.111.111.111
secret /etc/openvpn/keys/static.key 1

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

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

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

$ sudo systemctl start openvpn-client@static.service
$ sudo systemctl enable openvpn-client@static.service

У меня при просмотре статуса службы было предупрежение, что используемый шифр не безопасен

WARNING: INSECURE cipher with block size less than 128 bit (64 bit). This allows attacks like SWEET32.
Mitigate by using a --cipher with a larger block size (e.g. AES-256-CBC).

Есть смысл последовать совету и добавить в файлы конфигурации сервера и клиента две директивы

# вместо шифра по умолчанию используем более надежный, для большей безопасности
cipher AES-256-GCM
# отключаем согласование шифров между клиентом и сервером, потому что в этом нет
# необходимости — мы четко указываем клиенту и серверу, какой шифр использовать
ncp-disable

Настройка gateway1

Вообще, сервер gateway1 у нас уже настроен, но давайте вспомним, что мы делали в пятой части.

По умолчанию транзитный трафик отключен, так что редактируем файл /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 enp0s8 -o enp0s3 -s 192.168.150.0/24 ! -d 192.168.250.0/24 -j ACCEPT # enp0s8 -> enp0s3
$ sudo iptables -A FORWARD -i enp0s3 -o enp0s8 -d 192.168.150.0/24 -j ACCEPT # enp0s3 -> enp0s8
$ sudo iptables -A FORWARD -i enp0s8 -o tun0 -s 192.168.150.0/24 -d 192.168.250.0/24 -j ACCEPT # enp0s8 -> tun0
$ sudo iptables -A FORWARD -i tun0 -o enp0s8 -s 192.168.250.0/24 -d 192.168.150.0/24 -j ACCEPT # tun0 -> enp0s8

Теперь настроим SNAT (подмена адреса источника):

$ sudo iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE

Созданные нами правила пропадут при перезагрузке gateway2. Так что их нужно сохранить и восстанавливать при перезагрузке.

$ sudo apt install iptables-persistent

Настройка gateway2

Вообще, сервер gateway2 у нас уже настроен, но давайте вспомним, что мы делали в пятой части.

По умолчанию транзитный трафик отключен, так что редактируем файл /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 enp0s8 -o enp0s3 -s 192.168.250.0/24 ! -d 192.168.150.0/24 -j ACCEPT # enp0s8 -> enp0s3
$ sudo iptables -A FORWARD -i enp0s3 -o enp0s8 -d 192.168.250.0/24 -j ACCEPT # enp0s3 -> enp0s8
$ sudo iptables -A FORWARD -i enp0s8 -o tun0 -s 192.168.250.0/24 -d 192.168.150.0/24 -j ACCEPT # enp0s8 -> tun0
$ sudo iptables -A FORWARD -i tun0 -o enp0s8 -s 192.168.150.0/24 -d 192.168.250.0/24 -j ACCEPT # tun0 -> enp0s8

Теперь настроим SNAT (подмена адреса источника):

$ sudo iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE # SNAT для enp0s3

Созданные нами правила пропадут при перезагрузке gateway2. Так что их нужно сохранить и восстанавливать при перезагрузке.

$ sudo apt install iptables-persistent

Добавляем маршруты

Редактируем файл конфигурации сервера:

$ sudo nano /etc/openvpn/server/static.conf
# минимальная конфигурация сервера
dev tun
ifconfig 10.8.0.1 10.8.0.2
local 111.111.111.111
secret /etc/openvpn/keys/static.key 0

# вместо шифра по умолчанию используем более надежный, для большей безопасности
cipher AES-256-GCM
# отключаем согласование шифров между клиентом и сервером, потому что в этом нет
# необходимости — мы четко указываем клиенту и серверу, какой шифр использовать
ncp-disable

# маршрут до сети за клиентом
route 192.168.250.0 255.255.255.0
$ sudo systemctl restart openvpn-server@static.service

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

$ sudo nano /etc/openvpn/client/static.conf
# минимальная конфигурация клиента
dev tun
ifconfig 10.8.0.2 10.8.0.1
remote 111.111.111.111
secret /etc/openvpn/keys/static.key 1

# вместо шифра по умолчанию используем более надежный, для большей безопасности
cipher AES-256-GCM
# отключаем согласование шифров между клиентом и сервером, потому что в этом нет
# необходимости — мы четко указываем клиенту и серверу, какой шифр использовать
ncp-disable

# маршрут до сети за сервером
route 192.168.150.0 255.255.255.0
$ sudo systemctl restart openvpn-client@static.service

Файлы конфигурации

Мы использовали для настройки сервера и клиента минимально возможную конфигурацию. Для повышения безопасности и стабильности работы в файлы конфигурации желательно добавить еще несколько директив.

Редактируем файл конфигурации сервера:

$ sudo nano /etc/openvpn/server/static.conf
# минимальная конфигурация сервера
dev tun
ifconfig 10.8.0.1 10.8.0.2
local 111.111.111.111
secret /etc/openvpn/keys/static.key 0

# вместо шифра по умолчанию используем более надежный, для большей безопасности
cipher AES-256-GCM
# отключаем согласование шифров между клиентом и сервером, потому что в этом нет
# необходимости — мы четко указываем клиенту и серверу, какой шифр использовать
ncp-disable

# маршрут до сети за клиентом
route 192.168.250.0 255.255.255.0

# дополнительные настройки сервера
keepalive 10 60
ping-timer-rem
user nobody
group nogroup
persist-tun
persist-key
$ sudo systemctl restart openvpn-server@static.service

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

$ sudo nano /etc/openvpn/client/static.conf
# минимальная конфигурация клиента
dev tun
ifconfig 10.8.0.2 10.8.0.1
remote 111.111.111.111
secret /etc/openvpn/keys/static.key 1

# вместо шифра по умолчанию используем более надежный, для большей безопасности
cipher AES-256-GCM
# отключаем согласование шифров между клиентом и сервером, потому что в этом нет
# необходимости — мы четко указываем клиенту и серверу, какой шифр использовать
ncp-disable

# маршрут до сети за сервером
route 192.168.150.0 255.255.255.0

# дополнительные настройки клиента
keepalive 10 60
ping-timer-rem
user nobody
group nogroup
persist-tun
persist-key
$ sudo systemctl restart openvpn-client@static.service

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

С компьютера pc1 выполняем команду

$ 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=62 time=3.54 ms
64 bytes from 192.168.250.2: icmp_seq=2 ttl=62 time=4.34 ms
64 bytes from 192.168.250.2: icmp_seq=3 ttl=62 time=3.25 ms

--- 192.168.250.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 3.258/3.714/4.344/0.462 ms

С компьютера pc3 выполняем команду

$ 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=62 time=2.12 ms
64 bytes from 192.168.150.2: icmp_seq=2 ttl=62 time=3.34 ms
64 bytes from 192.168.150.2: icmp_seq=3 ttl=62 time=2.64 ms

--- 192.168.150.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 2.127/2.704/3.344/0.500 ms

Директивы конфигурации

Поскольку мы не указали директиву mode — будет использовано значение по умолчанию p2p, другими словами — point-to-point. Значение server для директивы mode включает режим сервера с многими клиентами.

Директива local в файле конфигурации сервера не обязательна, но полезна для маршрутизаторов с несколькими внешними интерфейсами. Если ее не указывать, OpenVPN будет слушать все сетевые интерфейсы.

По умолчанию OpenVPN работает по протоколу UDP на порту 1194. Если нужно использовать TCP — на стороне сервера нужно добавить в конфиг proto tcp-server, а на стороне клиента — proto tcp-client.

proto udp|tcp-server|tcp-client
Допускается использовать значения udp4, tcp4-server, tcp4-client — для работы по протоколу IPv4 и значения udp6, tcp6-server, tcp6-client — для работы по протоколу IPv6.

Для указания номера порта предназначена директива port, которая устанавливает значения сразу для lport и rport.

В файле конфигурации сервера директива lport устанавливает значение, на котором сервер будет принимать сообщения от клиента. В файле конфигурации клиента директива lport устанавливает значение, с которого клиент будет отправлять сообщения серверу. Как нетрудно догадаться, директива lport на клиенте несовместима с директивой nobind.

В файле конфигурации клиента директива rport должна иметь значение, на котором сервер готов принимать сообщения от клиента. Это значение используется в директиве remote. Но значение rport можно указать вторым параметром прямо в директиве remote.

Директива remote на клиенте задает ip-адрес или доменное имя сервера. Второй и третий необязательные параметры задают порт и протокол. Если порт не указан — он будет получен из директивы rport или будет использовано значение по умолчанию 1194. Протокол может принимать значения udp, tcp, udp4, tcp4, udp6, tcp6.

remote host [port] [proto]

В файле static.key находятся 2 пары 512 битных случайных ключей (в каждой паре ключ для шифрования и ключ для HMAC), записанные один за другим (без заголовков и прочего) и закодированные в HEX. Если для директивы secret не задать второй необязательный параметр — direction, то будет использоваться только первая пара ключей, т.е. в обе стороны трафик будет подписываться и шифроваться одинаковыми ключами.

Направление ключа шифрования может быть задано либо вторым параметром директивы secret, либо отдельной директивой key-direction.

Директива keepalive является макрокомандой и будет преобразована в директивы ping и ping-restart. В режиме p2p директиву нужно использовать как на стороне сервера, так и на стороне клиента. В режиме server директиву нужно указывать только на сервере — сервер сам отправит клиенту ping и ping-restart. При этом значения с сервера переопределят локальные значения клиента.

keepalive 10 60
 if mode server:
   ping 10
   ping-restart 120
   push "ping 10"
   push "ping-restart 60"
 else
   ping 10
   ping-restart 60
Поскольку протокол UDP не поддерживает установку соединения, сбой соединения определяется директивами ping и ping-restart.

Директива ping-timer-rem позволяет не выполнять ping-restart раньше времени — пока не подключится удаленный одноранговый узел.

Директивы user и group позволяют понизить права службы сервера и клиента — это нужно для повышения безопасности. Директивы persist-tun и persist-key обеспечивают правильную работу после понижения прав.

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