====== Debian 11 OpenVPN ====== ===== Сервер ===== Easy-rsa можно установить из пакетов. Путь запуска будет /usr/share/easy-rsa/easyrsa apt install openvpn easy-rsa mkdir /etc/openvpn/easyrsa cd /etc/openvpn/easyrsa Делаем структуру для ключей прямо в папке /etc/openvpn/easyrsa/pki /usr/share/easy-rsa/easyrsa init-pki Копируем и редактируем основные настройки сертификатов. Файл должен быть внутри pki. cp /usr/share/easy-rsa/vars.example pki/vars Создание удостоверяющего центра /usr/share/easy-rsa/easyrsa build-ca Получаем 2 файла: /etc/openvpn/easyrsa/pki/private/ca.key (Приватный ключ сервера) /etc/openvpn/easyrsa/pki/ca.crt (Публичный сертификат сервера) Запрос сертификата для сервера без пароля /usr/share/easy-rsa/easyrsa gen-req server nopass Подписываем запрос на получение сертификата у нашего CA, вводим пароль от приватного ключа CA, сделанного ранее /usr/share/easy-rsa/easyrsa sign-req server server Генерируем ключ Диффи-Хелмана /usr/share/easy-rsa/easyrsa gen-dh Ссылки на файлы ln -s /etc/openvpn/easyrsa/pki/ca.crt /etc/openvpn/server/ca.crt ln -s /etc/openvpn/easyrsa/pki/dh.pem /etc/openvpn/server/dh.pem ln -s /etc/openvpn/easyrsa/pki/issued/server.crt /etc/openvpn/server/server.crt ln -s /etc/openvpn/easyrsa/pki/private/server.key /etc/openvpn/server/server.key Генерируем ключ шифрования TLS control channel openvpn --genkey secret /etc/openvpn/server/tc.key Создаём директорию для индивидуальных настроек клиентов mkdir /etc/openvpn/ccd port 41991 proto udp dev tun ca ca.crt cert server.crt key server.key dh dh.pem auth SHA256 # выбор алгоритма шифрования для аутентификации data-ciphers AES-128-GCM # выбор алгоритма шифрования всех передаваемых через vpn данных tls-version-min 1.2 # ограничиваем минимальную версию протокола tls tls-crypt tc.key # ключ для шифрования TLS control channel server 10.100.0.0 255.255.255.0 # подсеть для туннеля, может быть любой ifconfig-pool-persist ipp.txt # файл с записями соответствий clinet - ip #push "redirect-gateway def1 bypass-dhcp" #push "dhcp-option DNS 77.88.8.8" #push "dhcp-option DNS 77.88.8.1" client-to-client # позволяет клиентам openvpn подключаться друг к другу client-config-dir /etc/openvpn/ccd # директория с индивидуальными настройками клиентов keepalive 10 120 #comp-lzo # если используется протокол tcp, сжатие надо отключить max-clients 10 explicit-exit-notify 1 # если используется протокол tcp, поменять на 0 persist-key persist-tun status /var/log/openvpn/openvpn-status.log log /var/log/openvpn/openvpn.log user nobody group nogroup verb 3 mode server Для Proxmox контейнера нужно добавить в конфиг две строки lxc.cgroup.devices.allow: c 10:200 rwm lxc.mount.entry: /dev/net dev/net none bind,create=dir Запуск сервера systemctl enable openvpn-server@server.service --now ===== Создание сертификатов для клиентов ===== Скрипт создания сертификатов для клиента.Вводим имя нового клиента и пароль от приватного ключа CA, сделанного ранее #!/bin/bash cd /etc/openvpn/easyrsa echo "Please enter Client Name:" read NAME /usr/share/easy-rsa/easyrsa build-client-full $NAME nopass Скрипт для создания конфигурационного файла клиента. Вводим client-name, получаем единый client-name.ovpn файл настроек. #!/bin/bash # Default Variable Declarations DEFAULT="client \n proto udp \n remote my.openvpn.server.ru \n port 41991 \n dev tun \n nobind \n route 10.100.0.0 255.255.255.0\n\n" FILEEXT=".ovpn" CRT=".crt" KEY=".key" CA="ca.crt" TA="tc.key" sPath="./easyrsa/pki/issued/" kPath="./easyrsa/pki/private/" pPath="./easyrsa/pki/" tPath="./server/" #Ask for a Client name echo "Please enter an existing Client Name:" read NAME ovpnName=$NAME #1st Verify that client's Public Key Exists if [ ! -f $sPath$NAME$CRT ]; then echo "[ERROR]: Client Public Key Certificate not found: $sPath$NAME$CRT" exit fi echo "Client's cert found: $sPath$NAME$CRT" #Then, verify that there is a private key for that client if [ ! -f $kPath$NAME$KEY ]; then echo "[ERROR]: Client Private Key not found: $kPath$NAME$KEY" exit fi echo "Client's Private Key found: $kPath$NAME$KEY" #Confirm the CA public key exists if [ ! -f $pPath$CA ]; then echo "[ERROR]: CA Public Key not found: $pPath$CA" exit fi echo "CA public Key found: $pPath$CA" #Confirm the tls-auth ta key file exists if [ ! -f $tPath$TA ]; then echo "[ERROR]: tls-auth Key not found: $tPath$TA" exit fi echo "tls-auth Private Key found: $tPath$TA" #Ready to make a new .opvn file - Start by populating with the echo -e $DEFAULT > $ovpnName$FILEEXT #Now, append the CA Public Cert echo "" >> $ovpnName$FILEEXT cat $pPath$CA | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> $ovpnName$FILEEXT echo "" >> $ovpnName$FILEEXT #Next append the client Public Cert echo "" >> $ovpnName$FILEEXT cat $sPath$NAME$CRT | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> $ovpnName$FILEEXT echo "" >> $ovpnName$FILEEXT #Then, append the client Private Key echo "" >> $ovpnName$FILEEXT cat $kPath$NAME$KEY >> $ovpnName$FILEEXT echo "" >> $ovpnName$FILEEXT #Finally, append the TA Private Key echo "" >> $ovpnName$FILEEXT cat $tPath$TA >> $ovpnName$FILEEXT echo "" >> $ovpnName$FILEEXT echo "Done! $ovpnName$FILEEXT Successfully Created." #Script written by Eric Jodoin #Update by Eric Maasdorp 2017-12-16 ===== Клиент ==== Запуск клиента systemctl enable openvpn-client@client.service --now Импорт из единого файла настроек для NetworkManager. После импорта необходимо поправить опцию VPN соединения (Идентификация-Дополнительно-Аутентификация TLS-Режим-TLS Crypt) nmcli connection import type openvpn file ./client-name.ovpn ===== Доп ===== ################# НАСТРОЙКИ OpenVPN ##################################### 22. mkdir /etc/openvpn/ccd && mkdir /var/log/openvpn 23. mcedit /etc/openvpn/ccd/client01 - файл создал, но никаких параметров в нем не указывал. 24. systemctl start openvpn-server@server.service - Запускаем сервер 25. netstat -tulnp | grep 41941 - смотрим открылся ли порт 26. ip a - проверяем интерфейс tun 27. netstat -nr - проверяем статическую маршрутизацию. 28. systemctl enable openvpn-server@server.service - добавляем сервер в автозапуск 29. Добавляем правила в iptables: создаем файл или правим существующий /etc/iptables.sh (----------------------- #!/bin/bash # # Объявление переменных export IPT="iptables" # Активный сетевой интерфейс export WAN=enp5s0 export WAN_IP=192.168.10.2 # Очистка всех цепочек iptables $IPT -F $IPT -F -t nat $IPT -F -t mangle $IPT -X $IPT -t nat -X $IPT -t mangle -X # Установим политики по умолчанию для трафика, не соответствующего ни одному из правил $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP # разрешаем локальный траффик для loopback $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT # разрешаем пинги $IPT -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT $IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT $IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT $IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # Разрешаем исходящие соединения самого сервера $IPT -A OUTPUT -o $WAN -j ACCEPT # Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении. # Пропускать все уже инициированные соединения, а также дочерние от них $IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT # Пропускать новые, а так же уже инициированные и их дочерние соединения $IPT -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешить форвардинг для уже инициированных и их дочерних соединений $IPT -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT # Включаем фрагментацию пакетов. Необходимо из-за разных значений MTU $IPT -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu # Отбрасывать все пакеты, которые не могут быть идентифицированы # и поэтому не могут иметь определенного статуса. $IPT -A INPUT -m state --state INVALID -j DROP $IPT -A FORWARD -m state --state INVALID -j DROP # Приводит к связыванию системных ресурсов, так что реальный # обмен данными становится не возможным, обрубаем $IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP $IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP # Разрешаем OpenVPN $IPT -A INPUT -i tun+ -j ACCEPT $IPT -A OUTPUT -o tun+ -j ACCEPT $IPT -A FORWARD -i tun+ -j ACCEPT # Открываем порт для ssh (!!!не забудьте указать свой порт, который вы изменили ранее!!!) $IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT # Открываем порт для web сервера #$IPT -A INPUT -i $WAN -p tcp --dport 80 -j ACCEPT - (у себя не открывал, кому надо активируйте) #$IPT -A INPUT -i $WAN -p tcp --dport 443 -j ACCEPT - (у себя не открывал, кому надо активируйте) # Открываем порт для openvpn $IPT -A INPUT -i $WAN -p udp --dport 41941 -j ACCEPT $IPT -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE # Записываем правила в файл /sbin/iptables-save > /etc/iptables_rules ----------------------------------) делаем файл иисполняемым chmod 700 /etc/iptables.sh и выполняем скрипт sh /etc/iptables.sh 30. добавляем net.ipv4.ip_forward = 1 в файл /etc/sysctl.conf и применяем настройку командой sysctl -p ==== Клиент ==== Создадим ключ для клиента openvpn: ./easyrsa gen-req client01 nopass ./easyrsa sign-req client client01 Вводим пароль, отвечаем yes. В результате получаем подписанный сертификат клиента: /etc/openvpn/keys/easy-rsa/pki/issued/client01.crt /etc/openvpn/keys/easy-rsa/pki/private/client01.key Команды gen-req и sign-req можно объединить в одну с помощью build-client-full примерно так: ./easyrsa build-client-full client01 nopass Клиенту нужно будет передать следующий набор файлов - client01.crt, client01.key, ca.crt, tc.key. Либо использовать единый файл конфигурации клиента, который включает в себя в том числе и сертификаты. [[https://serveradmin.ru/nastroyka-openvpn-na-centos/|Источник]]