Настройка OpenVPN сервера на Debian 11

Опубликовано administrator - ср, 07/27/2022 - 14:23

Пошаговая инструкция по настройке OpenVPN сервера с авторизацией через LDAP (AD) на Debian Linux 11.

На сервере

1) Устанавливаем пакеты:

 

apt install openvpn openvpn-auth-ldap iptables -y

2) Выпускаем ключи для сервера и клиента

cd /etc/openvpn/
/usr/share/easy-rsa/easyrsa clean-all
/usr/share/easy-rsa/easyrsa init-pki

Жмем "yes"

/usr/share/easy-rsa/easyrsa build-ca nopass

Задаем Common Name

/usr/share/easy-rsa/easyrsa build-server-full server nopass
/usr/share/easy-rsa/easyrsa gen-dh
/usr/share/easy-rsa/easyrsa build-client-full client nopass

openvpn --genkey secret ./pki/ta.key

Копируем все серверные сертификаты и ключи в текущую директорию с OpenVPN

cp pki/ca.crt pki/dh.pem pki/ta.key pki/private/server.key pki/issued/server.crt ./

3) Создаем конфиг сервера

nano /etc/openvpn/server.conf

и копируем в него следующие строки:

#порт на котором работает сервер
port 1195
# протокол - советую udp
proto udp
# - используемый тип устройства и номер
dev tun0
mode server
#указываем файл CA
ca /etc/openvpn/ca.crt
#указываем файл с сертификатом сервера
cert /etc/openvpn/server.crt
#указываем файл с ключем сервера
key /etc/openvpn/server.key
#указываем файл Диффи Хельман
dh /etc/openvpn/dh.pem
#задаем IP-адрес сервера и маску подсети
# (виртуальной сети) - можно произвольную, (я выбрал такую)
server 192.168.5.0 255.255.255.0
#задаем МАРШРУТ который передаём клиентту
# и маску подсети для того чтобы он "видел"
# сеть за опенвпн сервером (сеть 192.168.10.0/24)
push "route 192.168.10.0 255.255.255.0"
push "dhcp-option DNS 192.168.10.1"
push "dhcp-option DOMAIN domain.local"

topology subnet
# указываем где хранятся файлы с
# настройками IP-адресов клиентов
client-config-dir /etc/openvpn/ccd
# добавляем маршрут сервер-клиент
route 192.168.5.0 255.255.255.0
# включаем TLS аутификацию
tls-server
# указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
tls-auth /etc/openvpn/ta.key 0
# таймаут до реконекта
tls-timeout 120
auth MD5 #
# включаем шифрацию пакетов
cipher AES-256-CBC
keepalive 10 120
# сжатие трафика
comp-lzo adaptive
# максимум клиентов
max-clients 25
user nobody
group nogroup
# Не перечитывать ключи после получения
# SIGUSR1 или ping-restart
persist-key
# Не закрывать и переоткрывать TUN\TAP
# устройство, после получения
# SIGUSR1 или ping-restart
persist-tun
# логирование (не забудьте создать эту директорию /var/log/openvpn/)
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
# разрешить менять внешний IP клиенту не переподключаясь
float
# Уровень информации для отладки
verb 3
#plugin /usr/lib/openvpn/openvpn-auth-pam.so login
script-security 3

plugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/ldap/auth-ldap.conf
#client-cert-not-required
verify-client-cert none
username-as-common-name
ifconfig-pool-persist ipp.txt

4) Настраиваем хождение пакетов и фаервол

Редактируем файл /etc/sysctl.conf

nano /etc/sysctl.conf

Раскомментируем строку 

net.ipv4.ip_forward=1

Применяем изменения

sysctl -p /etc/sysctl.conf

Создаем конфиг фаервола:

nano /etc/firewall

Пишем в файл следующее:

#!/bin/sh

LANI=ens18
LAN=192.168.10.0/24
LANIP=192.168.10.254
VPNI=tun0
VPNIP=192.168.5.1
VPN=192.168.5.0/24

########################################################
case "$1" in
stop)
echo "Shutting down firewall..."

iptables --flush
iptables --delete-chain
iptables --table nat --flush
iptables --table filter --flush
iptables --table nat --delete-chain
iptables --table filter --delete-chain

iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT

echo "...done"
;;
status)
echo $"Table: filter"
iptables --list
echo $"Table: nat"
iptables -t nat --list
;;
restart|reload)
$0 stop
$0 start
;;
################
start)
echo "Starting Firewall..."
echo ""
#######################################################

#LOCAL
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1 -j ACCEPT
iptables -A INPUT -s $LAN -j ACCEPT
iptables -A OUTPUT -d $LAN -j ACCEPT
iptables -A INPUT -i $LANI -j ACCEPT

#OpenVPN
iptables -t nat -A POSTROUTING -s $VPN -o $LANI -j MASQUERADE

iptables -A INPUT -d $LAN -j ACCEPT
iptables -A OUTPUT -s $LAN -j ACCEPT
iptables -A INPUT -s $VPN -j ACCEPT
iptables -A OUTPUT -d $VPN -j ACCEPT

iptables -A INPUT -s $VPN -j ACCEPT
iptables -A INPUT -d $VPN -j ACCEPT
iptables -A OUTPUT -d $VPN -j ACCEPT
iptables -A OUTPUT -s $VPN -j ACCEPT

iptables -A FORWARD -s $VPN -d $LAN -j ACCEPT
iptables -A FORWARD -d $VPN -s $LAN -j ACCEPT

#LOG
iptables -A INPUT -j LOG --log-prefix "DROP INPUT packet: "
iptables -A OUTPUT -j LOG --log-prefix "DROP OUTPUT packet: "
iptables -A FORWARD -j LOG --log-prefix "DROP FORWARD packet: "

iptables -A INPUT -j DROP
#iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP

#############################################################
echo "...done"
echo "--> IPTABLES firewall loaded/activated <--"
;;
*)
echo "Usage: firewall (start|stop|restart|status) EXTIF INTIF"
exit 1
esac

exit 0

Запускаем фаервол:

/etc/firewall start

Настраиваем автозапуск фаервола после перезагрузки. Открываем файл с настройками сетевых интерфейсов:

nano /etc/network/interfaces

Добавляем в самый конец строку:

post-up /etc/firewall start

5) Настройка авторизации через LDAP

Заводим на контроллере домена нового пользователя (обычного) "ovpn" и группу "vpn_access", в которую будем добавлять тех пользователей, которым будем предоставлять доступ.

Создаем папку для конфига и файл конфигурации:

mkdir /etc/openvpn/ldap
nano /etc/openvpn/ldap/auth-ldap.conf

Копируем в него следующие строки, где надо подставляем свои значения, в URL указываем адрес контроллера домена:

# Параметры подключения к домену
<LDAP>
       URL             ldap://192.168.10.1
        BindDN  "CN=ovpn,CN=Users,DC=domain,DC=local"
        Password        Pa$$word
        Timeout         15
        TLSEnable       no
</LDAP>
# Параметры авторизации пользователей входящих в группу RemoteAccess которая создана в подразделении Domain Groups в домене
<Authorization>
        BaseDN          "DC=domain,DC=local"
        SearchFilter "(&(sAMAccountName=%u))"
        # Require Group Membership
        RequireGroup    true
        <Group>
                BaseDN          "DC=domain,DC=local"
                SearchFilter    "(cn=vpn_access)"
                MemberAttribute "member"
        </Group>
</Authorization>

6) Создаем директорию ccd

mkdir ccd

7) Создаем файл ipp.txt

touch ipp.txt

8) Перезагружаемся

9) Вводим команду 

ip a

И убеждаемся, что у нас появился интерфейс tun0

10) Настройка завершена

На клиенте

1) Достаем с сервера файлы ca.crt и ta.key любым удобным способом

2) Создаем файл с произвольным именем и расширением .ovpn (удобно использовать название компании), копируем в него следующие строки:

 

dev tun
proto udp
remote 10.20.30.40 #(реальный айпи вашего сервера)
port 1195 #(порт к которому устанавливать соединение
client
resolv-retry infinite
tls-client
auth MD5
cipher AES-256-CBC
#ns-cert-type server
remote-cert-tls server
comp-lzo
persist-key
persist-tun
verb 3
ping 10
auth-user-pass
route-method exe
route-delay 2
key-direction 1
script-security 2
auth-nocache
<ca>
-----BEGIN CERTIFICATE-----


Содержимое сертификата ca.crt

-----END CERTIFICATE-----
</ca>
<tls-auth>
-----BEGIN OpenVPN Static key V1-----

Содержимое ключа ta.key

-----END OpenVPN Static key V1-----
</tls-auth>