0

OpenVPN – #( + Cloud Oracle )

01.01.2022

В нашем примере мы будем использовать бесплатный VPS от Oracle с Ubuntu 18.04, но данная инструкция подойдет для любых deb-based систем и с некоторыми поправками для любого другого Linux-дистрибутива.

Настройка сервера OpenVPN

Прежде всего установим OpenVPN и Easy-RSA для управления ключами:

apt install openvpn easy-rsa

Скопируем файлы easy-rsa в конфигурационную директорию OpenVPN и создадим символическую ссылку на файл настроек OpenSSL:

cp -r /usr/share/easy-rsa /etc/openvpn
ln -s /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf

Затем откроем файл /etc/openvpn/easy-rsa/vars и изменим в нем следующие строки, указав собственные данные для сертификатов, например, так:

export KEY_COUNTRY="US"
export KEY_PROVINCE="Wild West"
export KEY_CITY="Uncle Tom's Cabins"
export KEY_ORG="Uncle Tom"
export KEY_EMAIL="tom@example.com"
export KEY_OU="Cabin"

Сохраним файл и перейдем к созданию собственного центра сертификации (CA). Для этого перейдем в директорию нашего CA и загрузим переменные:

cd /etc/openvpn/easy-rsa
source ./vars

Очистим любые имеющиеся данные и инициализируем центр сертификации:

./clean-all
./build-ca

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

После чего в директории /etc/openvpn/easy-rsa/keys появится сертификат CA, содержащий публичный ключ, ca.crt, который должен присутствовать на каждом VPN-клиенте, и закрытый ключ центра сертификации ca.key, этот файл является секретным и не должен покидать пределы сервера.

Затем создадим файл параметров Диффи-Хеллмана, который нужен для формирования уникального сеансового ключа и обеспечения режима совершенной прямой секретности:

./build-dh

Данная операция, в зависимости от производительности вашего VPS, может занять достаточно много времени.

И, наконец, создадим ключевую пару для сервера:

./build-key-server server

где server – имя вашего сервера, мы рекомендуем давать осмысленные названия, чтобы потом не пришлось гадать, что именно это за ключевая пара и для чего она нужна.

На этом формирование необходимых ключей и сертификатов закончено, перейдем к настройке OpenVPN, прежде всего создадим директорию для хранения ключей. Можно, конечно, использовать ключи прямо из директории easy-rsa, но лучше отделить CA от остальных служб.

mkdir /etc/openvpn/keys

Теперь скопируем туда необходимые серверу ключи и сертификаты:

cd /etc/openvpn/easy-rsa/keys
cp ca.crt dh2048.pem server.crt server.key /etc/openvpn/keys

Распакуем и скопируем в директорию /etc/openvpn шаблон серверной конфигурации:

gzip -d /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn

Откроем файл /etc/openvpn/server.conf и внесем в него необходимые изменения, в большинстве случаев вам придется раскомментировать нужны строки или убедиться в их наличии. Опции указаны в порядке их следования в файле:

port 1194
proto udp
dev tun

Данные опции указывают порт, протокол и тип туннеля, менять их не следует, однако в ряде случаев может потребоваться использовать протокол tcp, но в силу более высоких накладных расходов этой ситуации желательно избегать.

Затем зададим топологию сети:

topology subnet

Укажем пути к ключам и сертификатам, допускаются относительные пути, в этом случае корнем будет считаться директория /etc/openvpn:

ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh2048.pem

Зададим диапазон OpenVPN-сети:

server 10.88.0.0 255.255.255.0

И укажем файл для хранения адресов клиентов, которые будут автоматически выдаваться сервером:

ifconfig-pool-persist /var/log/openvpn/ipp.txt

Автоматически сконфигурируем клиентов на доступ в интернет через OpenVPN-подключение:

push "redirect-gateway def1 bypass-dhcp"

И передадим им собственные DNS-сервера:

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

Укажем параметры проверки активности:

keepalive 10 120

Сервер будет проверять клиента каждые 10 секунд и при отсутствии ответа через 120 секунд клиент будет считаться неактивным.

Обязательно закомментируйте строку:

#tls-auth ta.key 0

Для сценария доступа в интернет дополнительная TLS-аутентификация будет излишней.

В последних версиях OpenVPN включен механизм автоматического согласования протоколов шифрования между клиентом и сервером, по умолчанию будет выбран шифр AES-256-GCM, но так как вычислительные возможности VPS обычно ограничены и большого смысла шифровать канал доступа в интернет сложными шифрами нет, то отключим соглассование и укажем достаточно простой AES-шифр:

ncp-disable
cipher AES-128-CBC

Также в новых версиях доступен новый механизм компрессии, для его включения укажем:

compress lz4-v2
push "compress lz4-v2"

Данная опция будет автоматически отправлена на клиент, что облегчает его конфигурирование.

Если у вас есть старые версии клиентов (ниже 2.4), то можно использовать простое lzo-сжатие, для этого закомментируйте вышеприведенные строки и добавьте:

comp-lzo

Эту опцию также потребуется добавить в конфигурационные файлы клиентов.

В целях безопасности понизим права запущенного сервера:

user nobody
group nogroup

После чего проконтролируем наличие опций, отвечающих за правильные права к некоторым ресурсам после их понижения:

persist-key
persist-tun

Укажем путь к файлам логов:

status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log

И укажем его подробность:

verb 3

Во время отладки можно поднять уровень логов до 5-6.

Настройка брандмауэра и маршрутизации

Основной задачей нашего сервера является обеспечение выхода в интернет и будет разумно обеспечить минимальный набор правил безопасности, во многом они будут повторять те правила, которые мы использовали для наших роутеров на базе Linux.

Создадим файл правил:

touch /etc/nat 

и внесем в него следующие строки, обратите внимание на имя сетевого интерфейса вашего VPS, в нашем случае это ens3:

#!/bin/sh

# Включаем форвардинг пакетов
echo 1 > /proc/sys/net/ipv4/ip_forward

# Сбрасываем настройки брандмауэра
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X


# Разрешаем инициированные нами подключения извне
iptables -A INPUT -i ens3 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Разрешаем подключения по SSH
iptables -A INPUT -i ens3 -p tcp --dport 22 -j ACCEPT

# Разрешаем подключения к OpenVPN
iptables -A INPUT -i ens3 -p udp --dport 1194 -j ACCEPT

#Запрещаем входящие извне
iptables -A INPUT -i ens3 -j DROP

# Разрешаем инициированные нами транзитные подключения извне
iptables -A FORWARD -i ens3 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Запрещаем транзитный трафик извне
iptables -A FORWARD -i ens3 -o tun0 -j DROP

# Включаем маскарадинг для локальной сети
iptables -t nat -A POSTROUTING -o ens3 -s 10.88.0.0/24 -j MASQUERADE

Не забудем сделать файл исполняемым:

chmod +x /etc/nat

Данный файл требуется запускать после создания туннельного интерфейса tun0, поэтому откроем конфигурационный файл сервера OpenVPN /etc/openvpn/server.conf и в его конце добавим опцию:

up /etc/nat

Перезагрузим сервер и убедимся, что OpenVPN сервер автоматически запустился и создал туннельный интерфейс, это можно сделать командой:

ip a

Также проверим применение правил брандмауэра:

iptables -L -vn

Следующий шаг касается только виртуальных машин в облаке Oracle Cloud, вам потребуется дополнительно разрешить входящий трафик на порт OpenVPN. Для этого перейдите в Сети » Виртуальные облачные сети » VirtualCloudNetwork-20191008-0144 » Сведения о списках безопасности, где вместо VirtualCloudNetwork-20191008-0144 будет имя вашей виртуальной сети. Затем добавьте новое правило для входящего трафика:

Укажите: Тип источника – CIDR, Исходный CIDR – 0.0.0.0/0, IP-протокол – UDP, Диапазон исходных портов – Все, Диапазон конечных портов – 1194.

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

Настройка клиента начинается на сервере с получения ключей и сертификатов клиента, для этого перейдем в директорию центра сертификации и загрузим переменные:

cd /etc/openvpn/easy-rsa
source ./vars

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

./build-key client

где client -имя клиента, мы также рекомендуем давать им осмысленные имена.

Теперь скопируем файлы, которые необходимо передать на компьютер клиента в домашнюю директорию и изменим их владельца (по умолчанию владелец – root), чтобы вы смогли их скопировать с помощью любого FTP или SFTP клиента. В нашем случае имя пользователя ubuntu:

cd /etc/openvpn/easy-rsa/keys
cp ca.crt client.crt client.key ~
cd ~
chown ubuntu:ubuntu ca.crt client.crt client.key

Помните, что закрытый ключ клиента client.key является секретным и следует избегать его передачи по открытым каналам связи.

Также не будет лишним сразу скопировать шаблон клиентской конфигурации:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client.ovpn

После чего скопируйте все эти файлы на клиент и установите на нем OpenVPN, в Windows системах советуем изменить путь установки OpenVPN на более короткий и без пробелов, скажем, C:\OpenVPN.

Затем откроем файл client.ovpn, который в Windows системах должен быть расположен в C:\OpenVPN\config, а в Linux в /etc/openvpn, и внесем в него следующие изменения:

client
dev tun
proto udp

Данные опции задают клиентский режим работы, тип туннеля и используемый протокол UDP.

Затем укажем адрес сервера:

remote 111.222.333.444 1194

Следующая опция предписывает клиенту постоянно разрешать имя OpenVPN-сервера, имеет смысл если мы указываем сервер по FQDN-имени, а не IP-адресу.

resolv-retry infinite

Для Linux систем обязательно укажите:

user nobody
group nogroup

В Windows данные опции следует обязательно закомментировать.

Проконтролируем наличие следующих опций:

persist-key
persist-tun

Укажем пути к ключам и сертификатам, для Linux систем подразумеваем их нахождение в /etc/openvpn/keys:

ca keys/ca.crt
cert keys/client.crt
key keys/client.key

Для Windows систем предположим их нахождение в C:\OpenVPN\keys:

ca C:\\OpenVPN\\keys\\ca.crt
cert C:\\OpenVPN\\keys\\client.crt
key C:\\OpenVPN\\keys\\client.key

Также обязательно закомментируем опцию:

#tls-auth ta.key 1

Включим защиту от атак типа “человек посередине”:

remote-cert-tls server

И укажем используемый шифр, он должен совпадать с указанным на сервере:

cipher AES-128-CBC

Остальные опции можно оставить без изменений. Сохраним файл и запустим OpenVPN-клиент.

Свежие комментарии

Подписка

Лучшие статьи


Fatal error: Uncaught Error: Call to a member function have_posts() on null in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php:380 Stack trace: #0 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/widget.php(257): fox56_blog_grid(NULL, Array) #1 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/register.php(33): include('/home/host18670...') #2 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/class-wp-widget.php(394): Wi_Widget_Latest_Posts->widget(Array, Array) #3 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/widgets.php(837): WP_Widget->display_callback(Array, Array) #4 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(417): dynamic_sidebar('sidebar') #5 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(136): fox56_single_sidebar() #6 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(7): fox56_single_inner() #7 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/single.php(23): fox56_single() #8 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/template-loader.php(106): include('/home/host18670...') #9 /home/host1867038/the-devops.ru/htdocs/www/wp-blog-header.php(19): require_once('/home/host18670...') #10 /home/host1867038/the-devops.ru/htdocs/www/index.php(17): require('/home/host18670...') #11 {main} thrown in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php on line 380