Абстрактный скриншот, характеризующий процесс установки VPN

Установка и настройка VPN на CentOS 7 для доступа в интернет

Настроить VPN на сервере для того, чтобы с его помощью выходить в интернет очень легко. По крайней мере так пишут на всех сайтах. На деле оказывается много подводных камней. И безопасность сервера иногда бывает под угрозой. Представляю вам пошаговую инструкцию — как настроить VPN на сервере и как с его помощью обеспечить доступ в интернет с мобильных телефонов на операционных системах Android и iOS и компьютерах под управлением Windows 10 (равно как и Windows 7 и более старших).

Описание процесса. Шаги настройки

Я против того, чтобы бездумно копировать команды в терминал и не понимать, что происходит. Поэтому постараюсь объяснить что мы сейчас будем делать. Если в двух словах, то нам нужно сделать следующее:

  1. Установить всё нужное программное обеспечение на сервер
  2. Произвести все необходимые настройки программ на сервере
  3. Создать центр сертификации на сервере. Он позволит давать ключи и серверам (одному или многим, и клиентам).
  4. Сгенерировать ключи на сервере. Подписать их ключами центра сертификации.
  5. Изменить настройки файрвола так, чтобы сервер не блокировал VPN. И чтобы запросы от нашего клиентского компьютера попадали в интернет и обратно.
  6. Сгенерировать клиентские ключи (те, которые будут на нашем клиенте).
  7. Обеспечить запуск и загрузку серверного программного обеспечения VPN. Его автозапуск.
  8. Установить необходимое программное обеспечение на клиенте. То есть, упрощенно, на нашем компьютере под Windows 10
  9. Установить ключи с сервера на клиенте и запустить VPN.

А теперь обо всём подробнее

Установка программного обеспечения VPN на сервер

В качестве VPN-сервера будем использовать OpenVPN, в качестве программы для создания и ведения инфраструктуры открытых ключей (PKI) в openVPN — Easy-RSA.

Добавляем репозиторий EPEL и обновляем все пакеты

yum install epel-release -y
yum update -y

В случае, если EPEL у вас уже был установлен, ничего страшного не произойдет.

Библиотека для OpenVPN на Centos

Установим последние версии программного обеспечения — OpenVPN и Easy-RSA 3

yum install openvpn easy-rsa -y

Сразу же поставим программу zip для создания архивов. Вдруг у вас ее нет. Она нам пригодится в дальнейшем.

yum install zip unzip -y

Настройка программ на сервере. Easy-RSA 3 и OpenVPN

Для начала скопируем все данные из каталога easy-rsa в каталог openvpn

cp -r /usr/share/easy-rsa /etc/openvpn/

Создадим описание нашего сертификата. Для этого перейдем в каталог /etc/openvpn/easy-rsa/3/ и создадим файл vars, в который впишем актуальные для нас данные (помечены цветом)

cd /etc/openvpn/easy-rsa/3/
vi vars

Содержимое файла:

set_var EASYRSA "$PWD"
set_var EASYRSA_PKI "$EASYRSA/pki"
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_REQ_COUNTRY "RU"
set_var EASYRSA_REQ_PROVINCE "Vash gorod"
set_var EASYRSA_REQ_CITY "Vash gorod"
set_var EASYRSA_REQ_ORG "Vasha organizatiya"
set_var EASYRSA_REQ_EMAIL "admin@yourserver.ru"
set_var EASYRSA_REQ_OU "IT department"
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_ALGO rsa
set_var EASYRSA_CA_EXPIRE 7500
set_var EASYRSA_CERT_EXPIRE 3650
set_var EASYRSA_NS_SUPPORT "no"
set_var EASYRSA_NS_COMMENT "CERTIFICATE AUTHORITY"
set_var EASYRSA_EXT_DIR "$EASYRSA/x509-types"
set_var EASYRSA_SSL_CONF "$EASYRSA/openssl-1.0.cnf"
set_var EASYRSA_DIGEST "sha512"

Делаем файл исполняемым

chmod +x vars

Генерация ключа VPN на сервере

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

cd /etc/openvpn/easy-rsa/3/
./easyrsa init-pki

Теперь нам надо придумать главный пароль для наших ключей. Он пригодится во время выполнения следующей команды. Еще система предложит ввести имя для нашего создаваемого центра сертификации, можно согласиться на то, что она предлагает (нажать Enter).

./easyrsa build-ca

Скрин - генерация ключа центра сертификации для VPN

Создадим ключ сервера с учетом того, что название сервера srv-openvpn

./easyrsa gen-req srv-openvpn nopass

nopass — для того, чтобы сервер сертификации работал без пароля. Не стоит переживать, обращение к нему только внутри машины. Не забудьте внутри команды нажать Enter на предложенном имени.

Скриншот создание ключей для сервера OpenVPN. Центр сертификации

Теперь система создала два файла для нашего сервера. Один из них, srv-openvpn, необходимо подписать

./easyrsa sign-req server srv-openvpn

Не забыли еще пароль, который придумали выше? Он нам потребуется, чтобы воспользоваться «услугами» центра сертификации и подписать ключи для нашего сервера (да, сложно, но конец уже близок!). Но прежде система попросит вас впечатать слово «yes» чтобы убедиться, что ключи вы выдаете вполне сознательно.

Сертификат VPN

Я же говорил, что уже почти всё! ). В итоге:

  • Корневой сертификат находится в файле: ‘pki/ca.crt’
  • Закрытый ключ сервера: ‘pki/private/srv-openvpn.key’
  • Сертификат сервера: ‘pki/issued/srv-openvpn.crt’

Обеспечение безопасности для передачи данных через VPN

Одних ключей мало. Чтобы данные не были перехвачены и использованы злоумышленниками против нашего сервера, необходимо сгенерировать так называемый ключ Диффи-Хеллмана. Внимание! Времени на генерацию может потребоваться очень много!

./easyrsa gen-dh

Рисует множество точек, в промежутках — плюсы

Ключ Диффи-Хеллмана

Отзыв клиентских сертификатов ключей VPN

Если мы в дальнейшем планируем отзывать клиентские сертификаты (а мы планируем! Мало ли что!), нам еще необходимо сгенерировать CRL ключ. Не забудьте про пароль, который мы уже использовали:

./easyrsa gen-crl

Теперь, если вдруг нам надо будет отозвать сертификат (ЭТУ КОМАНДУ ПОКА НЕ ВВОДИТЕ! Пригодится когда нужна будет).

./easyrsa revoke client-ban

client-ban — имя ключей пользователя, которые надо отозвать. Например client-01, client-02 и т.д.

Создание ключей клиентов

Клиентам можно давать номера. 01, 02 и т.д. Теперь посмотрим как создать комплект ключей для клиента 01. Все остальные — аналогично. Процесс полностью повторяет шаги в главе выше. Тоже надо сначала создать ключ, а потом его подписать. В процессе подписания сначала ввести «yes», а потом пароль от центра сертификации.

./easyrsa gen-req client-01 nopass
./easyrsa sign-req client client-01

Копирование готовых ключей в рабочие каталоги OpenVPN

Все ключи созданы, теперь их надо переместить по каталогам. Туда, где они потребуются.

cp pki/ca.crt /etc/openvpn/server/
cp pki/issued/srv-openvpn.crt /etc/openvpn/server/
cp pki/private/srv-openvpn.key /etc/openvpn/server/

Сертификаты клиента

cp pki/ca.crt /etc/openvpn/client/
cp pki/issued/client-01.crt /etc/openvpn/client/
cp pki/private/client-01.key /etc/openvpn/client/

Ключи DH и CRL

cp pki/dh.pem /etc/openvpn/server/
cp pki/crl.pem /etc/openvpn/server/

Редактирование конфигурации OpenVPN сервера

Создадим файл конфигурации

cd /etc/openvpn/
vi server.conf

Содержимое файла:

# OpenVPN Port, Protocol and the Tun
port 1194
proto udp
dev tun

# OpenVPN Server Certificate - CA, server key and certificate
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/srv-openvpn.crt
key /etc/openvpn/server/srv-openvpn.key

# DH and CRL key
dh /etc/openvpn/server/dh.pem
crl-verify /etc/openvpn/server/crl.pem

# Network Configuration - Internal network
# Redirect all Connection through OpenVPN Server
server 10.10.1.0 255.255.255.0
push "redirect-gateway def1"

# Using the DNS from https://dns.watch
push "dhcp-option DNS 84.200.69.80"
push "dhcp-option DNS 84.200.70.40"

# Enable multiple client to connect with same Certificate key
duplicate-cn

# TLS Security
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache

# Other Configuration
keepalive 20 60
persist-key
persist-tun
comp-lzo yes
daemon
user nobody
group nobody

# OpenVPN Log
log-append /var/log/openvpn.log
verb 3

Настройка файрвола

Активируем модуль ядра port-forwarding

 echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
 sysctl -p

Должно быть net.ipv4.ip_forward = 1

Добавим службу openvpn в firewalld, и интерфейс tun0 в доверенную зону

firewall-cmd --permanent --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-interface=tun0

Активируем ‘MASQUERADE’ для доверенной зоны firewalld

firewall-cmd --permanent --zone=trusted --add-masquerade

Активируем NAT

SERVERIP=$(ip route get 84.200.69.80 | awk 'NR==1 {print $(NF-2)}')
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.10.1.0/24 -o $SERVERIP -j MASQUERADE

Перезапустим firewalld

firewall-cmd --reload

Запустим OpenVPN и добавим его в автозагрузку

systemctl start openvpn@server
systemctl enable openvpn@server

Проверим

netstat -plntu
open vpn порт

Настройка OpenVPN клиента (Windows, Android и т.д.)

Сначала на сервере нам необходимо подготовить файлы для передачи клиенту

Создадим файл конфигурации client-01.ovpn

cd /etc/openvpn/client
vi client-01.ovpn

Содержимое файла (замените xxx.xxx.xxx.xxx IP-адресом вашего сервера! ):

client
dev tun
proto udp

remote xxx.xxx.xxx.xxx 1194

ca ca.crt
cert client-01.crt
key client-01.key

cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256

resolv-retry infinite
compress lzo
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3

Теперь для надо заархивировать сертификаты (ca.crt, client-01.crt), ключ клиента (client-01.key), файл конфигурации (client-01.ovpn), и передать их на ПК, который будет подключаться к OpenVPN серверу

cd /etc/openvpn/
zip client/client-01.zip client/*

Настройка Windows

Скачиваем дистрибутив клиента для Windows здесь — https://openvpn.net/community-downloads/   Устанавливаем.

Теперь нам надо перекачать содержимое файла  client-01.zip с сервера на машину с Windows. Этот zip-файл мы создали выше. Файлы, что внутри, положить в каталог C:\Program Files\openvpn\config

Пробуем подключиться с другого ПК к OpenVPN серверу и смотрим лог:

tail -f /var/log/openvpn.log

Если все нормально, интернет появится. По поисковому запросу «Мой Ip» в гугле можно убедиться, что мы теперь в интернете с IP адресом нашего сервера.

Решение проблем при установке VPN

Хотя проблемы возникают редко, чтобы сэкономить ваше время на поиск решений при настройке VPN вот вам краткий обзор некоторых проблем при установке

Сервис VPN не запускается

Посмотрите что находится в журнале

tail -f /var/log/openvpn.log

Скорее всего не хватает какого-нибудь файла, который мы копировали выше (команда cp). Вернитесь на шаги назад и проверьте — все ли файлы скопировались.

VPN подключился, но интернета нет

Скорее всего проблема в настройках NAT. Вернитесь к пункту «Активируем NAT» выше и перепроверьте снова

Сообщение FirewallD is not running

На вашей машине не запущен файрвол. Необходимо запустить его сервис (отдельный мануал 🙂 ). По умолчанию он не блокирует доступ через ssh (через telnet), но правила для http и https необходимо будет добавить, если на вашем сервере крутятся сайты. Это не сложно. Вот эти команды (плюсом еще доступ по ftp)

firewall-cmd --permanent --add-service=http

firewall-cmd --permanent --add-service=https

firewall-cmd --permanent --add-service=ftp

Плюс надо будет заново пройтись по секции с firewall-cmd этого текста (заново ввести правила и команды для файрвола).

Добавить комментарий