Инструменты пользователя

Инструменты сайта


сайты:debian_11_openvpn

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
/etc/openvpn/server/server.conf
                                                                                                                                    
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 контейнера нужно добавить в конфиг две строки

/etc/pve/lxc/nnnn.conf
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, сделанного ранее

/etc/openvpn/make-client-sertificate
#!/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 файл настроек.

/etc/openvpn/make-client-inline-config
#!/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 "<ca>" >> $ovpnName$FILEEXT
cat $pPath$CA | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> $ovpnName$FILEEXT
echo "</ca>" >> $ovpnName$FILEEXT
 
#Next append the client Public Cert
echo "<cert>" >> $ovpnName$FILEEXT
cat $sPath$NAME$CRT | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> $ovpnName$FILEEXT
echo "</cert>" >> $ovpnName$FILEEXT
 
#Then, append the client Private Key
echo "<key>" >> $ovpnName$FILEEXT
cat $kPath$NAME$KEY >> $ovpnName$FILEEXT
echo "</key>" >> $ovpnName$FILEEXT
 
#Finally, append the TA Private Key
echo "<tls-crypt>" >> $ovpnName$FILEEXT
cat $tPath$TA >> $ovpnName$FILEEXT
echo "</tls-crypt>" >> $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. Либо использовать единый файл конфигурации клиента, который включает в себя в том числе и сертификаты.

Источник

сайты/debian_11_openvpn.txt · Последнее изменение: 2024.02.21 07:23 — feser