Установка OpenVPN на Ubuntu 18.04 LTS. Часть 9 из 12
31.07.2020
Теги: Linux • SSL • Ubuntu • VPN • Клиент • Ключ • Конфигурация • ЛокальнаяСеть • Маршрутизация • Настройка • Сервер • Установка
Static key и point-to-point
До этого момента мы говорили о режиме «сервер + клиенты» и применяли аутентификацию с помощью сертификатов. Но если нужно сделать простое соединение point-to-point
между двумя узлами — можно использовать режим p2p
. Кроме того, вместо сертификатов можно использовать static key
(аналог PSK авторизации).
У этой конфигурации есть некоторые недостатки:
- Ограниченная масштабируемость — один клиент, один сервер.
- Секретный ключ хранится в текстовой форме на каждом 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
ping
и ping-restart
.
Директива ping-timer-rem
позволяет не выполнять ping-restart
раньше времени — пока не подключится удаленный одноранговый узел.
Директивы user
и group
позволяют понизить права службы сервера и клиента — это нужно для повышения безопасности. Директивы persist-tun
и persist-key
обеспечивают правильную работу после понижения прав.
- Установка 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. Часть 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 • Ubuntu • VPN • Клиент • Ключ • Конфигурация • Локальная сеть • Маршрутизация • Настройка • Сервер • Установка • Сертификат