Установка и настройка Linux VPN-сервера

VPN – это шифрованный туннель, который устанавливается между вашим компьютером и специальным сервером. При работе с ВПН весь трафик передается в виде зашифрованных GRE пакетов как от вас к серверу так и и от сервера к вам. Сервер выступает в роли прозрачного прокси для всех интернет-протоколов. Для шифрования используется максимально стойкий на сегодняшний день алгоритм шифрования.
Установка Linux VPN-сервера

В базовых репозиториях CentOS пакет OpenVPN отсутствует, поэтому мы
подключим дополнительный репозиторий – EPEL, откуда его и поставим.
Устанавливаем OpenVPN
# yum -y install openvpn

Добавляем в автозагрузку при старте сервера
# chkconfig openvpn on

Настройка Linux VPN-сервера

Расположение директорий и файлов OpenVPN.
/usr/sbin/openvpn – Расположение бинарного файла OpenVPN;
/etc/openvpn/ – Расположение конфигурационного файла и ключей/сертификатов;
/usr/share/doc/openvpn-2.1/ – Масса примеров конфигурационных файлов OpenVPN на все случаи жизни;
/usr/share/openvpn/easy-rsa/ – Расположение набора скриптов генерации необходимых файлов для работы OpenVPN;
/var/run/openvpn/ – Расположение PID-файла OpenVPN;
/usr/lib/openvpn/plugin/lib/ – Несколько динамических библиотек;
var/log/openvpn.log – По умолчанию журналирование происходит в файл /var/log/messages, для OpenVPN мы заведем отдельный log-файл и расположен он будет в /var/log/

В данном модуле мы рассмотрим настройку VPN-сервера и нескольких клиентов, которые будут через него работать.

Сеть 192.168.146.0/24 является обычной незащищенной сетью. В это сети расположен наш будущий VPN-сервер с IP-адресом 192.168.146.150 (на нем есть DNS-сервер) и два клиента, один Linux-клиент другой Windows-клиент (Windows XP).

Сеть 10.10.10.0/24 будет нашей VPN-сетью, весь трафик в этой сети будет шифроваться. Это может быть сеть из частного набора сетей (10.0.0.0/8, 172.16.0.0/12 или 192.168.0.0/16, определенных в документах RFC 1918 и RFC 4193 найти которые можно на ietf.org) и которую вы еще не используете.

Когда в настройках OpenVPN сервера мы определяем VPN-сеть то первый IP-адрес из этой сети будет назначен VPN-серверу. Мы сделаем чтобы весь трафик клиентов ходил через VPN-сервер.
При настройке VPN-сети мы сгенерируем несколько ключей и сертификатов, которые будут использоваться для аутентификации. OpenVPN обладает большим функционалом, но вполне распространенная конфигурация может занимать 15-20 строчек для сервера и 10 строчек для клиента и вы это немного позже увидите.

В каталог /etc/openvpn/ скопируем набор скриптов для быстрой и легкой генерации всех необходимых ключей и сертификатов.
# cp -R /usr/share/openvpn/easy-rsa/2.0/ /etc/openvpn/

Переходим в каталог
# cd /etc/openvpn/2.0/

Открываем на редактирование файл vars и в самом его конце приводим переменные к такому виду:
export KEY_COUNTRY=»RU»
export KEY_PROVINCE=»RU»
export KEY_CITY=»Moscow»
export KEY_ORG=»company.ru»
export KEY_EMAIL=»support@company.ru»

Инициализируем переменные
# source ./vars

Очищаем директорию keys от старых файлов
# ./clean-all

Создаем ROOT CERTIFICATE AUTHORITY (CA) сертификат/ключ (в директории /etc/openvpn/2.0/keys/ будут созданы файлы ca.crt и ca.key)
# ./build-ca

Создаем ключ и сертификат для сервера (в директории /etc/openvpn/2.0/keys/ будут созданы файлы server.crt, server.key и server.csr). Формат команды: ./build-key-server ServerName – где ServerName это
название сервера.
# ./build-key-server server

Генерируем Diffie Hellman parameters для сервера. Суть алгоритма Diffie Hellman в том, чтобы наладить защищенное соединение по незащищенным каналам связи. По умолчанию длина файла 1024 бита, что очень даже достаточно. После выполнения этой команды будет создан файл /etc/openvpn/2.0/keys/dh1024.pem
# ./build-dh

Генерацией файлов для сервера закончено, теперь можно добавлять клиентов вот такой командой (будут созданы файлы client1.crt, client1.key и client1.csr). Благодаря тому, что мы уже отредактировали файл vars и указали значения переменных по умолчанию, нам в большинстве запросов на ввод данных достаточно будет просто нажать Enter.
# ./build-key client1

Generating a 1024 bit RSA private key
……++++++
……………..++++++
writing new private key to ‘client1.key’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [RU]: [Enter]
State or Province Name (full name) [RU]: [Enter]
Locality Name (eg, city) [Moscow]: [Enter]
Organization Name (eg, company) [company.ru]: [Enter]
Organizational Unit Name (eg, section) []:IT Dept
Common Name (eg, your name or your server’s hostname) [client1]: [Enter]
Name []:[Enter]
Email Address [support@company.ru]: [Enter]
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []: [Enter]
An optional company name []: [Enter]
Using configuration from /etc/openvpn/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName :PRINTABLE:’RU’
stateOrProvinceName :PRINTABLE:’RU’
localityName :PRINTABLE:’Moscow’
organizationName :PRINTABLE:’company.ru’
organizationalUnitName :PRINTABLE:’IT Dept’
commonName :PRINTABLE:’client1’
emailAddress :IA5STRING:’support@company.ru’
Certificate is to be certified until Apr 21 11:16:28 2019 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Common Name должно быть уникальным для всех.

Все необходимые файлы для VPN-сервера будут расположены в /etc/openvpn/ поэтому скопируем их туда из директории /etc/openvpn/2.0/keys/
# cp keys/{ca.crt,ca.key,server.crt,server.key,dh1024.pem} ../

Копируем шаблон конфигурационного файла VPN-сервера в /etc/openvpn/ и приводим его к конфигурации указанной ниже.
# cp /usr/share/doc/openvpn-2.1/sample-config-files/server.conf /etc/openvpn/
openvpn.conf

Содержание конфигурационного файла VPN-сервера (/etc/openvpn/
openvpn.conf ):
ocal 192.168.146.150
port 1194
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 10.10.10.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push «route 0.0.0.0 255.255.255.0»
push «dhcp-option DNS 192.168.146.150»
push «redirect-gateway»
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
verb 3
mute 10

Маршрут по умолчанию мы переписываем удаляя старый, для этого мы используем “redirect-gateway”, если захотите чтобы старый тоже остался то строчка push «redirect-gateway»
должна быть такой: push «redirect-gateway def1»

На VPN-сервере необходимо включить IP Forwarding, так как наш сервер будет маршрутизировать трафик.
# echo ‘1’ > /proc/sys/net/ipv4/ip_forward

Команда выше позволит сразу же начать маршрутизировать трафик, но состояние опции в момент перезагрузки сервера не сохраняется. Для того чтобы IP forwarding включить на постоянной основе необходимо отредактировать файл /etc/sysctl.conf

В файле /etc/sysctl.conf находим такую строку: net.ipv4.ip_forward = 0
и меняем ее на: net.ipv4.ip_forward = 1

Для того чтобы трафик VPN-клиентов достигший нашего сервера мог попадать в другие сети и успешно возвращаться нам нужно включить трансляцию сетевых адресов (NAT). Мы это сделаем с помощью iptables вот такой командой:
# iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE

В ключе -o указан наш сетевой интерфейс во внешние сети, в ключе -s указываем нашу VPN-сеть, у вас она может быть и другой. Также интересный момент – для моих Linux-клиентов NAT не понадобился, а вот если у вас есть Windows-клиенты то команда iptables необходима.

Настройка VPN-сервера закончена и мы можем его запустить.
# service openvpn start

Теперь сгенерированные файлы необходимо перенести на клиентскую машину. Крайне желательно это делать безопасным способом, чтобы файлы не были перехвачены злоумышленниками. На Linux-клиент файлы можно перенести с помощью команды scp, в этом случае весь передаваемые трафик
будет зашифрован. Находясь в директории /etc/openvpn/ выполните такую команду:
# scp ca.crt 2.0/keys/client1.key 2.0/keys/client1.crt client1@192.168.146.134:~

где client1 – ваш логин на удаленной машине а 192.168.146.134 – ее IP-
адрес. В результате выполнения этой команды на удаленный компьютер мы скопируем файл ca.crt – сертификат CA и сертификат/ключ клиента, они ему понадобятся чтобы подключаться к VPN-серверу.

Далее эти файлы нужно переместить в /etc/openvpn/ из под пользователя
root или другого имеющего право на запись в этом каталоге.

Готово.