понедельник, 5 октября 2015 г.

Настройка сервера ОpenVPN на базе Ubuntu 14.04 и выход через него в Интернет




В данной статье я расскажу, как настроить на сервере OpenVPN.

Может возникнуть необходимость выходить в сеть Интернет с не российским IP-адресом. Для этого подойдет почти любой VPS. Например, можно рассмотреть варианты VPS предлагаемые https://www.leaseweb.com или https://www.digitalocean.com



Итак, VPS с Ubuntu оплачен и развернут, приступаем к настройке.


Установка и настройка сервера OpenVPN

Для начала обновим систему и установим необходимые пакеты.

# apt-get update
# apt-get upgrade
# apt-get install openvpn
# apt-get install procinfo




Файл конфигурации OpenVPN

Идем в базовый каталог openvpn:

# cd /etc/openvpn


Создаем файл конфигурации сервера OpenVPN:

# touch server.conf


Вносим в файл следующее содержимое:

dev               tun
local             12.34.56.78 # вписываем тут Ip адрес вашего сервера
port              1195  # используемый порт
proto             tcp   # используемый протокол, также можно использовать udp
server            10.8.0.0 255.255.255.0   # указываем подсеть из которой будут выдаться ip адреса клиентам
push              "redirect-gateway def1"  # указываем, что на клиенте должен измениться маршрут по умолчанию
push              "dhcp-option DNS 8.8.8.8"  # указываем, какие DNS будут использоваться на клиенте
client-config-dir /etc/openvpn/ccd   # директория файлов конфигурации клиентов 
# client-to-client # прописываем данную опцию, если хотите, чтобы клиенты openvpn «видели» друг друга.
tls-server
dh                /etc/openvpn/dh2048.pem  # прописываем пути к сертификатам
ca                /etc/openvpn/CA_cert.pem
cert              /etc/openvpn/certs/server.pem
key               /etc/openvpn/keys/server.pem
crl-verify        /etc/openvpn/crl/crl.pem
tls-auth          /etc/openvpn/ta.key 0
comp-lzo
keepalive         10 120
tun-mtu           1500
mssfix            1450
persist-key
persist-tun
user              nobody
group             nogroup
verb              3

status /var/log/openvpn/openvpn-status.log   # указываем пути для log-файлов
log /var/log/openvpn/openvpn.log

Создадим директорию для log-файлов openvpn

# mkdir /var/log/openvpn

Файл конфигурации OpenSSL

По умолчанию OpenSSL использует файл конфигурации /etc/ssl/openssl.cnf. Я рекомендую создать отдельный файл конфигурации OpenSSL в папке /etc/openvpn. Данный файл должен называться openssl.cnf и иметь следующее содержимое:

[ ca ]
default_ca               = CA_default

[ CA_default ]
dir                      = /etc/openvpn
crl_dir                  = $dir/crl
database                 = $dir/index.txt
new_certs_dir            = $dir/certs
certificate              = $dir/CA_cert.pem
serial                   = $dir/serial
crl                      = $dir/crl/crl.pem
private_key              = $dir/private/CA_key.pem
RANDFILE                 = $dir/private/.rand
default_days             = 3650
default_days             = 3650
default_crl_days         = 1
default_md               = sha256
unique_subject           = yes
policy                   = policy_any
x509_extensions          = user_extensions

[ policy_any ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ req ]
default_bits             = 2048
default_keyfile          = privkey.pem
distinguished_name       = req_distinguished_name
x509_extensions          = CA_extensions

[ req_distinguished_name ]
#countryName                     = Country Name (2 letter code)
countryName                      = DE
countryName_default              = DE
#stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName              = MUNICH
stateOrProvinceName_default      = MUNICH
#localityName                    = Locality Name (eg, city)
localityName                     = MUNICH
localityName_default             = MUNICH
#organizationName                = Organization Name (eg, company)
organizationName                 = XXX LTD
organizationName_default         = XXX LTD
#organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName           = XXX LTD
organizationalUnitName_default   = XXX LTD
commonName                       = Common Name (eg, YOUR name)
commonName_default               =
commonName_max                   = 64
#emailAddress                    = Email Address
emailAddress                     = admin@12345.de
emailAddress_default             = admin@12345.de

[ user_extensions ]
basicConstraints         = CA:FALSE
subjectKeyIdentifier     = hash
authorityKeyIdentifier   = keyid,issuer

[ CA_extensions ]
basicConstraints         = CA:TRUE
subjectKeyIdentifier     = hash
authorityKeyIdentifier   = keyid:always,issuer:always

[ server ]
basicConstraints         = CA:FALSE
nsCertType               = server


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

# mkdir ccd
# mkdir certs
# mkdir crl
# mkdir keys
# mkdir private
# mkdir req
# chmod 700 keys private
# echo "01" > serial
# touch index.txt


Создание самоподписного доверенного сертификата (CA)

Для создания самоподписного доверенного сертификата (Certification Authority, CA) и закрытого ключа для него необходимо выполнить следующую команду, находясь в папке etc/openvpn:

# openssl req -new -nodes -x509 -keyout private/CA_key.pem -out CA_cert.pem -days 3650 -config openssl.cnf

Команда req заставляет OpenSSL создать сертификат, ключи: -new - cоздать запрос на сертификат, -nodes - не шифровать закрытый ключ, -x509 (совместно с -new) - создать самоподписной сертификат (CA), -keyout - задает местонахождение закрытого ключа, -out - задает местонахождение самоподписного сертификата, -days - задает время действия сертификата (365x10 дней, что приблизительно равно десяти годам).
В процессе выполнения команды на экран будут выданы запросы о вводе таких параметров как: Country Name, State or Province Name; Locality Name; Organization Name; Organizational Unit Name; Common Name; Email Address.
Самым важным параметром является значение Common Name. В данном случае рекомендую написать «ROOT CA», что будет означать «Корневой сертификат». Для просмотра результата генерации самоподписного сертификата и закрытого ключа необходимо выполнить следующую команду, находясь в папке /etc/openvpn:

# openssl x509 -noout -text -in CA_cert.pem       (просмотр сертификата)
# openssl rsa -noout -text -in private/CA_key.pem (просмотр закрытого ключа)


Создание сертификата сервера

Перед созданием сертификата сервера необходимо создать запрос на сертификат сервера и закрытый ключ сервера.  Для этого необходимо выполнить следующую команду, находясь в папке /etc/openvpn:

# openssl req -new -nodes -keyout keys/server.pem -out req/server.pem -config openssl.cnf

Команда и ключи OpenSSL рассмотрены выше. В процессе выполнения команды вам опять придется ответить на вопросы. Ответы должны соответствовать ответам из предыдущего пункта. В ответ на дополнительные запросы "A challenge password []:" и "An optional company name []:" необходимо просто нажать <Enter>. Важным параметром также является значение Common Name. В данном случае необходимо написать FQDN-имя сервера (можно посмотреть в файле /etc/hosts). Для просмотра результата генерации запроса на сертификат и закрытого ключа сервера необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

# openssl req -noout -text -in req/server.pem  (просмотр запроса на сертификат)
# openssl rsa -noout -text -in keys/server.pem (просмотр закрытого ключа)

Для создания сертификата сервера необходимо подписать запрос на сертификат сервера самоподписным доверенным сертификатом (CA). Для этого необходимо выполнить следующую команду, находясь в папке /etc/openvpn:

# openssl ca -batch -config openssl.cnf -extensions server -out certs/server.pem -infiles req/server.pem

Команда ca заставляет OpenSSL подписать запрос на сертификат, ключи: -config задает местонахождение файла конфигурации OpenSSL, -extensions - задает секцию файла конфигурации OpenSSL, содержащую дополнительные параметры генерируемого сертификата, -out - задает местонахождение генерируемого сертификата, -infiles - задает местонахождение запроса на сертификат, -batch - избавляет Вас от ответов на дополнительные вопросы. В процессе выполнения команды Вам будет задан вопрос "Sign the certificate? [y/n]:", на который нужно ответить утвердительно, после чего произойдет генерация сертификата и обновление базы данных сертификатов (файлов index.txt и serial). Для просмотра результата генерации сертификата необходимо выполнить следующую команду, находясь в папке /etc/openvpn:

# openssl x509 -noout -text -in certs/server.pem (просмотр сертификата)


Создание файла параметров Диффи-Хэлмана

Для создания файла параметров Диффи-Хэлмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, необходимо выполнить следующую команду, находясь в папке /etc/openvpn:

# openssl dhparam -out dh2048.pem 2048

Команда dhparam приказывает OpenSSL создать файл параметров Диффи-Хэлмана, число 2048 определяет разрядность в битах. Внимание: данная команда выполняется достаточно медленно даже на очень мощных компьютерах.


Создание клиентских сертификатов

Процедура создания клиентских запросов на сертификаты и закрытых ключей, подписания запросов на сертификаты и генерации сертификатов, а также просмотра запросов на сертификаты, сертификатов и закрытых ключей полностью аналогична соответствующей процедуре для сервера. Сделаю одно небольшое замечание: запросы на сертификаты, закрытые ключи и сертификаты должны иметь шаблонные имена, например, вида: req/RClient для запросов на сертификаты, keys/KClient для закрытых ключей и certs/CClient для сертификатов, соответственно. Слово Client должно быть заменено именем клиента, которое обязательно должно соответствовать значению параметра Common Name, вводимого при генерации запроса на сертификат для соответствующего клиента. Возможность дублирования Common Name у нескольких клиентов определяется конфигурацией сервера. Для генерации запроса на сертификат и закрытого ключа, а также подписания запроса на сертификат и генерации сертификата для клиента Client необходимо выполнить следующие команды, находясь в папке /etc/openvpn:

# openssl req -new -nodes -keyout keys/KClient.pem -out req/RClient.pem -config openssl.cnf
# openssl ca -batch -config openssl.cnf -out certs/CClient.pem -infiles req/RClient.pem


Для просмотра сгенерированных запроса на сертификат, закрытого ключа и сертификата клиента Client необходимо выполнить следующие команды, находясь в папке /etc/openvpn:

# openssl req -noout -text -in req/RClient.pem    (просмотр запроса на сертификат)
# openssl rsa -noout -text -in keys/KClient.pem   (просмотр закрытого ключа)
# openssl x509 -noout -text -in certs/CClient.pem (просмотр сертификата)


Создание списка отзыва сертификатов

Для создания списка отзыва сертификатов необходимо выполнить следующую команду, находясь в папке /etc/openvpn:

# openssl ca -config openssl.cnf -gencrl -out crl/crl.pem

Команда ca с ключем -gencrl заставляет OpenSSL создать список отзыва сертификатов, ключи: -config рассмотрен выше, -out - задает местонахождение списка отзыва сертификатов. Данная команда создает пустой список отзыва сертификатов. Для того, чтобы отозвать сертификат клиента Client необходимо выполнить следующую команду, находясь в папке /etc/openvpn:

# openssl ca -config openssl.cnf -revoke certs/CClient.pem (отзыв определенного сертификата)

Команда ca с ключем -revoke заставляет OpenSSL отозвать заданный сертификат, ключ -config рассмотрен выше. Для просмотра списка отозванных сертификатов необходимо выполнить следующую команду, находясь в папке /etc/openvpn:

# openssl crl -noout -text -in crl/crl.pem (просмотр отозванных сертификатов)


В конфигурационном файле openssl.cnf я указал время жизни списка отозванных сертификатов - 1 день. Т.е. каждый день данный файл списка (crl/crl.pem) необходимо обновлять. Чтобы не заниматься этим вручную, можно добавить задание в cron:

# crontab -e

Внести запись:
0 */1 * * * openssl ca -config /etc/openvpn/openssl.cnf -gencrl -out /etc/openvpn/crl/crl.pem > /dev/null 2>&1


Создание статического ключа HMAC

Для создания статического ключа HMAC, обеспечивающего дополнительную защиту от DoS-атак и флудинга UDP-портов, необходимо выполнить следующую команду, находясь в папке /etc/openvpn:

# openvpn --genkey --secret ta.key


Файлы конфигурации клиентов

Файлы конфигурации клиентов являются текстовыми файлами и содержат команды, выполняемые сервером при подключении клиентов. Имена файлов конфигурации клиентов должны соответствовать Common Name клиентов, т.е. при подключении клиента с Common Name client1 сервер выполнит команды, заданные в файле client1 и т.д. Файлы конфигурации клиентов должны находиться в папке /etc/openvpn/ccd.

Файл client1 должен содержать две команды: добавляющую клиенту маршрут к локальной подсети центрального офиса, а также определяющую адрес локальной подсети, находящейся за клиентом:

Пример содержания файла для добавления маршрута:

push "route 192.168.0.0 255.255.255.0"


Запуск OpenVPN

# service openvpn start


Проверяем, запустился ли сервис:

# socklist
type  port      inode     uid    pid   fd  name
tcp   1195      31308       0  28563    4  openvpn
tcp     22      25923       0  21295    3  sshd
tcp     22      11214       0   1153    3  sshd


Добавляем openvpn в автозагрузку при запуске системы:

# update-rc.d openvpn enable 2345 


На всякий случай напишу команду, чтобы убрать openvpn из автозагрузки:

# update-rc.d openvpn disable


Далее, чтобы разрешить клиентам выходить в сеть Интернет через данный сервер, необходимо сделать следующие настройки. На сервере открываем файл /etc/sysctl.conf и раскомментируем в нем строчку:

net.ipv4.ip_forward=1

Чтобы не пришлось перезагружаться, говорим:

# echo 1 >> /proc/sys/net/ipv4/conf/all/forwarding


Также необходимо внести следующие правила iptables именно в следующей последовательности:

# iptables -A FORWARD -i tun0 -o tun0 -j DROP # запрещаем клиентам openvpn видеть друг друга
# iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
# iptables -A FORWARD -d 10.8.0.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source 12.123.123.45 # внешний ip-адрес сервера


Создадим файл с правилами iptables, который будет применяться после перезагрузки системы:

# iptables-save > /etc/iptables.rules


Напишем скрипт, который будет применять выше созданный файл:

# nano -w /etc/network/if-up.d/00-iptables


Содержимое скрипта:

#!/bin/sh
iptables-restore < /etc/iptables.rules


Даем право на запуск этого скрипта:

# chmod +x /etc/network/if-up.d/00-iptables


Перезагружаемся и проверяем, что правила применяются:

# iptables -nvL


Настройка сервера закончена!

Далее необходимо настроить клиента. Для этого устанавливаем на клиенте OpenVPN Client.


Настройка клиента

Качаем и устанавливаем клиент OpenVPN. Для операционной системы Windows (в том числе и Windows 7 x64) можно скачать тут: https://openvpn.net/index.php/open-source/downloads.html.

Берем с нашего сервера следующие сертификаты:

CA_cert.pem
CClient.pem
KClient.pem
ta.key

И кладем их в директорию установленного openvpn клиента в папку config.

Там же создаем файл config.ovpn со следующим содержанием:

client
dev tun
proto tcp # указываем протокол
remote 12.34.56.78 1195 # указываем ip-адрес сервера и порт
tls-client
tls-remote пишем_тут_FQDN-имя_сервера_которое_указывали_ранее_при_создании_сертификата_сервера
ca CA_cert.pem
cert CClient.pem
key Kclient.pem
tls-auth ta.key 1
comp-lzo
tun-mtu      1500
mssfix       1450
verb         3
redirect-gateway def1


Сохраняем и проверяем работу OpenVPN.

Если все сделано правильно, соединение должно установиться (экран клиента openvpn в трее должен стать зеленым), а при проверке своего ip-адреса (например на сайте 2ip.ru) должен быть ip-адрес сервера.

(!!!) Важное замечание по запуску клиента для операционной системы Windows 7 и выше - клиент OpenVPN должен быть запущен с правами администратора, иначе не измениться маршрут по умолчанию и трафик будет идти по дефолтному маршруту, а не через канал OpenVPN.

Если у вас появились вопросы, вы можете оставлять их в комментариях.


Комментариев нет:

Отправить комментарий