Конфигурация openvpn сервера в Linux Alpine
Общие сведения
OpenVpn используется для создания защитного туннеля между сервером openvpn и клиентом openvpn, геолокация IP-адреса ( провайдера ) заменяется на геолокацию VPN-сервера. Интернет-провайдер не сможет получить доступ к данным туннеля, поэтому можно использовать vpn для обхода блокировок сайтов, но только если ip-адрес сервера vpn не заблокирован провайдером и имеет доступ к этим сайтам
openvpn позволяет устанавливать соединение между компьютерами минуя NAТ или сетевой экран
openvpn позволяет создавать защищенные каналы для удаленных сегментов сети, например между филиалами ( городами ).
Для шифрования и аутентификации OpenVPN используется библиотека OpenSSL
OpenVPN использует собственный протокол на базе TLS и SSL и не поддерживает L2TP, IPSec и PPTP
OpenVPN использует 256-битное OpenSSL-шифрование, но может использовать более сложные шифры
Для защиты пользователей от сканирования портов, DoS-атак и наводнения портов, используется tls-auth для проверки подписи HMAC
Из за сильного уровня шифрования лучше использовать протокол UDP
Установка
Перед настройкой vpn установить временную зону
Далее установка openvpn:
#установить openvpn
apk add openvpn
#добавить сервис в автозагрузку
rc-update add openvpn default
#добавить модуль ядра tun
modprobe tun
echo "tun" >> /etc/modules-load.d/tun.conf
#включить IP Forwarding
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/ipv4.conf
sysctl -p /etc/sysctl.d/ipv4.conf
TUN/TAP
Модуль ядра tun/tap - виртуальный сетевой драйвер, эмулирует работу Ethernet адаптера
TAP - работает на канальном уровне ( кадры ), создает сетевой мост
TUN - работает на сетевом уровне ( пакеты ), создает маршрутизацию
Данная программа перенаправляет входящие и исходящие пакеты через специальный файловый дескриптор, внедряя пакеты в сетевой стек операционной системы.
IP-forwarding
IP-forwarding - возможно перенаправлять пакеты через устройство, по умолчанию отключено.
Проверить включен или нет можно так:
localhost:~# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
Включить можно так:
sudo sysctl -w net.ipv4.ip_forward=1
Или добавить строку "net.ipv4.ip_forward = 1" в файл /etc/sysctl.d/ipv4.conf
Для применения настроек выполнить следующую команду:
sudo sysctl -p
Создание сертификатов
easy-rsa - необходим для упрощения создания ключей и сертификатов
apk add easy-rsa
#Каталог для готовых сертификатов:
mkdir -p /etc/openvpn/keys
#Каталог для сгенерированных сертификатов:
mkdir /etc/openvpn/easy-rsa
#скопировать в созданный каталог шаблоны для генерирования сертификатов:
cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa
#Перейти в каталог для сгенерированных сертификатов:
cd /etc/openvpn/easy-rsa
Файл vars - шаблон для создания ключей, хранит переменные окружения
Редактировать файл vars
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Moscow"
export KEY_CITY="Moscow"
export KEY_ORG="MY COMPANY"
export KEY_EMAIL="89261969132@mail.ru"
export KEY_CN="CHICH"
export KEY_OU="CHICH"
export KEY_NAME="openvpn.netbash.ru"
export KEY_ALTNAMES="openvpn.netbash.ru"
PKI - инфраструктура публичных ключей
Повторное выполнение следующей команды уничтожит существующий CA и потребует повторного создания всех ключей и сертификатов
Инициализация PKI
localhost:/etc/openvpn/easy-rsa# ./easyrsa init-pki
Notice
------
'init-pki' complete; you may now create a CA or requests.
Your newly created PKI dir is:
* /etc/openvpn/easy-rsa/pki
* Using Easy-RSA configuration: /etc/openvpn/easy-rsa/vars
* The preferred location for 'vars' is within the PKI folder.
To silence this message move your 'vars' file to your PKI
or declare your 'vars' file with option: --vars=
* Using x509-types directory: /etc/openvpn/easy-rsa/x509-types
Создание корневого сертификата
# ./easyrsa build-ca
* Using SSL: openssl OpenSSL 1.1.1q 5 Jul 2022
* Using Easy-RSA configuration: /etc/openvpn/easy-rsa/vars
* The preferred location for 'vars' is within the PKI folder.
To silence this message move your 'vars' file to your PKI
or declare your 'vars' file with option: --vars=
Enter New CA Key Passphrase: #Здесь указывается пароль, который будет использоваться для ключа сертификации
#Этот пароль защищает приватный ключ удостоверяющего центра
Re-Enter New CA Key Passphrase:
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: #Здесь можно пропустить ввод клавишей Enter
Notice
------
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/easy-rsa/pki/ca.crt
После выполнения этих команд будет созданы структуры директорий CA, публичный сертификат центра сертификации ca.crt располагается в директории pki, закрытый ключ ca.key в pki/private
Запрос сертификата для сервера
localhost:/etc/openvpn/easy-rsa# ./easyrsa gen-req server nopass
Common Name (eg: your user, host, or server name) [server]: #Данный шаг можно пропустить ( Enter )
Keypair and certificate request completed. Your files are:
req: /etc/openvpn/easy-rsa/pki/reqs/server.req
key: /etc/openvpn/easy-rsa/pki/private/server.key
Генерация сертификата
В следующей команде server это имя сервера
При выполнении будет создан запрос на сертификат ( /pki/issued/server.crt ) и сгенерирован закрытый ключ сервера server.key, он будет располагаться в pki/private. Закрытый ключ не должен передаваться по открытым каналам связи
./easyrsa sign-req server server
#Далее необходимо подтвердить данные:
Request subject, to be signed as a server certificate for 825 days:
subject=
commonName = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Using configuration from /etc/openvpn/easy-rsa/pki/ee09ad28/temp.d2605a45
#Ранее указанным паролем подтвердить:
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server'
Certificate is to be certified until Feb 27 21:10:09 2025 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
Notice
------
Certificate created at: /etc/openvpn/easy-rsa/pki/issued/server.crt
Ключ Гофмана
Ключ Диффи Хеллмана применяется для обеспечения дополнительной защиты трафика от расшифровки между клиентом и сервером.
./easyrsa gen-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
...................................................+..
DH parameters appear to be ok.
Notice
------
DH parameters of size 2048 created
at: /etc/openvpn/easy-rsa/pki/dh.pem
Генерация ta ключа
Для активации tls-auth необходим дополнительный секретный ключ ta
Tls-auth добавляет подпись HMAC к handshake-пакетам SSL/TLS
Сгенерировать ключ можно с помощью команды
localhost:/etc/openvpn/easy-rsa# openvpn --genkey --secret pki/ta.key
Перенос сгенерированных ключей в рабочий каталог сервера
Скопировать ключи в созданный каталог /etc/openvpn/keys
localhost:/etc/openvpn/easy-rsa# cp pki/ca.crt /etc/openvpn/keys/
localhost:/etc/openvpn/easy-rsa# cp pki/issued/server.crt /etc/openvpn/keys/
localhost:/etc/openvpn/easy-rsa# cp pki/private/server.key /etc/openvpn/keys/
localhost:/etc/openvpn/easy-rsa# cp pki/dh.pem /etc/openvpn/keys/
localhost:/etc/openvpn/easy-rsa# cp pki/ta.key /etc/openvpn/keys/
localhost:/etc/openvpn/easy-rsa# ls ../keys/
ca.crt dh.pem server.crt server.key ta.key
Настройка openvpn сервера
Создать конфигурационный файл /etc/openvpn/server.conf и вставить в него данные:
local 192.168.1.1
port 443
proto udp
dev tun
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh.pem
tls-auth keys/ta.key 0
server 172.16.10.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
max-clients 32
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 4
mute 20
daemon
mode server
tls-server
comp-lzo
local — адрес, на котором обрабатываются запросы OpenVPN;
port — сетевой порт ( порт 1194 является стандартным для OpenVPN).
proto — транспортный протокол.
dev — виртуальный сетевой адаптер
ca — путь до корневого сертификата
cert — путь до открытого сертификата сервера.
key — путь до закрытого сертификата сервера.
dh — путь до ключа Диффи Хеллмана.
tls-auth — путь до tls ключа.
server — IP-адрес сервера в сети VPN.
ifconfig-pool-persist — путь к файлу клиентских IP-адресов.
keepalive X Y — каждые X секунд отправляется ping-запрос на удаленный узел. Если за Y секунд не получено ответа — перезапускать туннель
max-clients — максимум одновременных подключений
persist-key — не перезагружать ключи при повторной загрузки из-за разрыва соединения
persist-tun — не изменять устройства tun/tap при перезапуске сервера
status — путь до журнала статусов
log-append — путь до файла лога
verb — уровень логирования событий. От 0 до 9
mute — ограничение количества подряд отправляемых в лог событий
daemon — работа в режиме демона
mode — в каком режиме работает openvpn (сервер или клиент)
tls-server — указывает, что данный сервер работает с использованием TLS
comp-lzo — использовать сжатие
Создать каталог логов, добавить службу в автозапуск
mkdir /var/log/openvpn
rc-update add openvpn@server
Настройка openvpn клиента
На сервере создать ключи для клиента:
export EASYRSA_CERT_EXPIRE=1460
#Создать сертификат для клиента:
./easyrsa build-client-full client1 nopass
#Копировать ключи во временную директорию:
cp pki/issued/client1.crt pki/private/client1.key pki/ca.crt pki/ta.key /tmp/keys/
#Задать права
chmod -R a+r /tmp/keys
На стороне клиента:
#Скачать сгенерированные ключи:
rsync -Pzavrc -e 'ssh -p 9876' user1@192.168.1.1:/tmp/keys ./
На клиентском сервер в директории /etc/openvpn/ создать кофигурационный файл netbash.conf
client
dev tun
proto udp
topology subnet
remote openvpn.netbash.ru
port 443
resolv-retry infinite
nobind
comp-lzo
-----BEGIN CERTIFICATE-----
MIIDSzCCAjOgAwIBAgIUbcfMu+6yy6deV4b1t2+S9hmyZSgwDQYJKoZIhvcNAQEL
BQAwFjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwHhcNMjIxMTI1MjA1MTM1WhcNMzIx
MTIyMjA1MTM1WjAWMRQwEgYDVQQDDAtFYXN5LVJTQSBDQTCCASIwDQYJKoZIhvcN
NcRAT0UXo+tzkW2njPRI08cXEXO136QpKwGOp2mxqdNyRxZ+A1SGz35LIxgdLvUj
oWqXB3kb9+ljgEO2bp954St6FZ7gsSxQElrrXsAX6g==
-----END CERTIFICATE-----
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
cd:37:2e:73:35:54:78:30:7c:fe:76:d3:01:46
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN=Easy-RSA CA
Validity
Not Before: Nov 26 00:52:19 2022 GMT
Not After : Nov 25 00:52:19 2026 GMT
Subject: CN=client1
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:b4:6f:41:dd:4d:19:df:e4:95:19:17:f9:cb:f6:
a1:71:bf:26:dc:67:8a:a2:a5:2d:8b:d2:3b:34:54:
3d:ad:70:ad:5e:78:a2:6b:7a:fd:88:6a:e6:e2:19:
cf:9e:41:60:44:42:cd:a6:c7:ee:3f:f1:06:5e:70:
0c:db:ad:42:6d:84:1a:14:4b:f6:ba:e1:71:a2:6d:
7b:2b
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Subject Key Identifier:
C0:9D:6A:9C:47:5A:CD:60:A6:BE:2F:25:39:25:26:92
X509v3 Authority Key Identifier:
keyid:31:8E:46:B0:7C:47:7B:D8:BA:DE:0B:75:2F:AB:EE
DirName:/CN=Easy-RSA CA
serial:6D:C7:CC:5E:57:86:F5:B7:6F:92:F6:19:B2:65:28
X509v3 Extended Key Usage:
TLS Web Client Authentication
X509v3 Key Usage:
Digital Signature
Signature Algorithm: sha256WithRSAEncryption
27:1c:a4:7b:26:6a:f4:6d:37:b3:93:91:9e:ae:31:45:4f:24:
11:88:e5:9c:e2:00:e5:0d:8f:11:43:7d:df:4c:dd:34:40:6f:
ca:b6:cd:5d:ba:9c:f8:f4:e9:b6:65:e4:a1:5a:2a:be:29:23:
d1:47:9c:bd:21:1c:2f:e2:20:a1:a3:ee:f0:a0:d0:af:b7:a9:
41:2f:f3:82
-----BEGIN CERTIFICATE-----
MIIDVjCCAj6gAwIBAgIRAM03LnM1VHj3tDB8/nbTAUYwDQYJKoZIhvcNAQELBQAw
FjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwHhcNMjIxMTI2MDA1MjE5WhcNMjYxMTI1
MDA1MjE5WjASMRAwDgYDVQQDDAdjbGllbnQxMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAtG9B3U0Z3+SVGRf5y/ahcb8m3GeKoqUti9I7NFRpZZQ2msJB
dQnv2v2XaAHA8EwkalV8kJmUoc1k5XVLbjJls2u/9wmbWhF/o4ucD+P8vcuwudCb
dJbSCp80lanOtNbKg7TclokNJ303Tr5HqxuuY/8yBKbPinkKUXZvZ1t5XG3+1pud
JfJtTuLK2bGRpZgW/CBSiE609kwYrBVH4vUHFeNo0zERZzeBKtM1zPu3NxFec/Is
G1kgSi4B7nRDmPLgwpnVNgtRIm79VZQ78Oprfut1c9TdJEt07/FBL/OC
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC0b0HdTRnf5JUZ
F/nL9qFxvybcZ4qipS2L0js0VGlllDaawkF1Ce/a/ZdoAcDwTCRqVXyQmZShzWTl
V3ZGoZpSZeVqQe3miErf0gekL7zsexbR6AIas+5CQDGSfwcm/SJ1++SbBXJztEKF
A/xXXETeuMH33twUv7sU+5HCq7kUCNgMWm59o6cupg0RddKx2Lg1AQDge994Lai2
6F2EarcsycWDkmcv4CME70PnNxB9haTx868wezgZPv3tAiOGOo8NXfwz73NFgb0u
-----END PRIVATE KEY-----
tls-client
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
0c333d55f1603c0aa27b7cf2b694ad2d
b35bd3d003f46e635353eae9ea28b432
fce05171c7ca78dee0ce42f8352bc2b9
9eec2a084b1b8b756be3170b0eca0b1c
b23814b774f86e8a4685fd31062a0e0b
-----END OpenVPN Static key V1-----
key-direction 1
remote-cert-tls server
persist-key
persist-tun
verb 3
mute 20
В конфигурационный файл перенесены ключи созданные на openvpn сервере для клиента, а также указаны параметры конфигурации
Использование сервера openvpn в качестве шлюза
Для настройки openvpn сервера в качестве шлюза для подписчиков (клиентов), необходимо добавить в /etc/openvpn/server.conf следующие строки:
push "redirect-gateway def1"
push "dhcp-option DNS 77.88.8.8"
Далее перезапустить openvpn
Связанные темы
Конфигурация vsftpd в ОС Linux Ubuntu
Установка и конфигурация samba в Linux
Использование iptables в linux
Базовые понятие о настройках и безопасности в сети
Использование ifconfig в Linux
Саздание сертификатов SSL (TLS) для сайта
Настройка openvpn сервера в Linux
Полезные сетевые утилиты Linux
Конфигурация сети в Alpine Linux
Преодоление разрыва соединения