Thank you for reading this post, don't forget to subscribe!
Настройка приватного VPN сервера на базе OpenVPN
Проверяем наличие устройства tun
Установка EPEL-репозитория
yum install epel-release
Устанавливаем OpenVPN
yum -y install openvpn easy-rsa
Добавляем в автозапуск
centos6:
chkconfig openvpn on
centos7:
systemctl enable openvpn@service
Создаем файл конфигурации
cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/
Конфигурация OpenVPN
nano /etc/openvpn/server.conf
Указываем на каком IP будет работать OpenVPN сервер (тут 192.168.1.100 – внешний IP сервера):
local 192.168.1.100
Задаём OpenVPN сеть
server 10.0.0.0 255.255.255.0
Передаём параметр клиентам, благодаря которому весь их трафик будет направляться через OpenVPN
push "redirect-gateway def1 bypass-dhcp"
Теперь зададим DNS-сервера для клиентов:
позволяет клиентам openvpn подключаться друг к другу
Создание сертификатов для OpenVPN сервера
Для начала создадим директорию для сертификатов:
mkdir -p /etc/openvpn/easy-rsa/keys
Скопируем необходимые файлы:
cp -r /usr/share/easy-rsa/3.0.3/* /etc/openvpn/easy-rsa/
Для удобства отредактируем параметры, чтобы не вводить их при генерации сертификатов /etc/openvpn/easy-rsa/vars:
export KEY_COUNTRY="RU"
export KEY_PROVINCE="NW"
export KEY_CITY="Moscow"
export KEY_ORG="OrgName"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"
# X509 Subject Field
export KEY_NAME="EasyRSA"
описание параметров:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 |
export KEY_SIZE=1024 // Длина ключа export CA_EXPIRE=3650 // Время действия главного ключа в днях export KEY_EXPIRE=3650 // Время действия сертификата в днях export KEY_COUNTRY="RU" // Страна export KEY_PROVINCE="Moscow" // Регион export KEY_CITY="Moscow" // Город export KEY_ORG="TELEOFIS" // Организация export KEY_EMAIL="support@teleofis.ru" // Электронный ящик export KEY_OU="server" // Подразделение export KEY_NAME="server" // Имя ключа |
[/codesyntax]
Генерируем сертификаты
Переходим в созданную нами директорию для сертификатов
cd /etc/openvpn/easy-rsa
Инициализируем PKI:
./easyrsa init-pki
Создаем корневой сертификат:
./easyrsa build-ca
* после вводим дважды пароль и имя сервера.
Формируем ключ Диффи-Хелмана:
./easyrsa gen-dh
Переименовываем его:
mv /etc/openvpn/dh.pem /etc/openvpn/dh2048.pem
Создаем запрос на сертификат для сервера и после генерируем сам сертификат:
./easyrsa gen-req vpn-server nopass
./easyrsa sign-req server vpn-server
* после ввода команды подтверждаем правильность данных, введя yes и вводим пароль, который указывали при создании корневого сертификата.
* nopass можно упустить, если хотим повысить безопасность с помощью пароля на сертификат.
Создадим файл HMAC, для дополнительной верификации клиента и сервера
/usr/sbin/openvpn --genkey --secret /etc/openvpn/ta.key
Файл ta.key должен быть скопирован и передан клиенту
Активируем IP-форвардинг в sysctl, отредактировав файл sysctl.conf для редактирования:
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
Далее копируем все файлы:
cp -rf /etc/openvpn/easy-rsa/pki/* /etc/openvpn/
Создание пользовательских ключей:
/etc/openvpn/easy-rsa/easyrsa gen-req user1 nopass
* nopass можно упустить, если хотим повысить безопасность с помощью пароля на сертификат.
Необходимо будет ввести пароль который задавался при создании приватного ключа
/etc/openvpn/easy-rsa/easyrsa sign-req client user1
ключи которые необходимы клиенту:
/etc/openvpn/easy-rsa/pki/issued/user1.crt
/etc/openvpn/easy-rsa/pki/private/user1.key
/etc/openvpn/ta.key
Отзыв сертификата
Для того, чтобы отозвать сертификат user1:
/etc/openvpn/easy-rsa/easyrsa revoke user1
При этом будет создан новый файл crl.pem, который обязательно надо скопировать в директорию /etc/openvpn, заменив старый и перезапустить сервер OpenVPN.
при старте, в случае ошибок, закомментируйте
explicit-exit-notify 1crl-verify crl.pem в файле /etc/openvpn/server.conf
service openvpn start
если centos 7 :
systemctl start openvpn@service
Настройка IPTABLES
1 2 3 |
iptables -I INPUT 1 -p udp --dport 1194 -j ACCEPT iptables -I FORWARD -i eth0 -o tun0 -j ACCEPT iptables -I FORWARD -i tun0 -o eth0 -j ACCEPT |
1 |
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE |
Настройка клиента
Независимо от операционной системы вашего клиентского компьютера для этого потребуется локально сохраненная копия сертификата ЦС, ключа клиента и сертификата, а также статического ключа шифрования.
На сервере найдите следующие файлы. Если вы создали несколько клиентских ключей с уникальными описательными именами, имена ключей и сертификатов будут отличаться.
/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/pki/issued/user1.crt
/etc/openvpn/easy-rsa/pki/private/user1.key
/etc/openvpn/ta.key
/etc/openvpn/ca.crt
Скопируйте эти файлы на клиентскую машину. Вы можете использовать SFTP или любой другой метод. Вы даже можете просто открыть файлы в текстовом редакторе, скопировать и вставить содержимое в новые файлы на клиентской машине. Независимо от того, какой метод вы используете, запомните расположение этих файлов.
На клиенте создайте файл client.ovpn.
В этот файл добавьте следующие строки. Обратите внимание, многие из этих строк отражают строки, которые мы раскомментировали или добавили в файл server.conf.
client
dev tun
proto udp
remote IP_SERVER 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert user.crt
key user.key
tls-auth ta.key 1
topology subnet
tls-client
pull
keysize 256
cipher AES-256-CBC
tun-mtu 1500
server.conf имеет следующий вид:
cat /etc/openvpn/server.conf | grep -vE "^#|^;|^$"
local IP_SERVER
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
client-to-client
duplicate-cn
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3
explicit-exit-notify 1
crl-verify crl.pem
При добавлении этих строк обратите внимание на следующее:
- В первой строке вам нужно будет указать имя, которое вы дали клиенту в ключе и сертификате; в нашем случае это client.
- Также необходимо обновить IP-адрес; порт 1194 можно оставить.
- Убедитесь, что пути к вашим ключам и файлам сертификатов указаны верно.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
port 1194 # дефолтный порт proto upd # используемый протокол dev tun # "dev tun" --- для IP-туннеля ca ca.crt # CA-сертификат cert server_name.crt # сертификат сервера key server_name.key # приватный ключ сервера dh dh1024.pem # ключ Diffie Hellman server 10.8.0.0 255.255.255.0 # используемая подсеть ifconfig-pool-persist ipp.txt # файл с адресами клиентов push "redirect-gateway" # перенаправлять весь трафик через VPN keepalive 10 120 # пинговать каждые 10 сек, # если нет ответа 120 сек --- отваливаться comp-lzo # использовать сжатие user nobody # на всякий случай даем как можно меньше прав group nogroup persist-key # не перечитывать ключи persist-tun # не переоткрывать tun-device log-append /var/log/openvpn.log # лог-файл verb 4 # уровень детализации лога клиент |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
client # указываем, что это клиент dev tun # на сервере и клиенте должно совпадать proto udp # на сервере и клиенте должно совпадать remote a.b.c.d 1194 # адрес и порт сервера resolv-retry infinite # пытаться достучаться до сервера бесконечно nobind # не использовать какой-то особый порт user nobody # на всякий случай даем как можно меньше прав group nogroup # на всякий случай даем как можно меньше прав persist-key # не перечитывать ключи persist-tun # не переоткрывать tun-device mute-replay-warnings # подавлять предупреждения о повторных пакетах ca ca.crt # CA-сертификат cert client_name1.crt # сертификат клиента key client_name1.key # приватный ключ клиента comp-lzo # на сервере и клиенте должно совпадать log-append /var/log/openvpn.log # лог-файл verb 4 # уровень детализации лога |
Этот файл теперь можно использовать на клиентах OpenVPN для подключения к серверу. Ниже приведены инструкции по подключению клиента
Windows
В Windows вам понадобятся официальные двоичные файлы OpenVPN Community Edition, которые поставляются с графическим интерфейсом. Поместите файл конфигурации .ovpn в соответствующий каталог, C:\Program Files\OpenVPN\config, и нажмите Connect в интерфейсе. OpenVPN GUI для Windows нужно выполнять с правами администратора.
Выбор устройства openvpn — TAP или TUN
В моей конфигурации я использую tun интерфейс. В чем отличие tun от tap можно прочитать на википедии. Если вам нужно объединить две разные локальные сети в одну условно общую, но с разной адресацией, то вам нужен tun. То есть в нашем случае мы объединяем две сети 192.168.10.0/24 и 192.168.20.0/24 для взаимного совместного доступа.
Если же у вас стоит задача объединить 2 удаленные сети в единое адресное пространство, например сделать и в офисе и в филиале единую сеть 192.168.10.0/24, то тогда бы мы использовали tap интерфейс и указывали бы на компьютерах в обоих сетях не пересекающиеся адреса из одной подсети. В таком состоянии openvpn работает в режиме моста.
Выбор подсети
По умолчанию в настройках OpenVPN используется подсеть 10.8.0.0/24, которая может быть изменена на любую из частных подсетей.
- 10.0.0.0
- 172.16.0.0
- 192.168.0.0
Подсети могут использоваться с масками /8, /16, /24 или 255.0.0.0, 255.255.0.0, 255.255.255.0, соответственно.
--- ---------- -------
описание:
- ca.crt – главный CA сертификат, этот файл нужен всем клиентам и всем openvpn-серверам. С помощью него договаривающиеся стороны (сервер и клиент) проверяют подписи полученных публичных ключей на предмет принадлежности нашей организации;
- ca.key – главный CA ключ. Этот файл нужен только центру сертификации, так как им подписываются все публичные ключи-сертификаты организации. Он не учавствует в обеспечении безопасного канала. Он нужен эпизодически только для выпуска ключей (шибко СЕКРЕТНЫЙ файл). Хочу заметить, что открытое хранение этого файла на openvpn-сервере позволит вероятному злоумышленнику украсть этот файл и выпустить произвольное количество ключей, с помощью которых можно будет беспрепятственно подключаться к нашим openvpn-серверам.
Одноразово делаем файл для дополнительной безопасности openvpn-канала:
- ta.key – TLS-ключ, который нужен и openvpn-клиентам и openvpn-серверам для пущей безопасности. Можно и без него, но он помогает блокировать DoS атаки и UDP флудинг на открытый порт сервера.
Ещё сделаем три файла для конкретного openvpn-сервера. Эти файлы необходимо сгенерировать для каждого openvpn-сервера в нашей сетке. В принципе, можно изменить имена этих файлов в соответствии с сетевыми именами openvpn-серверов. Но, как мне кажется, в целях унификации конфигурационного файла и прочих настроек, которые мы можем централизованно распространять на все openvpn-сервера, будет удобней не изменять имена этих файлов:
- server.crt – сертификат сервера, нужен только серверу;
- server.key – ключ сервера, нужен только серверу (СЕКРЕТНЫЙ файл);
- dh1024.pem – ключ имени Диффи и Хельмана. Этот файл нужен только серверу. Наверное, используется на этапе предварительного обмена открытыми ключами (сертификатами).
И ещё надо сгенерировать пару файлов для первого клиента. Обычно, имена этих файлов соответствуют имени клиента, указанному при генерации. Поэтому для удобства идентификации клиента, необходимо выработать систему присвоения имён, чтобы потом было проще ориентироваться в логах и прочих моментах. Например, в моём случае, я раздаю людям готовые openvpn-комплекты для каждого из их компьютеров. Поэтому придумываю имя исходя из такого правила – idорганизации-idклиента-idмашины. И когда приходит время отозвать ключи определённого юзера, то в папке с выданными сертификатами, при обычной сортировке по имени файла, я увижу все сертификаты юзера идущими по порядку. Ну а в данном опусе, не заморачиваясь, укажу:
- client.crt – сертификат клиента. Этот файл нужен клиенту для установки соединения с openvpn-сервером;
- client.key – ключ клиента, нужен только клиенту (СЕКРЕТНЫЙ файл).
Сертификат центра сертификации находится как на стороне сервера, так и на стороне клиента и учавствует в создании туннеля.
Приватный ключ центра сертификации чрезвычайно секретный и не должен попасть в чужие руки. В создании туннеля он не используется. Если я правильно понимаю, то приватным ключом центра сертификации подписываются ключи новых клиентов, поэтому файл ca.key желательно изымать из этой папки после окончания генерации ключей, затирая убитую копию shred'ом. Или же папку easy-rsa размещать в секретном криптохранилище, где и производить по необходимости эпизодические работы по выпуску ключей.
- KEY_CN: введите домен или поддомен, который разрешается на ваш сервер.
- KEY_NAME: введите сюда server. Если вы введете другое имя, вам придется обновлять файлы конфигурации, которые ссылаются на server.key и server.crt.
- KEY_COUNTRY: введите двухбуквенную аббревиатуру страны проживания.
- KEY_PROVINCE: штат/область/регион.
- KEY_CITY: город.
- KEY_ORG: название вашей организации.
- KEY_EMAIL: электронная почта, которая будет привязана к сертификату.
- KEY_OU: Organizational Unit – название команды и отдела, для которого предназначен сертификат.