Если клиент на Windows
Поставить OpenVPN GUI, скачав отсюда. Скопировать клиентские ключи в . Скопировать конфиг клиента и вставить в файл , положить туда же. Всего в этом каталоге должно получиться пять файлов — .Обязательно запустить OpenVPN GUI от имени администратора, иначе в сиситеме не поднимутся маршруты, и произвести подключение двойным кликом по иконке в трее (такая область около часов, обычно в правом нижнем углу).
Ссылки по теме:Описание параметров конфигурационных файлов.Как сделать центр сертификации по феншую.Отзыв сертификата Easy-RSA без .crt файлаКак прикрутить доменную авторизацию через AD к openvpn
Отзыв сертификатов
Генерация файла отозванных ключей:
cd ~/easy-rsa-master/easyrsa3 ./easyrsa gen-crl
Сделать символическую ссылку в каталог с ключами (конечно, файл можно и скопировать, но придется делать каждый раз при отзыве сертификата):
ln -s ~/easy-rsa-master/easyrsa3/pki/crl.pem /etc/openvpn/keys
В добавить строку
crl-verify /etc/openvpn/keys/crl.pem
Отзыв сертификата пользователя User:
./easyrsa revoke User
Каждый раз при отзыве сертификата необходимо обновлять , чтобы внести в него изменения:
./easyrsa gen-crl
Примечание: одноименный файл ключа не может быть создан пока не отозван старый. При попытке создать сертификат с уже имеющимся именем выдаст ошибку:
failed to update database Easy-RSA error: signing failed (openssl output above may have more detail)
CRL signature failed
Due to the vulnerabilities found in MD5, this hashing routine has been disabled by default on modern SSL. Our certificates, though, were still using it, so the new error message (after fixing the CRL), became:
Mon Nov 6 10:14:40 2017 TCP connection established with 192.168.100.1:18463 Mon Nov 6 10:14:41 2017 192.168.100.1:18463 TLS: Initial packet from 192.168.100.1:18463, sid=13fdd1fe 5d82d4d6 Mon Nov 6 10:14:42 2017 192.168.100.1:18463 VERIFY ERROR: depth=0, error=CRL signature failure: C=IT, ST=PR, L=Parma, O=domain, OU=domain.eu, CN=user, name=user, emailAddress=info@stardata.it Mon Nov 6 10:14:42 2017 192.168.100.1:18463 OpenSSL: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned Mon Nov 6 10:14:42 2017 192.168.100.1:18463 TLS_ERROR: BIO read tls_read_plaintext error Mon Nov 6 10:14:42 2017 192.168.100.1:18463 TLS Error: TLS object -> incoming plaintext read error Mon Nov 6 10:14:42 2017 192.168.100.1:18463 TLS Error: TLS handshake failed Mon Nov 6 10:14:42 2017 192.168.100.1:18463 Fatal TLS error (check_tls_errors_co), restarting Mon Nov 6 10:14:42 2017 192.168.100.1:18463 SIGUSR1 received, client-instance restarting
This one was trickier to solve. It turns out that you can re-enable MD5 as a workaround using two environment variables: and . In my case, I just added them to openvpn init script because the system is going to be decommissioned soon.
CRL expired
The OpenVPN server logs were reporting:
Mon Nov 6 10:04:22 2017 TCP connection established with 192.168.100.1:19347 Mon Nov 6 10:04:23 2017 192.168.100.1:19347 TLS: Initial packet from 192.168.100.1:19347, sid=150b3618 b004e9a4 Mon Nov 6 10:04:23 2017 192.168.100.1:19347 VERIFY ERROR: depth=0, error=CRL has expired: C=IT, ST=PR, L=Parma, O=domain, OU=domain.eu, CN=user, name=user, emailAddress=info@stardata.it Mon Nov 6 10:04:23 2017 192.168.100.1:19347 OpenSSL: error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned Mon Nov 6 10:04:23 2017 192.168.100.1:19347 TLS_ERROR: BIO read tls_read_plaintext error Mon Nov 6 10:04:23 2017 192.168.100.1:19347 TLS Error: TLS object -> incoming plaintext read error Mon Nov 6 10:04:23 2017 192.168.100.1:19347 TLS Error: TLS handshake failed Mon Nov 6 10:04:23 2017 192.168.100.1:19347 Fatal TLS error (check_tls_errors_co), restarting Mon Nov 6 10:04:23 2017 192.168.100.1:19347 SIGUSR1 received, client-instance restarting
This is a common problem on older systems, the culprit is in the OpenSSL configuration used to generate the CRL, that is limited to just 30 days by default.
So, I had to regenerate my CRL after increasing the parameter in the ssl config to 180 (for our use case is more than enough), using:
$ openssl ca -gencrl -keyfile keys/ca.key \ -cert keys/ca.crt -out keys/crl.pem \ -config easy-rsa/openssl-1.0.0.cnf
Сервер
Конфиг сервера
Поставить OpenVPN и создать одноименного пользователя, под которым будет работать демон:
apt install openvpn adduser --system --no-create-home --disabled-login --group openvpn
Создать конфиг сервера openvpn со следующим содержимым:
mcedit /etc/openvpn/server.conf port 1194 proto udp dev tun #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
Инициализировать (Public Key Infrastructure — Инфраструктура открытых ключей):
./easyrsa init-pki
Создать корневой сертификат. Обязательно ввести сложный пароль и сервера, например :
./easyrsa build-ca
Создать ключи Диффи-Хелмана:
./easyrsa gen-dh
Создать запрос на сертификат для сервера OVPN
Обращаю внимание, что сертификат будет незапаролен (параметр ), иначе при каждом старте 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
Запустить :
/etc/init.d/openvpn start
Минимальная настройка 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 tun 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
Конфиг для клиента не будет отличаться от приведенного выше.
Отзыв клиентских сертификатов
Иногда может понадобиться отозвать клиентский сертификат для предотвращения доступа к серверу VPN: сотрудник уволился, потерял ноутбук или просто нужно определенному сотруднику нужно закрыть доступ к внутренней корпоративной сети.
Причины могут быть разные. Как отозвать выданный ему клиентский сертификат Open VPN?
Для того чтобы отозвать сертификат/сертификаты нужно сформировать список отозванных сертификатов и сказать серверу OpenVPN чтобы тот при коннекте клиента сверялся с этим списком.
Для начала нужно зайти в директорию центра сертификации, который обычно находится в /etc/openvpn/easy-rsa/ и ввести команды:
cd /etc/openvpn/easy-rsa/ sudo su source /etc/openvpn/easy-rsa/vars
Далее, используя команду команду revoke-full отзываем конкретный сертификат:
./revoke-full client
где client — это имя сертификата. С этим именем в папке /etc/openvpn/easy-rsa/keys хранятся три файла:
client.key client.csr client.crt
Иногда, в старых версиях OpenVPN, может появляться ошибка 23. Это нормально, но в последней версии она не появляется. В результате работы будет создан файл crl.pem в директории keys с необходимой для отзыва сертификата информацией.
Для простоты можно переместить этот файл в директорию /etc/openvpn:
sudo cp keys/crl.pem /etc/openvpn
Затем открываем файл конфигурации сервера OpenVPN вашим любимым редактором текста, например nano:
sudo nano /etc/openvpn/server.conf
и в конец файла добавляем строку crl-verify. Теперь сервер OpenVPN будет проверять список отозванных сертификатов каждый раз, когда кто-то устанавливает соединение с сервером.
crl-verify /etc/openvpn/crl.pem
Сохраните и закройте файл.
Перезапустите OpenVPN для завершения процесса отзыва сертификата:
sudo service openvpn restart
Теперь клиент не сможет устанавливать соединение с сервером OpenVPN используя сертификат client.
Обобщая всё вышесказанное для отзыва дополнительных сертификатов нужно выполнить следующие шаги:
- Сгенерировать новый список отозванных сертификатов используя команду source vars в директории /etc/openvpn/easy-rsa и выполняя команду revoke-full с именем клиента.
- Скопироватье новый список отозванных сертификатов в директорию /etc/openvpn перезаписав тем самым старый список.
- Перезапустите сервис OpenVPN.
Эта процедура может быть использована для отзыва любых созданных вами ранее сертификатов. Каждый раз при отзыве клиентского сертификата, формируется новый crl.pem. Это и есть список всех отозванных сертификатов.
Клиент
Ключи
Создание запроса запароленного ключа для клиента (потребуется вводить при каждом подключении) с именем 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
Для удобства все пять клиентских файлов можно объединить в один