Поднимаем свой VPN с OpenVPN
Поднимаем VPN, используя OpenVPN и OpenVPN AS.
Al-Sher
Всем привет! Когда-то я писал статью о том, как сделать свой VPN, используя PPTP и сегодня я решил продолжить тему поднятия своего VPN-Сервера. Устанавливать я буду OpenVPN. Производить установку планирую на VPS от Fornex, приобретенный на черную пятницу, с установленной CentOS 7. Начнем.
OpenVPN
OpenVPN - Одна из реализаций VPN с открытым исходным кодом, позволяющая создавать зашифрованные сетевые каналы. OpenVPN поддерживает такие средства аутентификации, как Предустановленный ключ; Сертификатная аутентификация; С помощью логина и пароля. Сегодня мы попробуем использовать сертификатную аутентификацию, как наиболее удобной на мой взгляд.
Установка OpenVPN
Для начала нам необходимо подключить Epel-репозиторий, в котором можно будет найти OpenVPN:
yum install epel-release
Ну а теперь можно и сам OpenVPN установить:
yum install openvpn
Создание сертификатов
Как я уже говорил, для аутентификации пользователей мы будем использовать сертификаты. Для работы с сертификатами существует специальный набор скриптов - easy-rsa. Скачаем их:
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
и распакуем:
unzip master.zip
Заходим в папку со скриптами:
cd easy-rsa-master/easyrsa3
Скопируем файл vars.example, сохранив его как vars:
cp vars.example vars
И выполним инициализацию:
./easyrsa init-pki
Теперь можно приступить к генерации сертификатов. Для начала создадим удостоверяющий центр сертификатов:
./easyrsa build-ca
Вас попросят указать пароль к сертификату, а так же его название. Не стоит забывать пароль, ведь необходимо вводить каждый раз при создании сертификата OpenVPN. В итоге мы получим два файла:
- ca.key - секретный ключ;
- ca.crt - публичный.
Разумеется, секретный ключ мы надежно прячем на сервере и никому его не даем, а вот публичный ключ необходимо передавать клиентам вместе с пользовательскими сертификатами. Создадим запрос сертификата без пароля, используя nopass. Это избавит нас от необходимости вводить пароль сертификата при каждом запуске сервера:
./easyrsa gen-req server nopass
И подпишем его:
./easyrsa sign-req server server
Нас попросят подтвердить, что это нужный сертификат, а так же ввести пароль от удостовряющего центра сертификатов. Создадим еще и ключ Диффи-Хелмана:
./easyrsa gen-dh
Скопируем все наши сертификаты поближе к OpenVPN:
cp pki/ca.crt /etc/openvpn/ca.crt
cp pki/dh.pem /etc/openvpn/dh.pem
cp pki/issued/server.crt /etc/openvpn/server.crt
cp pki/private/server.key /etc/openvpn/server.key
Ну и создадим сертификаты для пользователя:
./easyrsa gen-req client nopass
./easyrsa sign-req client client
Настройка OpenVPN сервера
Файл настроек OpenVPN находится по пути /etc/openvpn/server.conf, но его нет... Давайте создадим, добавив него следующее содержимое:
port 1194
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
server 10.8.0.0 255.255.255.0
ifconfig 10.10.0.1 255.255.255.0
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
log-append openvpn.log
verb 3
push "redirect-gateway def1"
push "route 0.0.0.0 0.0.0.0"
push "dhcp-option DNS 8.8.8.8"
Откроем порт:
firewall-cmd --add-service openvpn --permanent
firewall-cmd --add-port=1194/tcp --zone=public --permanent
firewall-cmd --add-masquerade --permanent
firewall-cmd --reload
Проверим, включился ли masquerade:
firewall-cmd --query-masquerade
Если выводит yes, то всё хорошо. Подправим файл /etc/sysctl.conf, добавив в него следующую строку:
net.ipv4.ip_forward = 1
Это позволит трафику ходить между интерфейсами, то есть откроет нам доступ в сеть из локальной сети. Применим изменения:
sysctl -p
И запускаем OpenVPN:
systemctl start openvpn@server
Настройка OpenVPN клиента
Пару шагов назад мы создавали сертификаты для пользователя. Вот теперь они нам и пригодятся, так как, благодаря им, пользователь будет авторизовываться. Начнем:
client
dev tun
remote IP 1194
proto tcp
persist-key
persist-tun
resolv-retry infinite
nobind
comp-lzo
verb 3
cipher AES-256-CBC
keysize 256
remote-cert-tls server
key-direction 1
<ca>
File /etc/openvpn/ca.crt
</ca>
<cert>
File pki/issued/client.crt
</cert>
<key>
File pki/private/client.key
</key>
Не забудьте поставить в этом конфиге IP вашего сервера(IP), а так же вставить содержимое указанных файлов. Таким образом мы создаем 1 файл, в котором сразу указаны и настройки клиента, и сертификаты. Если вы хотите разделить на файлы(то есть сертификаты раздавать файлами отдельно от конфига), то можно создать такую конфигурацию клиента:
client
dev tun
remote IP 1194
proto tcp
persist-key
persist-tun
resolv-retry infinite
nobind
comp-lzo
verb 3
cipher AES-256-CBC
keysize 256
remote-cert-tls server
key-direction 1
ca /Path/To/ca.crt
cert /Path/To/client.crt
key /Path/To/client.key
Альтернативна - OpenVPN AS
Если вам всё это показалось сложным, то можно воспользоваться альтернативным вариантом - OpenVPN AS. Данная версия OpenVPN имеет удобный web-интерфейс, а так же поставляется с двумя бесплатными лицензиями(пользователями). Для установки OpenVPN AS необходимо выполнить следующие команды:
wget http://swupdate.openvpn.org/as/openvpn-as-2.1.12-CentOS7.x86_64.rpm
rpm -i openvpn-as-2.1.12-CentOS7.x86_64.rpm
passwd openvpn
На этом установка завершена, осталось лишь открыть 943 порт(web-интерфейс), а так же необходимые для OpenVPN порты:
firewall-cmd --add-port=943/tcp --zone=public --permanent
firewall-cmd --add-port=443/tcp --zone=public --permanent
firewall-cmd --add-port=1194/udp --zone=public --permanent
firewall-cmd --reload
Заходим на указанный в выводе адрес и авторизовываемся под пользователем openvpn с указанным паролем. После авторизации вам предложат скачать конфиг. Авторизация, по-умолчанию, использует логин и пароль. То есть, кроме конфига, вам необходимо помнить ваш логин и пароль от вашего аккаунта OpenVPN.
Заключение
Надеюсь данная статья кому-нибудь пригодится и поможет поднять свой VPN сервер без всякого труда. Спасибо за внимание.
JAtf
Здравствуйте, мой комментарий несколько не в тему, но касается того как снять ограничение одновременных VPN соединений у стандартного microsoft’овского VPN сервиса. Расскажу только о том где и чего надо поправить: В разделе реестра «HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0003» должны присутствовать имена «ComponentId» и «MatchingDeviceId» с содержимым в обоих «ms_pptpminiport» могут попадаться случаи в которых эти имена находятся под другим номером «ветки» (0001, 0002,…) далее нам следует исправить «WanEndpoints» на 128(десятичное) и «MaxWanEndpoints» на 1000(десятичное) после этого нам следует исправить rasppp.dll файл, что находится в папке «system32», для всех строк поиска значения чисел 75 и 74 меняются на B8 Win7-x86 (6.1.7601.17514) — ищем по адресу 48D5 значения «75 07 83 0D» и по адресу 490E значения «74 07 83 0D» Win7-x64 (6.1.7601.17514) — ищем по адресу CC0F значения «75 07 83 0D» и по адресу CC48 значения «74 07 83 0D» Win10-x64 (10.0.18362.1) — ищем по адресу 40E2 значения «75 06 09 1D» и по адресу 411C значения «74 06 09 1D» Было замечено что после очередного обновления Win10 ветка реестра стала автоматически восстанавливаться после перезапуска службы «Диспетчер подключений удаленного доступа», а так-же после рекомендованных исправлений и вовсе перестала запускаться служба. Но решение похоже в очередной раз найдено… В реесте изменять ничего не требуется, необходимое место ищется так-же: находим последовательность «75 06 09 1d» и примерно в 32-х байтах позже должна быть последовательность «74 06 09 1d», далее смотрим немного ранее первой последовательности и находим там «0f 1f 44 00 00» и заменяем ее на «bb 80 00 00 00» тестировалось на версиях файлов 19041.1 и 19042.572