Настройка OpenVPN-сервера для доступа в интернет

  • Автор:

OpenVPN-internet-gateway-000.pngВ наших прошлых материалах мы рассматривали применение OpenVPN исключительно для организации каналов связи между подразделениями организации. Но современный мир приносит новые вызовы, на которые следует реагировать. Один из них - общественные сети с низкой безопасностью, для работы в которых желательно иметь защищенный канал, препятствующий доступу третьих лиц к вашему трафику. Традиционно эта задача решается использованием VPN-сервисов и в данной статье мы расскажем, как организовать собственный сервис на базе OpenVPN.

Кроме общественных сетей в последние годы стала приобретать повышенную актуальность проблема ограничения доступа к некоторым ресурсам исходя из географического расположения клиента. Это могут быть как ограничения регионального характера, например, популярный поставщик видеоконтента Netflix, так и блокировки со стороны органов власти, как яркий пример которых "ковровые блокировки" РКН в его борьбе с Телеграм, когда под ограничения попало большое количество совершенно легальных ресурсов.

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

Что нужно для создания собственного VPN-сервиса? Прежде всего потребуется VPS (виртуальный выделенный сервер) расположенный в регионе, из которого возможен неограниченный доступ к требуемым ресурсам. В большинстве случаев можно выбирать Европу или Штаты, но во втором случае задержки будут выше. На наш взгляд, выбирать Штаты имеет смысл, если вам требуется доступ к американским ресурсам, тому же Netflix или покупкам у американских продавцов на Amazon и Ebay.

Для поиска недорогих 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.

OpenVPN-internet-gateway-001.pngПосле чего в директории /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

OpenVPN-internet-gateway-002.pngТакже проверим применение правил брандмауэра:

iptables -L -vn

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

OpenVPN-internet-gateway-004.pngУкажите: Тип источника - 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:

OpenVPN-internet-gateway-005.pngОбращаем внимание на национальную принадлежность адреса, в данном случае мы выходим в интернет из Штатов.

Самое время провести замер скорости доступа, мы будем использовать для этого популярный сервис SpeedTest. Первый замер без VPN:

OpenVPN-internet-gateway-006.pngВторой через OpenVPN-канал:

OpenVPN-internet-gateway-007.pngСразу обращаем внимание на выросший пинг - это последствия размещения сервера в Штатах, а также скорость скачивания не выше 10 Мбит/с - ограничение бесплатного тарифа Oracle, хотя в большинстве случаев этого вполне достаточно для комфортного серфинга.

Напоследок затронем еще один момент. Мы настроили сервер таким образом, что он автоматически конфигурирует клиента на доступ в интернет через OpenVPN-подключение, но бывают случаи, когда это не нужно. Допустим вы хотите пустить через VPN только некоторые ресурсы, а остальной доступ должен осуществляться через локального провайдера. В таком случае добавьте в конфигурационный файл клиента опцию:

route-nopull

После чего клиент будет игнорировать передаваемые с сервера опции маршрутизации и DHCP-опции, такие как DNS-сервера и т.п.

Дополнительные материалы:


  1. Настраиваем VPN. Часть 1 - Общие вопросы
  2. Настраиваем VPN. Часть 2 - Cтруктура сети
  3. Настраиваем VPN сервер. Часть 3 - PPTP. Платформа Linux
  4. Настраиваем VPN сервер. Часть 4 - PPTP. Платформа Windows
  5. Настраиваем VPN сервер. Часть 5 - L2TP. Платформа Windows
  6. Ubuntu Server. Форвардинг PPTP средствами iptables
  7. Организация VPN каналов между офисами при помощи OpenVPN
  8. Организация каналов между офисами при помощи OpenVPN с дополнительной парольной защитой
  9. Организация VPN каналов между офисами. Маршрутизация
  10. Организация каналов между офисами при помощи OpenVPN на платформе Linux
  11. Настройка OpenVPN-сервера для доступа в интернет
  12. Настройка двух и более OpenVPN-серверов на одном сервере
  13. Почему тормозит OpenVPN? Размер буферов приема и отправки
  14. SSH-туннели на службе системного администратора