OpenVPN — это полнофункциональное открытое средство VPN SSL, которое поддерживает широкий диапазон конфигураций. В этом мануале вы научитесь настраивать сервер OpenVPN на вашем выделенном сервере Debian 10.
Для начала нам необходимо установить сам OpenVPN сервер. Выполняем следующую команду и вводим пароль суперпользователя:
su -
Устанавливаем пакеты openvpn и easy-rsa. Выполняем следующую команду:
apt install openvpn easy-rsa
Для упрощения процедуры создания необходимых ключей и сертификатов традиционно используется утилита Easy-RSA, которая позволяет легко управлять локальным центром сертификации (CA) инфраструктуры открытых ключей (PKI).
Пакет успешно установлен.
Выходим из суперпользователя. Выполняем следующую команду:
exit
Копируем файлы easy-rsa в домашний каталог. Выполняем следующую команду:
cp -r /usr/share/easy-rsa
Переходим в каталог easy-rsa. Выполняем следующую команду:
cd easy-rsa
Выполняем инициализацию PKI. В каталоге EasyRSA есть скрипт easyrsa, который вызывается для выполнения задач, связанных с созданием и управлением CA. Запустите этот скрипт с параметром init-pki, чтобы инициировать инфраструктуру открытого ключа на сервере CA. Выполняем следующую команду:
./easyrsa init-pki
Генерируем сертификат корневого центра сертификации (CA). Выполняем следующую команду:
./easyrsa build-ca nopass
Вводим имя корневого центра сертификации, нажимаем enter чтобы продолжить.
Создаем сертификат для сервера OpenVPN. Выполняем следующую команду, где вместо <hostname> указываем доменное имя или IP-адрес вашего OpenVPN сервера, у меня 172.16.16.1:
./easyrsa build-server-full <hostname> nopass
Создаем сертификат для клиента OpenVPN. Выполняем следующую команду, где вместо <username> указываем произвольное имя для вашего клиента, у меня john:
./easyrsa build-client-full <username> nopass
Так же генерируем список отозванных сертификатов. Выполняем следующую команду:
./easyrsa gen-crl
Генерируем ключ DH.
Протокол Ди́ффи — Хе́ллмана (англ. Diffie–Hellman, DH) — криптографический протокол, позволяющий двум и более сторонам получить общий секретный ключ, используя незащищенный от прослушивания канал связи. Полученный ключ используется для шифрования дальнейшего обмена с помощью алгоритмов симметричного шифрования.
Выполняем следующую команду:
./easyrsa gen-dh
(Это замёт некоторое время, ждите окончания генерации)
После генерируем OpenVPN ta.key - подпись HMAC, чтобы усилить функции проверки целостности TLS.
Выполняем следующую команду:
/usr/sbin/openvpn --genkey --secret ta.key
Переходим в суперпользователя. Выполняем следующую команду и вводим пар:
su -
Создаем каталог для хранения ключевой информации OpenVPN сервера. Выполняем следующую команду:
mkdir /etc/openvpn/certs
Копируем сертификат корневого центра сертификации. Выполняем следующую команду:
cp /home/user/easy-rsa/pki/ca.crt /etc/openvpn/certs
Копируем сертификат OpenVPN сервера. Выполняем следующую команду:
cp /home/user/easy-rsa/pki/issued/172.16.16.1.crt /etc/openvpn/certs
Копируем закрытый ключ сертификата OpenVPN сервера. Выполняем следующую команду:
cp /home/user/easy-rsa/pki/private/172.16.16.1.key /etc/openvpn/certs
Копируем ключ DH. Выполняем следующую команду:
cp /home/user/easy-rsa/pki/dh.pem /etc/openvpn/certs
Копируем ключ ta. Выполняем следующую команду:
cp /home/user/easy-rsa/ta.key /etc/openvpn/certs
Копируем список отозванных сертификатов. Выполняем следующую команду:
cp /home/user/easy-rsa/pki/crl.pem /etc/openvpn/certs
Создаем файл конфигурации OpenVPN сервера. Выполняем следующую команду:
touch /etc/openvpn/server/server.conf
Открываем конфигурационный файл OpenVPN сервера любым редактором, например nano. Выполняем следующую команду:
nano -w /etc/openvpn/server/server.conf
Приводим конфигурационный файл к следующему виду. Вместо 172.16.16.1 необходимо вписать свое доменное имя или IP адрес если вы указывали иное при генерации сертификата. Так же можете поменять порт или пул выдаваемых адресов, если хотите.
Запускаем OpenVPN сервер. Выполняем следующую команду:
systemctl start openvpn-server@server
Проверяем работоспособность. Выполняем следующую команду:
systemctl status openvpn-server@server
Можно добавить в автозагрузку. Выполняем следующую команду:
systemctl enable openvpn-server@server
Переходим к настройке клиентской части, на другой машине. Выполняем команду:
su -
Устанавливаем OpenVPN. Выполняем следующую команду:
apt install openvpn
Создаем каталог для хранения ключевой информации OpenVPN клиента. Выполняем следующую команду:
mkdir /etc/openvpn/certs
Далее нам необходимо перенести ключевую информацию, я использую scp (у меня сконфигурирован ssh). А именно файлы: ta.key, john.key, john.crt, ca.crt
Вместо сертификатов на клиента c CN john и его закрытого ключа может быть любой ваш, который вы генерировали (но не сертификат сервера)
Далее переношу ключевую информацию в каталог /etc/openvpn/certs, используя команду mv.
Создаем конфигурационный файл OpenVPN клиента. Выполняя следующую команду:
touch /etc/openvpn/client/client.conf
Открываем конфигурационный фал OpenVPN клиента любым редактором, например nano. Выполняя следующую команду:
nano -w /etc/openvpn/client/client.conf
Приводим конфигурационный файл OpenVPN клиента к следующему виду. Если вы изменяли какие-либо параметры их надо изменить и на клиенте
Вместо 172.16.16.1 ваш IP адрес или доменное имя которые вы указывали и порт вместо 1194 если указывали, так же путь к клиентскому сертификату если файл называется по другому
Запускаем OpenVPN клиент. Используем следующую команду:
systemctl start openvpn-client@client
Проверим состояние OpenVPN клиента. Используем следующую команду:
systemctl status openvpn-client@client
Как видим подключение прошло успешно
Проверим связность внутри туннеля выполнив пинг
Так же клиент можно добавить в автозагрузку. Выполнив команду
systemctl enable openvpn-client@client
Настройка доступа к интернету через OpenVPN туннель
Открываем файл /etc/sysctl.conf любым редактором и документируем строчку содержащую:
net.ipv4.ip_forward=1
Выходим из редактора и применяем параметры используя команду:
sysctl -p
Настраиваем NAT
Выполняем следующую команду, где enp2s0 это имя вашего интерфейса смотрящего в сеть:
iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE
Сохраняем правила фаервола. Выполняем команду:
iptables-save > ~/ipt.save
Открываем файл /etc/network/interfaces
любым редактором например nano, и добавляете:
pre-up iptables-restore < /root/ipt.save
Что означает автоматическое восстановление правил фаервола. Либо можно сделать через системд сервис который будет запускать скрипт до старта таргета сети
Редактируем конфиг OpenVPN сервера любым редактором, добавляя туда параметры:
push “redirect-gateway def1 bypass-dhcp”
push “dhcp-option DNS 1.1.1.1”
Первый параметр означает то что при старте OpenVPN клиента будет создаваться дефолтный маршрут через туннель. Второй опцией мы можем назначить DNS сервер.
Так же мы можем использовать опцию push для анонсирования маршрутов:
push “route 192.168.88.0 255.255.255.0”
Анонсирует маршрут 192.168.88.0 через туннель.
Отзыв сертификатов
Необходимая вещь для того чтобы отобрать у клиента вашего впн сервера доступ к нем. Выполняем команду:
./easyrsa revoke john
где john это CN сертификата, т. е. имя клиента которые вы указали
Сертификат отозвался.
Генерируем список отозванных сертификатов. Выполняя команду:
./easyrsa gen-crl
Переходим в суперпользователя
Копируем список отозванных сертификатов в каталог с ключевой информацией OpenVPN сервера и перезагружаем его.
Видим что клиент не подключается, т.к его сертификат отозван
Связности тоже нет
Спасибо за прочтение данной статьи. Подписывайтесь на YouTube канал, здесь мы на стримах настраиваем Linux, Windows, Cisco. Отдельное Спасибо Роману Заиике за помощь .
Комментарии (11)
maledog
28.05.2023 14:18+7Статья номер 100500 как установить openvpn, и ничего про то как его в дальнейшем эксплуатировать. Вы хоть в курсе, что список отозванных сертификатов имеет срок годности и может "протухнуть"? По-умолчанию через год; и вы столкнетесь с тем что клиенты по этой причине не коннектятся, а дальше отправитесь на stackoverflow. Т. е. список нужно генерировать не только при отзыве, но и просто периодически, чтобы сервер не решил, что вы "забили".
n_bogdanov
28.05.2023 14:18Стоит использовать пакет iptables-persistent или переходить на nftables, а не /etc/network/interfaces. Да и с interfaces пора уходить на systemd.
Lazhu
28.05.2023 14:18Hidden text
#!/bin/sh PREFIX="/usr/local" USERADD="pw useradd" NETNAME="whatever" HOSTNAME=`hostname` WORKDIR="${PREFIX}/etc/openvpn/${NETNAME}" DIRS="ccd certs crl keys private req ready" SED=`which sed` SSL=`which openssl` VPN=`which openvpn` ${USERADD} openvpn for dir in ${DIRS}; do mkdir -p ${WORKDIR}/${dir} done cp openssl.cnf openvpn.conf ${WORKDIR} touch ${WORKDIR}/index.txt ${WORKDIR}/serial cp openvpn.ovpn ${WORKDIR}/ready chown -R root:openvpn ${WORKDIR} chmod -R g+w ${WORKDIR} cp keygen.sh ${PREFIX}/bin/keygen_${NETNAME}.sh cp revoke.sh ${PREFIX}/bin/revoke_${NETNAME}.sh rehash cd ${WORKDIR} chmod 700 keys private echo "01" > serial export KEY_NAME=${HOSTNAME} ${SSL} req -new -nodes -x509 -keyout private/CA_key.pem -out CA_cert.pem -days 3650 ${SSL} req -new -nodes -keyout keys/server.pem -out req/server.pem ${SSL} ca -batch -config openssl.cnf -extensions server -out certs/server.pem -infiles req/server.pem ${SSL} dhparam -out dh2048.pem 2048 ${SSL} ca -config openssl.cnf -gencrl -out crl/crl.pem ${VPN} --genkey --secret ta.key
и никаких костылей в виде easy-rsa
sirmax123
Картинками? Это серьезно?
0mogol0
я бы даже сказал скриншотами... Когда две строчки текста (комманда и вывод) и три четверти пустого экрана
First_samurai Автор
Здравствуйте. Статья писалась для студентов. Им нужно расписать очень подробно и текст там есть
AntoineLarine
Что за студенты пошли, которые OpenVPN не могут освоить без 100500 скриншотов?