Пятитысячное хауту по OpenVPN

Автор: Admin | 04.02.2015

Быстрое поднятие OpenVPN сервера на Debian, Ubuntu

Данная хаутушка является выдержкой многих статей с минимальным описанием шагов и без воды. Подразумевается, что центр сертификации и OpenVPN сервер находятся на одном хосте. К тому же, надоело каждый раз гуглить по данной теме, т.к. подавляющее большинство руководств являются устаревшими, то уходит много времени на поднятие сервиса.

Настройка OpenVPN для доступа клиентов к ресурсам локальной сети

Сервер

Конфиг сервера

Поставить OpenVPN и создать одноименного пользователя, под которым будет работать демон:

apt install openvpn
adduser --system --no-create-home --disabled-login --group openvpn

Создать конфиг сервера openvpn со следующим содержимым:

mcedit /etc/openvpn/server.conf

port 1194
proto udp
dev tun0
#user openvpn
#group openvpn
dh /etc/openvpn/keys/dh.pem
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpn-server.crt
key /etc/openvpn/keys/vpn-server.key
tls-auth /etc/openvpn/keys/ta.key 0
#crl-verify  /etc/openvpn/keys/crl.pem
script-security 2
cipher AES-256-CBC
tls-server
comp-lzo
mute 10
persist-key
persist-tun
max-clients 50
keepalive 10 900
client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist /etc/openvpn/ccd/ipp.txt
server 10.15.0.0 255.255.255.0
### Эти параметры требуют пояснений.
# Пушить (передавать клиенту) свой DNS север
push "dhcp-option DNS 192.168.0.1"
# Пушить название домена
push "dhcp-option DOMAIN mydomain.com"
# Пушить маршрут локальной подсети. Для того, чтобы у клиентов был доступ до нее
push "route 192.168.0.0 255.255.254.0"
###
status /var/log/openvpn/openvpn-status.log 1
status-version 3
log-append /var/log/openvpn/openvpn-server.log
verb 5

Создать каталоги для логов и хранения IP адресов клиентов:

mkdir /var/log/openvpn/
mkdir /etc/openvpn/ccd

Центр авторизации и ключи

Перейти в домашний каталог, скачать и распаковать easyrsa 3 версии:

cd
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
unzip master.zip

Перейти в каталог easyrsa3 и объявить для него переменные:

cd ~/easy-rsa-master/easyrsa3
cp ~/easy-rsa-master/easyrsa3/vars.example ~/easy-rsa-master/easyrsa3/vars

Инициализировать PKI (Public Key Infrastructure — Инфраструктура открытых ключей):

./easyrsa init-pki

Создать корневой сертификат. Обязательно ввести сложный пароль и Common Name сервера, например my vpn server:

./easyrsa build-ca

Создать ключи Диффи-Хелмана:

./easyrsa gen-dh

Создать запрос на сертификат для сервера OVPN. Обращаю внимание, что сертификат будет незапаролен (параметр nopass), иначе при каждом старте OpenVPN будет запрашивать этот пароль:

./easyrsa gen-req vpn-server nopass

Создать сам сертификат сервера OVPN:

./easyrsa sign-req server vpn-server

Скопировать полученные ключи в рабочий каталог openvpn:

mkdir -p /etc/openvpn/keys
cp ~/easy-rsa-master/easyrsa3/pki/ca.crt /etc/openvpn/keys
cp ~/easy-rsa-master/easyrsa3/pki/issued/vpn-server.crt /etc/openvpn/keys
cp ~/easy-rsa-master/easyrsa3/pki/private/vpn-server.key /etc/openvpn/keys
cp ~/easy-rsa-master/easyrsa3/pki/dh.pem /etc/openvpn/keys

Создать «HMAC firewall» для защиты от DoS аттак и флуда UDP порта:

cd /etc/openvpn/keys/
openvpn --genkey --secret ta.key

Запустить openvpn:

/etc/init.d/openvpn start

Клиент

Ключи

Создание запроса запароленного ключа для клиента (потребуется вводить при каждом подключении) с именем User:

cd ~/easy-rsa-master/easyrsa3
./easyrsa gen-req User

Если авторизация будет внешней (например ADшная), то пароль не потребуется. Создание запроса без парольного ключа для клиента:

./easyrsa gen-req User nopass

Создание ключа пользователя (по дефолту из vars сроком на 10 лет):

./easyrsa sign-req client User

Или с ограничением действия сертификата в 90 дней (после истечения срока можно только перевыпустить):

./easyrsa sign-req client User -days 90

Клиенту передать эти файлы:

~/easy-rsa-master/easyrsa3/pki/issued/User.crt
~/easy-rsa-master/easyrsa3/pki/private/User.key
~/easy-rsa-master/easyrsa3/pki/ca.crt
/etc/openvpn/keys/ta.key

Конфиг

client
dev tun
proto udp
remote xxx.xxx.xxx.xxx 1194
cipher AES-256-CBC
tls-client
ca "ca.crt"
tls-auth "ta.key" 1
cert "User.crt"
key "User.key"
remote-cert-tls server
comp-lzo
tun-mtu 1500
mssfix 1450
verb 3
nobind
resolv-retry infinite

Для удобства все пять клиентских файлов можно объединить в один

Отзыв сертификатов

Генерация файла отозванных ключей:

cd ~/easy-rsa-master/easyrsa3
./easyrsa gen-crl

Сделать символическую ссылку в каталог с ключами (конечно, файл можно и скопировать, но придется делать каждый раз при отзыве сертификата):

ln -s ~/easy-rsa-master/easyrsa3/pki/crl.pem /etc/openvpn/keys

В /etc/openvpn/server.conf добавить строку

crl-verify /etc/openvpn/keys/crl.pem

Отзыв сертификата пользователя User:

./easyrsa revoke User

Каждый раз при отзыве сертификата необходимо обновлять crl.pem, чтобы внести в него изменения:

./easyrsa gen-crl

Примечание: одноименный файл ключа не может быть создан пока не отозван старый. При попытке создать сертификат с уже имеющимся именем выдаст ошибку:

failed to update database
Easy-RSA error:
signing failed (openssl output above may have more detail)

Минимальная настройка Iptables для доступа OpenVPN клиентов к локальной сети

# Включить форвард в ядре
echo "1" > /proc/sys/net/ipv4/ip_forward
# Разрешить входящие соединения на порт OVPN
iptables -A INPUT -p UDP --dport 1194 -j ACCEPT
# Разрешить форвард между подсетью OVPN и локальной
# При чем, ставить их в начале цепочки, если правил много
iptables -A FORWARD -s 10.15.0.0/24 -d 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -d 10.15.0.0/24 -s 192.168.0.0/24 -j ACCEPT

Настройка OpenVPN для выхода в интернет

Наткнулся на тред, поржал и решил дополнить заметку. Если OpenVPN нужен для выхода в интернет — надо сделать, чтобы OpenVPN был шлюзом по умолчанию (default gateway) и подправить правила iptables.
Собственно, конфиг для сервера:

port 1194
proto udp
dev tun0
dh /etc/openvpn/keys/dh.pem
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpn-server.crt
key /etc/openvpn/keys/vpn-server.key
tls-auth /etc/openvpn/keys/ta.key 0
crl-verify  /etc/openvpn/keys/crl.pem
script-security 2
cipher AES-256-CBC
tls-server
comp-lzo
mute 10
persist-key
persist-tun
max-clients 50
keepalive 10 900
client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist /etc/openvpn/ccd/ipp.txt
server 10.15.0.0 255.255.255.0
push "redirect-gateway def1"
status /var/log/openvpn/openvpn-status.log 1
status-version 3
log-append /var/log/openvpn/openvpn-server.log
verb 5

Конфиг для клиента не будет отличаться от приведенного выше.

Минимальная настройка Iptables для выхода OpenVPN клиентов в интернет

Правила iptables:

# Включить форвард в ядре
echo "1" > /proc/sys/net/ipv4/ip_forward
# Разрешить входящие соединения на порт OVPN
iptables -A INPUT -p UDP --dport 1194 -j ACCEPT
# Разрешить ходить транзитным пакетам для подсети OpenVPN 
iptables -A FORWARD -s 10.15.0.0/24 -j ACCEPT
iptables -A FORWARD -d 10.15.0.0/24 -j ACCEPT
# x.x.x.x - внешний IP сервера, если он статический
iptables -t nat -A POSTROUTING -s 10.15.0.0/24 -j SNAT --to-source x.x.x.x
# Если внешний IP сервера динамический, то вместо предыдущего правила использовать это
# iptables -t nat -A POSTROUTING -s 10.15.0.0/24 -j MASQUERADE

Некоторые замечания

Для исключения возможности mitm атаки, ошибка которого так выглядит в логах клиента:

WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info.

Служит параметр remote-cert-tls server, который уже присутствует в конфиге клиента.

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

Список валидных и отозванных сертификатов можно посмотреть в файле ~/easy-rsa-master/easyrsa3/pki/index.txt. Начало строки оисания каждого сертификата начинается с букв V или R, что значит Valid и Revoked, например:

V       241019110411Z                   01      unknown /CN=vpn-server
R       241019110842Z   141202085241Z   02      unknown /CN=User1
R       241020105823Z   141201103442Z   03      unknown /CN=test
R       150301095139Z   141202085814Z   04      unknown /CN=User2
V       141203091049Z                   05      unknown /CN=User3

Как видно, первый и пятый сертификаты валидны, 2-4 отозваны.

Если клиент на Windows

Поставить OpenVPN GUI, скачав отсюда. Скопировать клиентские ключи в C:\Program Files\OpenVPN\config\. Скопировать конфиг клиента и вставить в файл client.ovpn, положить туда же. Всего в этом каталоге должно получиться пять файлов — User.crt, User.key, ca.crt, ta.key, client.ovpn.
Обязательно запустить OpenVPN GUI от имени администратора, иначе в сиситеме не поднимутся маршруты, и произвести подключение двойным кликом по иконке в трее (такая область около часов, обычно в правом нижнем углу).


Ссылки по теме:
Описание параметров конфигурационных файлов.
Как сделать центр сертификации по феншую.
Отзыв сертификата Easy-RSA без .crt файла
Как прикрутить доменную авторизацию через AD к openvpn

Комментарии к посту “Пятитысячное хауту по OpenVPN

  1. Glafir

    Что делать, если

    ./easyrsa.real sign-req server vpn.1-ok.com
    Note: using Easy-RSA configuration from: ./vars
    Easy-RSA error:
    Unknown cert type ‘server’

    ???

    1. admin Автор записи

      Скорее всего нарушена структура каталогов. В исходнике написано:

      # Cert type must exist under the EASYRSA_EXT_DIR
      	[ -r "$EASYRSA_EXT_DIR/$crt_type" ] || die "\
      Unknown cert type '$crt_type'"
      

      т.е. $EASYRSA_EXT_DIR = easy-rsa-master/easyrsa3/x509-types. Предположу, что нет этого каталога или его содержимого.
      Скачайте easy-rsa3 по новой и все взлетит.

    2. kacblm

      Версия у вас какая? У меня на версии 3.0.6 не заработало. а на 3.0.4 всё норм. Попробуйте 3.0.3 или 3.0.4(точно рабочая)

  2. Gul

    Привет! Спасибо!
    застряла на пункте конфиг клиента, т.е. на стороне клиента в папке etc/openvpn создала файл client.conf с предлагаемым содержанием ( поменяла только xxx.xxx.xxx.xxx на ip сервера), ключи и сертификаты сгенерированные сервером выложила в папку /etc/openvpn/easy-rsa/keys.
    Дальше как?

    1. admin Автор записи

      Если это Linux без GUI, то /etc/init.d/openvpn restart
      Если с GUI, то настроить соединение через Network Manager
      Если винда, то скачать клиента и подсунуть ему файлы.

  3. Gul

    Спасибо! Клиент на raspberry (raspbian wheezy)
    на команду: openvpn /etc/openvpn/client.conf выдает следующее:

    Thu Apr 21 13:19:10 2016 OpenVPN 2.2.1 arm-linux-gnueabihf [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] [MH] [PF_INET6] [IPv6 payload 20110424-2 (2.2RC2)] built on Dec 1 2014
    Thu Apr 21 13:19:10 2016 NOTE: OpenVPN 2.1 requires ‘—script-security 2’ or higher to call user-defined scripts or executables
    Thu Apr 21 13:19:10 2016 Cannot load certificate file User.crt: error:02001002:system library:fopen:No such file or directory: error:20074002:BIO routines:FILE_CTRL:system lib: error:140AD002:SSL routines:SSL_CTX_use_certificate_file:system lib
    Thu Apr 21 13:19:10 2016 Exiting

    переделать все сначала? что не так?

    1. admin Автор записи

      Ясно же говорит — нет файла User.crt Cannot load certificate file User.crt ... No such file or directory. Предположу, что
      1. Надо запускать от рута, т.е. в случае Raspberry использовать sudo
      2. Перед запуском сделать cd /path/to/keys или использовать абсолютные пути в конфиге

  4. Роман

    У меня не пинговались клиенты с сервера, после этого правила:
    iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT —to-source x.x.x.x

    Заработало только когда сделал так:
    iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -j SNAT —to-source x.x.x.x
    iptables -t nat -A POSTROUTING -o eth0 -j SNAT —to-source x.x.x.x

    1. admin Автор записи

      Вы путаете таблицы nat и filter. Таблица nat не должна фильтровать пакеты. Своим же правилом Вы только разрешили хождение пакетов через NAT с eth0 интерфейса.

  5. Макс

    Доброго времени суток, хотелоcь бы делать редирект только на локальную сеть к базе данных openvpn при этом . остальной трафик должен идти не через openvpn, а прямо в сеть в сеть.
    Со стороны клиента использую :
    client
    port 1179
    proto udp
    dev tun
    cipher AES-256-CBC
    ca ca.crt
    cert user1.crt
    key user1.key
    remote **.**.**.**
    #no-bind
    comp-lzo
    remote-cert-tls server
    persist-key
    persist-tun
    tls-auth ta.key 1
    verb 5
    #route 172.30.0.0 255.255.0.0
    —redirect-gateway def1
    #route-no-pull

    Со стороны сервера:
    ca ca.crt
    cert aurora.crt
    key aurora.key
    dh dh2048.pem
    tls-auth ta.key 0
    cipher AES-256-CBC
    server 172.30.3.0 255.255.255.0
    #for windows clients
    #topology subnet
    keepalive 10 120
    comp-lzo
    persist-key
    persist-tun
    #push «redirect-gateway»
    client-config-dir ccd
    verb 5
    user nobody
    group nogroup
    client-to-client
    status aurora-status.log
    log /var/log/aurora.log
    sndbuf 0
    rcvbuf 0
    route 172.30.3.0 255.255.255.0
    push «dhcp-option DNS 8.8.8.8»

    1. admin Автор записи

      Не понял формулировку задачи, опишите пожалуйста подробнее.
      1. Что хотите слелать
      2. Что сделали
      3. Что идет не так, как Вы ожидали

  6. Макс

    Задача была обеспечить шифрование данных с помощью openVPN. При этом необходимо что бы обычный трафик шел обычным образом, а обращения (на пример к базе данных) к ресурсу исключительно через openVPN, при этом понятно , что БД находится в одной локальной сети с прокси сервером .

    1. admin Автор записи

      В статье именно об этом и написано. Хотите конкретики — следуйте шаблону из предыдущего моего коммента.

  7. wf

    на ubuntu 16.04.4 openvpn не стартовал
    сначала в /etc/default/openvpn раскомментировать строку AUTOSTART=»all»
    Если после этого при запуске
    sudo systemctl start openvpn@[ИМЯ ФАЙЛА КОНФИГА].service
    появляется ошибка
    «daemon() failed or unsupported: Resource temporarily unavailable (errno=11)»
    Делаем следующее
    sudo systemctl edit openvpn@ [tab]
    В редакторе вставляем строки
    [Service]
    LimitNPROC=infinity

    Это создаст файл
    /etc/systemd/system/openvpn@.service.d/override.conf
    Затем запускаем
    sudo systemctl daemon-reload
    sudo systemctl start openvpn@[ИМЯ ФАЙЛА КОНФИГА].service

    p.s.: как тут форматировать текст?

    1. admin Автор записи

      p.s.: как тут форматировать текст?

      Стандартная HTML разметка. Для кода испольльзуйте теги code или pre

      PS:
      Я оставил этот момент на пользователя, поскольку считал его знакомым с systemd. Спасибо за дополнение!

  8. Marcus

    Большое спасибо за статью!
    Сделал ключи клиентов. Пинги от клиента до сервера идут.Возникло несколько вопросов.
    1. Подскажите, пожалуйста, как подключить mikrotik в качестве ovpn клиента? Импортирую в mikrotik user.crt, user.key, ca.crt. В меню PPP добавляю данные OVPN Client: адрес сервера, порт, клиентский сертификат и тип шифрования (AES-256). Но маршрутизатор отказывается устанавливать соединение с сервером.
    2. Как предоставить удаленным клиентам, подключенным к ovpn серверу, доступ к локальным ресурсам mikrotika?

    1. admin Автор записи

      Спасибо за отзыв )
      1. Не могу ни чего сказать, смотрите логи на микротике. Как правило, достаточно бывает поиграть настройками шифрования, если все остальное не вызывает сомнений.
      2. Надо сделать роутинг — на этих клиентах добавить маршрут в подсеть миркотика через OVPN сервер. Что-то типа ip route add 192.168.20.0/24 dev tun0, где 192.168.20.0/24 — локальная подсеть за микротиком, tun0 — OVPN интерфейс на клиенте, которому нужен доступ в подсеть за микротиком.

      PS. Чтобы клиенты имели возможность видеть друг друга, необходимо с конфиг сервера добавить опцию client-to-client, без нее не заработает.

    2. wf

      2. push «route 10.10.10.0 255.255.255.0 10.0.0.2 1» — отправит маршрут клиенту (микроитку) и он сможет видеть маршруты вашей сети
      route 192.168.3.0 255.255.255.0 172.16.254.3 в openvpn.conf скажет серверу openvpn что у одного из клиентов есть такие адреса, дальше через ccd, в директории создать файл с именем равным имени пользователя клиента или common name сертификата, в котором прописать iroute 192.168.3.0 255.255.255.0. На свои адреса только поменять.

      1. Marcus

        admin, wf, спасибо за помощь!
        Первый вопрос решил. Микротик не дружит с протоколом UDP, а так же не поддерживает сжатие и TLS-аутентификацию.
        Не могу победить второй вопрос. Сеть 192.168.1.* (микротик 1.1). Сеть удаленного клиента 192.168.2.* (маршрутизатор 1.1).
        В server.conf прописал следующее:
        client-config-dir /etc/openvpn/ccd
        ifconfig-pool-persist /etc/openvpn/ccd/ipp.txt
        server 10.15.0.0 255.255.255.0
        route-gateway 10.15.0.1
        route 10.15.0.1 255.255.255.0
        topology subnet
        client-to-client

        В сcd User1 прописал доступ к одному ip: push «route 192.168.1.3 255.255.255.255».
        У клиента добавил следующий маршрут: route add 10.15.0.6 mask 255.255.255.255 10.15.0.6.
        Ping от клиента к удаленному устройству (1.3) не проходи.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *