В наших прошлых материалах мы рассматривали применение OpenVPN исключительно для организации каналов связи между подразделениями организации. Но современный мир приносит новые вызовы, на которые следует реагировать. Один из них - общественные сети с низкой безопасностью, для работы в которых желательно иметь защищенный канал, препятствующий доступу третьих лиц к вашему трафику. Традиционно эта задача решается использованием VPN-сервисов и в данной статье мы расскажем, как организовать собственный сервис на базе OpenVPN.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Что нужно для создания собственного VPN-сервиса? Прежде всего потребуется VPS (виртуальный выделенный сервер). Для поиска недорогих VPS можно воспользоваться специальными сайтами, такими как Low End Box или бесплатными предложениями от облачных провайдеров. Так у Amazon и Microsoft можно бесплатно получить виртуальную машину на год, а Oracle предлагает две VPS бесплатно и навсегда.
В нашем примере мы будем использовать бесплатный 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-клиент.
Убедиться, что вы выходите в интернет через VPN-канал можно при помощи любого сервиса, показывающего ваш IP-адрес, например, 2ip.ru:
Обращаем внимание на национальную принадлежность адреса, в данном случае мы выходим в интернет из Штатов.
Самое время провести замер скорости доступа, мы будем использовать для этого популярный сервис SpeedTest. Первый замер без VPN:
Сразу обращаем внимание на выросший пинг - это последствия размещения сервера в Штатах, а также скорость скачивания не выше 10 Мбит/с - ограничение бесплатного тарифа Oracle, хотя в большинстве случаев этого вполне достаточно для комфортного серфинга.
Напоследок затронем еще один момент. Мы настроили сервер таким образом, что он автоматически конфигурирует клиента на доступ в интернет через OpenVPN-подключение, но бывают случаи, когда это не нужно. Допустим вы хотите пустить через VPN только некоторые ресурсы, а остальной доступ должен осуществляться через локального провайдера. В таком случае добавьте в конфигурационный файл клиента опцию:
route-nopull
После чего клиент будет игнорировать передаваемые с сервера опции маршрутизации и DHCP-опции, такие как DNS-сервера и т.п.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Последние комментарии