В данной статье я расскажу, как настроить на сервере 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.
Если у вас появились вопросы, вы можете оставлять их в комментариях.
Комментариев нет:
Отправить комментарий