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

Main

Оценка: 99.2% - 5 Голосов

Общая

Пример простой настройки OpenVPN сервера в Debian 10 (buster) для доступа работников к сеть организации.

1. Установка необходимых компонентов

Для начала установим необходимые компоненты

apt update && apt -y install ca-certificates wget net-tools gnupg
wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -
echo "deb http://build.openvpn.net/debian/openvpn/stable buster main" > /etc/apt/sources.list.d/openvpn-aptrepo.list
apt update
apt upgrade
apt install openvpn iptables iptables-persistent openssl ca-certificates -y

 

Установка EasyRSA

wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz
tar xzf EasyRSA-3.0.8.tgz
mv ~/EasyRSA-3.0.8/ /etc/openvpn/
mv /etc/openvpn/EasyRSA-3.0.8/ /etc/openvpn/easy-rsa/
rm -f EasyRSA-3.0.8.tgz

 

2. Настройка сертификатов

Создаем необходимые для работы сервера сертификаты:

cd /etc/openvpn/easy-rsa/
./easyrsa init-pki
./easyrsa --batch build-ca nopass
EASYRSA_CERT_EXPIRE=3650 ./easyrsa build-server-full server nopass
EASYRSA_CERT_EXPIRE=3650 ./easyrsa build-client-full CLIENT nopass
EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
cp pki/ca.crt pki/private/ca.key pki/issued/server.crt pki/private/server.key pki/crl.pem /etc/openvpn
chown nobody:nogroup /etc/openvpn/crl.pem
openvpn --genkey --secret /etc/openvpn/ta.key
openssl dhparam -out /etc/openvpn/dh.pem 2048

 

3. Настройка сервера

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

Для клиентов не поддерживающих сервер OpenVPN 2.5 и выше замените data-ciphers CHACHA20-POLY1305:AES-128-GCM на cipher AES-128-GCM


nano /etc/openvpn/server.conf

Добавляем в файл следующие строки:

port 1194
proto udp
dev tun
sndbuf 0
rcvbuf 0
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
auth SHA512
tls-auth /etc/openvpn/ta.key 0
topology subnet
server 172.16.100.0 255.255.255.0                           #Здесь указан адрес сети для клиентов
local 1.2.3.4                                                                #Адрес сетевого интерфейса сервера
ifconfig-pool-persist /etc/openvpn/ipp.txt
# Если надо исключить одиночный IP Адрес 
#push "route 1.2.3.4 255.255.255.255 net_gateway"
# Если надо исключить сеть
#push "route 1.2.3.4 255.255.255.0 net_gateway"
push "redirect-gateway def1 bypass-dhcp"
#Указать делаемый DNS сервера
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
data-ciphers CHACHA20-POLY1305:AES-128-GCM
user nobody
group nogroup
persist-key
persist-tun
client-to-client
status /etc/openvpn/openvpn-status.log
verb 3
crl-verify /etc/openvpn/crl.pem

 

Настраиваем iptables

Сначала необходимо узнать имя сетевого интерфейса через команду ip addr и в примере имя интерфейса eth0 заменить на него.

iptables -t nat -A POSTROUTING -o eth0 -s 172.16.100.0/24 -j MASQUERADE
iptables -A INPUT -i eth0 -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o eth0 -s 172.16.100.0/24 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables-save > /etc/iptables/rules.v4

 

4. Настройка файла конфигурации клиента:

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

nano /etc/openvpn/client.txt

Добавляем в файл следующие строки:

Для клиентов не поддерживающих сервер OpenVPN 2.5 и выше замените data-ciphers CHACHA20-POLY1305:AES-128-GCM на cipher AES-128-GCM


client
dev tun
proto udp
sndbuf 0
rcvbuf 0
tun-mtu 1500
mssfix 1420
remote 1.2.3.4  1194         #Внешний адрес сервера на который клиент будет подключаться из интернета
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
auth-nocache
data-ciphers CHACHA20-POLY1305:AES-128-GCM
setenv opt block-outside-dns
key-direction 1
verb 3

Активируем функцию пересылки пакетов:

nano /etc/sysctl.conf

Ищем и разкомментируем следующую строку

net.ipv4.ip_forward=1

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

sysctl -p.

Перезагружаем сервер

reboot

 

5. Создаем скрипт для управления пользователями

Создаем скрипт на bash:

Готовый файл можно взять ТУТ

cd ~
nano openvpn-user-manager.sh

Добавляем в файл следующие строки:

#!/usr/bin/env bash
if readlink /proc/$$/exe | grep -q "dash"; then
     echo "This script needs to be run with bash, not sh."
     exit
fi
if [[ "$EUID" -ne 0 ]]; then
     echo "Sorry, you need to run this as root"
     exit
fi
newclient () {
     # Generates the custom client.ovpn
     cp /etc/openvpn/client.txt ~/$1.ovpn
     echo "<ca>" >> ~/$1.ovpn
     cat /etc/openvpn/easy-rsa/pki/ca.crt >> ~/$1.ovpn
     echo "</ca>" >> ~/$1.ovpn
     echo "<cert>" >> ~/$1.ovpn
     sed -ne '/BEGIN CERTIFICATE/,$ p' /etc/openvpn/easy-rsa/pki/issued/$1.crt >> ~/$1.ovpn
     echo "</cert>" >> ~/$1.ovpn
     echo "<key>" >> ~/$1.ovpn
     cat /etc/openvpn/easy-rsa/pki/private/$1.key >> ~/$1.ovpn
     echo "</key>" >> ~/$1.ovpn
     echo "<tls-auth>" >> ~/$1.ovpn
     sed -ne '/BEGIN OpenVPN Static key/,$ p' /etc/openvpn/ta.key >> ~/$1.ovpn
     echo "</tls-auth>" >> ~/$1.ovpn
}
if [[ -e /etc/openvpn/server.conf ]]; then
     while :
     do
      clear
         echo ""
         echo "What do you want to do?"
         echo " 1) Add a new user"
         echo " 2) Remove an existing user"
         echo " 3) Exit"
         read -p "Select an option [1-3]: " option
         case $option in
             1) 
             echo
             echo "Please don't use special characters, only clear words."
             read -p "Client name: " -e CLIENT
             cd /etc/openvpn/easy-rsa/
             EASYRSA_CERT_EXPIRE=3650 ./easyrsa build-client-full $CLIENT nopass
             newclient "$CLIENT"
             echo
             echo "Client $CLIENT added, configuration is available at:" ~/"$CLIENT.ovpn"
             exit
             ;;
             2)
             NUMBEROFCLIENTS=$(tail -n +2 /etc/openvpn/easy-rsa/pki/index.txt | grep -c "^V")
             if [[ "$NUMBEROFCLIENTS" = '0' ]]; then
                 echo
                 echo "We were not able to find existing clients!"
                 exit
             fi
             echo
             echo "Select the existing client certificate you want to revoke:"
             tail -n +2 /etc/openvpn/easy-rsa/pki/index.txt | grep "^V" | cut -d '=' -f 2 | nl -s ') '
             if [[ "$NUMBEROFCLIENTS" = '1' ]]; then
                 read -p "Select one client [1]: " CLIENTNUMBER
             else
                 read -p "Select one client [1-$NUMBEROFCLIENTS]: " CLIENTNUMBER
             fi
             CLIENT=$(tail -n +2 /etc/openvpn/easy-rsa/pki/index.txt | grep "^V" | cut -d '=' -f 2 | sed -n "$CLIENTNUMBER"p)
             echo
             read -p "Do you actually desire to revoke the access of the client? $CLIENT? [y/N]: " -e REVOKE
             if [[ "$REVOKE" = 'y' || "$REVOKE" = 'Y' ]]; then
                 cd /etc/openvpn/easy-rsa/
                 ./easyrsa --batch revoke $CLIENT
                 EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
                 rm -f pki/reqs/$CLIENT.req
                 rm -f pki/private/$CLIENT.key
                 rm -f pki/issued/$CLIENT.crt
                 rm -f /etc/openvpn/crl.pem
                 cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/crl.pem
                 chown nobody:nogroup /etc/openvpn/crl.pem
                 echo
                 echo "Certificate for the client $CLIENT is revoked!"
             else
                 echo
                 echo "Certificate revocation for client $CLIENT aborted!"
             fi
             exit
             ;;
             3)
             exit
             ;;
         esac
     done
else
      clear
     echo "OpenVPN is not installed."
     echo "Install OpenVPN first"
fi

после чего запускаем скрипт и создаем пользователя

./openvpn-user-manager.sh

Полученый файл используем в клиенте OpenVPN.

 

  • Просмотров: 11446
Добавить комментарий