====== 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/|Источник]]