В период активности коронавируса как никогда популярна удаленная работа из дома. На днях мне пришлось организовывать удаленный доступ средствами OpenVPN для одной компании, об этом и расскажу в статье.
Настраивать OpenVPN пришлось на стареньком сервере под управлением Debian 7.7 (Wheezy), но статья будет актуальна и для старших версий Debian/Ubuntu. В компании есть сервер Active Directory, будем использовать его для аутентификации пользователей, как LDAP-сервер.
Приступаем. Логинимся на сервер и повышаем привилегии до root`а:
$ sudo su
Обновляемся:
# apt-get update && apt-get upgrade
Устанавливаем пакеты openvpn, openvpn-auth-ldap и easy-rsa:
# apt-get install openvpn openvpn-auth-ldap easy-rsa -y
Создаем в каталоге OpenVPN каталог easy-rsa и копируем в него файлы программы:
# mkdir /etc/openvpn/easy-rsa
# cd /etc/openvpn/easy-rsa
Для Debian 7:
# cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* .
Для старших версий Debian:
# cp -r /usr/share/easy-rsa/* .
# cp vars.example vars
Не зависимо от версии Debian:
В файле vars правим значения, указывая географическое положение, название организации и т.д:
# nano vars
set_var EASYRSA_REQ_COUNTRY "RU"
set_var EASYRSA_REQ_PROVINCE "Moscow"
set_var EASYRSA_REQ_CITY "Moscow"
set_var EASYRSA_REQ_ORG "IT Co"
set_var EASYRSA_REQ_EMAIL "Этот адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript."
set_var EASYRSA_REQ_OU "My Organizational Unit"
Для Debian 7:
Запускаем отредактированный скрипт:
# . ./vars
Удаляем старые сертификаты (если они есть):
# ./clean-all
Генерируем корневой сертификат:
# ./build-ca
Генерируем ключ сервера:
# ./build-key-server server
Генерируем ключ Диффи-Хеллмана:
# ./build-dh
Генерируем ключ клиента (проверка клиентских сертификатов у меня пока не предполагается, но пусть будет):
# ./build-key client
Генерируем TLS-ключ:
# openvpn --genkey --secret keys/ta.key
Копируем каталог с созданными ключами и сертификатами в каталог OpenVPN:
# cp -r keys /etc/openvpn/
Для старших версий Debian:
Создаем каталог для ключей:
# cd /etc/openvpn
# mkdir keys
# cd /etc/openvpn/easy-rsa
Генерируем ключи и сертификаты.
Инициализируем инфраструктуру открытых ключей:
# ./easyrsa init-pki
Создаем центр сертификации:
# ./easyrsa build-ca
Создаем запрос сертификата для сервера без пароля и подписываем его:
# ./easyrsa gen-req server nopass
# ./easyrsa sign-req server server
Генерируем ключ Диффи-Хеллмана:
# ./easyrsa gen-dh
Копируем ключи и сертификаты в каталог keys:
# cp pki/ca.crt /etc/openvpn/keys/ca.crt
# cp pki/dh.pem /etc/openvpn/keys/dh.pem
# cp pki/issued/server.crt /etc/openvpn/keys/server.crt
# cp pki/private/server.key /etc/openvpn/keys/server.key
Генерируем TLS-ключ:
# openvpn --genkey --secret /etc/openvpn/keys/ta.key
Проверяем, в каталоге keys должны быть следующие ключи:
# ls /etc/openvpn/keys/
ca.crt dh.pem server.crt server.key ta.key
Ниже в конфигурационном файле указано имя ключа dh1024.pem (для Debian 7) , измените его на dh.pem
Настройка сервера
Подготовительные работы завершены, создаем конфигурационный файл сервера:
# nano /etc/openvpn/server.conf
#IP на котором устанавливается VPN-соединение
local 192.168.0.1
port 1194
proto udp
#Использовать тип устройства tun
dev tun
#Keys
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh1024.pem
tls-auth keys/ta.key 0
#Диапазон адресов, выдаваемых клиенту
server 10.1.0.0 255.255.255.0
#Настройка статических IP
ifconfig-pool-persist ipp.txt
#Таймаут ping и ping-restart
keepalive 10 120
#Максимальное количество подключений
max-clients 20
#Указывает не перечитывать файлы ключей при перезапуске туннеля
persist-key
#Оставляет без изменения устройства tun при перезапуске OpenVPN
persist-tun
#Аутентификация LDAP
username-as-common-name
client-cert-not-requiredplugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/auth/ldap.conf
#Настройки логирования
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 4
mute 20
#Программа будет работать в режиме демона
daemon
#Режим работы сервера
mode server
#Активирует работу TLS сервера
tls-server
#Компрессия трафика
comp-lzo
#Алгоритм хэширования
auth SHA512
#Алгоритм шифрования
cipher AES-256-CBC
#Передавать клиенту свой DNS север
push "dhcp-option DNS 192.168.0.2"
push "block-outside-dns"
#Передать название домена
push "dhcp-option DOMAIN my_domain.local"
#Передать маршрут к локальной подсети
push "route 192.168.0.0 255.255.255.0"
В /etc/openvpn создадим каталог auth
# mkdir /etc/openvpn/auth
Создаем конфигурационный файл ldap.conf с настройками для подключения к AD:
# nano /etc/openvpn/auth/ldap.conf
<LDAP>
URL ldap://192.168.0.2
BindDN CN=openvpn,CN=Users,DC=my_domain,DC=local
Password ******
Timeout 15
TLSEnable no
</LDAP>
<Authorization>
BaseDN "DC=my_domain,DC=local"
SearchFilter "(&(sAMAccountName=%u)(memberOf=CN=VPNUsers,CN=Users,DC=my_domain,DC=local))"
</Authorization>
Создаем каталог для логов запускаем сервер:
# mkdir /var/log/openvpn
# service openvpn start
Настройка Active Directory
В контейнере «Users» создаем учетную запись пользователя openvpn с паролем "по вкусу". Далее, создаем группу безопасности «VPNUsers» и добавляем в неё учетные записи пользователей, которым предоставим возможность удаленного подключения.
Настройка фаервола
Включаем форвардинг, если ещё не включен:
# echo "1" > /proc/sys/net/ipv4/ip_forward
Разрешаем входящие соединения на порту OpenVPN
# iptables -A INPUT -p UDP --dport 1194 -j ACCEPT
Разрешаем форвардинг между локальной подсетью и подсетью OpenVPN
# iptables -A FORWARD -s 10.1.0.0/24 -d 192.168.0.0/24 -j ACCEPT
# iptables -A FORWARD -d 10.1.0.0/24 -s 192.168.0.0/24 -j ACCEPT
В Debian 7 у меня был уже настроен фаервол FireHOL, оставалось только добавить в файл /etc/firehol/firehol.conf строки:
interface tun+ vpntun
server all accept
client all accept
******
router tun2eth0 inface tun+ outface eth0
route all acceptrouter eth02tun inface eth0 outface tun+
route all accept
Настройка клиента
Загрузите и установите необходимый клиент с официального сайта OpenVPN: https://openvpn.net/community-downloads/
Далее будет предполагаться, что мы настраиваем клиент под Windows 10.
В папке текущего пользователя C:\Users\user\OpenVPN\config (конфигурация будет доступна только для текущего пользователя) или в папке программы C:\Program Files\OpenVPN\config (конфигурация будет доступна для всех пользователей ПК) создаем файл client.ovpn.
Для создания файла можно использовать обычный Блокнот или Notepad++
Заполняем файл следующим содержимым:
client
dev tun
proto udp
remote server_name_or_ip 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
tls-client
tls-auth ta.key 1
comp-lzo
verb 3
auth-user-pass
cipher AES-256-CBC
auth SHA512
remote-cert-tls server
Сохраняем.
В ту же папку копируем с сервера файлы ca.crt, ta.key.
Файлы можно скопировать с сервера с помощью программы WinSCP.
Проверяем.
Если ещё не запущена, то запускаем с рабочего стола программу «OpenVPN GUI». В трее нажимаем правой кнопкой мыщи по значку OpenVPN и выбираем пункт «Подключиться». Далее, в появившемся окне вводим логин и пароль. При успешном подключении значок станет зеленым.
Внимание! логин вводится без указания домена, т.е. только имя пользователя и ничего больше.