Установка и настройка OpenVPN сервера в Porteus

Добро пожаловать!

Moderator: Blaze

Post Reply
User avatar
Blaze
DEV Team
DEV Team
Posts: 2898
Joined: 28 Dec 2010, 11:31
Distribution: ⟰ Porteus current ☯ all DEs ☯
Location: ☭ Russian Federation, Lipetsk region, Dankov
Contact:

Установка и настройка OpenVPN сервера в Porteus

Post#1 by Blaze » 06 Jan 2020, 16:17

Установка и настройка OpenVPN сервера в Porteus

Предположим мы хотим следующую сетевую конфигурацию:
УД-пользователь c установленным OpenVPN клиентом и настроенным конфигом -> внешний статический IP (или домен) -> проброс 1194 порта на локальный IP (IP этой машины входит в локальную сеть предприятия 192.168.0.0/24, например 192.168.0.163 и должен быть зафиксирован в виде статического адреса) OpenVPN сервера на котором поднят интерфейс tun0 с IP 192.168.10.1 -> если все верно, происходит аренда УД-пользователем VPN интерфейса и получение необходимых настроек из подсети 192.168.10.0/24 (настройки выдает VPN сервер) <--> доступ в локальную сеть 192.168.0.0/24 предприятия
Обозначения:

Code: Select all

192.168.10.0/24 - VPN сеть
192.168.0.0/24 - LAN сеть
192.168.10.1 - VPN сервер (интерфейс tun0)
Открываем терминал и выполняем:

Code: Select all

su
toor

# Выставляем Europe/Moscow и производим синхронизации времени на сервере
cp /etc/localtime{,.bak} && rm /etc/localtime && ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime && ntpdate pool.ntp.org && hwclock -lw

# Скачиваем openvpn пакет и активируем xzm модуль:
getpkg openvpn
1. Настраиваем OpenVPN сервер (в целях безопасности, вместо 1194 можно использовать 443 порт - указываем его в конфигурации сервера и в конфигурационном файле клиента):

Code: Select all

echo '# Указываем какой порт будет слушать наш сервер, по умолчанию 1194
port 1194

# Указываем протокол tcp или udp - у меня используется протокол udp
#proto tcp
proto udp

# На какой устройстве будет работать OpenVPN сервер, tun0 - это устройство создается автоматически
dev tun

# Сертификат удостоверяющего центра
ca /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt

# Сертификат и ключ нашего сервера, а также пути к ним
cert /etc/openvpn/easy-rsa/easyrsa3/pki/issued/vpnserver.crt
key /etc/openvpn/easy-rsa/easyrsa3/pki/private/vpnserver.key

# Ключ Диффи-Хельмана используется для защиты передаваемых ключей по открытому каналу
dh /etc/openvpn/easy-rsa/easyrsa3/pki/dh.pem

# Список отозванных сертификатов:
crl-verify /etc/openvpn/easy-rsa/easyrsa3/pki/crl.pem

# Указываем секретный TLS ключ
tls-auth /etc/openvpn/ta.key 0

# Указыаем тип шифрования AES 256 bit
cipher AES-256-CBC

# Указываем подсеть в которой будут работать клиенты VPN сервера
server 192.168.10.0 255.255.255.0

# Указываем файл куда будут записываться IP адреса выданные клиентам
ifconfig-pool-persist ipp.txt

# Выдаем пользователям необходимые маршруты
push "route 192.168.0.0 255.255.255.0"

# Выдаем клиентам IP адрес DNS сервера у меня это VPN сервер
push "dhcp-option DNS 192.168.10.1"

# Выдаем клиентам DNS суффикс нашей локальной сети
push "dhcp-option DOMAIN example.org"

# Разрешаем подключенным клиентам OpenVPN сервера соединяться друг с другом
client-to-client

# Включаем возможность указания индивидуальных настроек для клиентов OpenVPN сервера
client-config-dir /etc/openvpn/ccd

# Если необходимо разрешить нескольким пользователям подключаться по одному ключу ( необходимо снять комментарий )
#duplicate-cn

# Проверяем состояние клиента, отправляем пакеты каждые 10 сек. если в течении 120 сек. клиент не ответил, то он считаться отключенным
keepalive 10 120

# Используем сжатие трафика (если не нужно то можно закомментировать!)
comp-lzo

# Максимальное количество подключенных клиентов, мне достаточно 10
max-clients 10
persist-key
persist-tun

# Записи о состоянии подключенных клиентов и т.п.
status /var/log/openvpn-status.log

# Уровень логирования 0 в лог попадают только записи о критических ошибках сервера, если нужно подробнее, то выставляем 9 для дебагинга
verb 0

# Количество записей после которых будет производиться запись в лог
mute 20' > /etc/openvpn/server.conf
Конфигурационный файл нашего сервера готов, но если мы попытаемся его перезагрузить, то он у нас не запустится, а отвалится с ошибкой, потому что нет ключей, сервера, и необходимых сертификатов, чтобы их создать нам необходимо настроить удостоверяющий центр.
Но для начала, генерируем секретный ключ TLS, он нужен для того чтобы еще больше повысить уровень безопасности передаваемых данных, этот ключ должен быть на сервере и у каждого подключенного клиента!

Code: Select all

openvpn --genkey --secret /etc/openvpn/ta.key
chmod 600 /etc/openvpn/ta.key
Нам также необходимо создать директорию, в дальнейшем она нам понадобится:

Code: Select all

mkdir -p /etc/openvpn/ccd
Также нам понадобится перенастроить DNSMASQ, чтобы он обслуживал только клиентов VPN сервера

Code: Select all

vi /etc/dnsmasq.conf
Нас интересует строка:

Code: Select all

interface=
Меняем на:

Code: Select all

interface=tun0
Таким образом, мы получаем DNS сервер, который будет доступен только для клиентов подключенных к VPN серверу, а запросы извне обслуживаться не будут.
Если нужны какие-то дополнительные параметры обслуживания DNS запросов, то это вам в конфиг DNSMASQ, там все снабжено подробными комментариями.
Заметка. Не проверял, но в теории конфиг DNSMASQ можно настроить так:

Находим:

Code: Select all

dhcp-range=
Меняем на:

Code: Select all

dhcp-range=192.168.10.50,192.168.10.254,3h
dhcp-option=2,255.255.255.0
dhcp-option=3,192.168.10.1
dhcp-option=6,192.168.10.1,192.168.0.1
Запускаем службу DNSMASQ:

Code: Select all

chmod +x /etc/rc.d/rc.dnsmasq
/etc/rc.d/rc.dnsmasq start
2. Подниманием удостоверяющий центр

Code: Select all

git clone https://github.com/OpenVPN/easy-rsa.git /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa/easyrsa3
Нам необходимо создать файл с настройками, чтобы не отвечать на лишние вопросы, при генерации ключей.
Пример этого файла можно посмотреть в vars.example

Создаем наш готовый vars файл (введите свои данные):

Code: Select all

echo 'set_var EASYRSA_REQ_COUNTRY    "RU"
set_var EASYRSA_REQ_PROVINCE   "Lipetsk"
set_var EASYRSA_REQ_CITY       "Dankov"
set_var EASYRSA_REQ_ORG        "Your-Company"
set_var EASYRSA_REQ_EMAIL      "my-email@mail.ru"
set_var EASYRSA_REQ_OU         "IT department"
set_var EASYRSA_KEY_SIZE       2048
set_var EASYRSA_ALGO           rsa
set_var EASYRSA_CA_EXPIRE      3650
set_var EASYRSA_CERT_EXPIRE    3650' > /etc/openvpn/easy-rsa/easyrsa3/vars
Активируем удостоверяющий центр:

Code: Select all

./easyrsa init-pki
Генерируем корневой сертификат этого центра:

Code: Select all

./easyrsa build-ca
Указываем пароль для работы с ключом, идея в том что если ваш сервер будет взломан, то без пароля, новые ключи будет нельзя выпустить - дополнительный рубеж безопасности.

Получим:

Code: Select all

./pki/ca.crt
./pki/private/ca.key
Генерируем ключ Диффи-Хельмана

Code: Select all

./easyrsa gen-dh
Вылезет сообщение вида:

Code: Select all

DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
Генерация занимает примерно 2 мин.

Получим:

Code: Select all

./pki/dh.pem
Наш сервер будет называться vpnserver (название по вашему усмотрению)
Генерируем для него ключ и сертификат:

Code: Select all

./easyrsa build-server-full vpnserver nopass
Где nopass - отвечает за то чтобы не запрашивать пароль, по умолчанию он запрашивается, если пароль указать то при перезапуске OpenVPN сервера система будет требовать его ввода, иначе служба не запустится.

Вводим пароль от корневой сертификата CA, который создали на начальном этапе.

Получим:

Code: Select all

./pki/issued/vpnserver.crt
./pki/private/vpnserver.key
Сразу сгенериурем ключи для 2х наших клиентов, назовем их user и superuser

Code: Select all

./easyrsa build-client-full user1 nopass
./easyrsa build-client-full user2 nopass
ПОМНИТЕ ОБ ЭТОМ: По хорошему, клиенты должны указать пароль для своих ключей, даже если ключи будут украдены, воспользоваться ими будет проблематично, но для тестов можно и не указать. Можно генерить ключи без пароля в тех случаях если планируется ставить OpenVPN клиента на маршрутизатор и чтобы каждый раз на него не лазить, то пароль не указываем.
Решать, как всегда, вам!

Получим:

Code: Select all

./pki/private/user1.key
./pki/private/user2.key
./pki/issued/user1.crt
./pki/issued/user2.crt
Генерируем список отозванных сертификатов, нужен он для того чтобы отключать пользователей, например пользователь уволился, мы ведь не побежим к нему домой удалять ключи из компа, мы можем сделать проще, просто отзываем ключ, запись появляется в файле, пользователь после этого не может подключиться к серверу, все довольны.

Code: Select all

./easyrsa gen-crl
Получим:

Code: Select all

./pki/crl.pem
За дополнительными параметрами обращаемся к помощи:

Code: Select all

./easyrsa help
OpenVPN настроен, теперь осталось его запустить

Code: Select all

chmod +x /etc/rc.d/rc.openvpn
/etc/rc.d/rc.openvpn start
3. Настраиваем маршрутизацию в интернет и локальную сеть пользователей подключенных к VPN серверу

Тут тоже все просто, для начала нам необходимо разрешить форвардинг пакетов:

Code: Select all

chmod +x /etc/rc.d/rc.ip_forward
/etc/rc.d/rc.ip_forward start
Далее нам необходимо настроить правила фаерволла iptables, добавляем правила:

Code: Select all

echo 'iptables -A FORWARD -o tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE' >> /etc/rc.d/rc.local
4. Обеспечиваем возможность предоставления различных настроек разным клиентам OpenVPN сервера

Представим ситуацию, пользователь должен ходить в локальную сеть в через наш OpenVPN сервер, а в интернет через свое основное подключение, а другой пользователь должен ходить и в локлаьную сеть и в интрнет через наш VPN сервер, вот для этих целей нам понадобится директория ccd, которую мы создали в первом пункте.

Например:
У нас есть пользователь superuser тогда его запись будет иметь вид:

Code: Select all

ifconfig-push 192.168.10.10 192.168.10.1
push "redirect-gateway"
Содержимое добавьте с помощью:

Code: Select all

vi /etc/openvpn/ccd/superuser
Таким образом мы можем предоставить пользователю определенный IP адрес 192.168.10.10 и адрес соединения на нашем сервере, если этого не сделать то адреса будут выдаваться случайным образом, также мы указываем директиву что наш VPN сервер является шлюзом по умолчанию, тогда все пакеты будут идти через него, сюда можно добавлять специфические маршруты, если мы хотим предоставить доступ этому определенному пользователю в какие-то специфические подсети.
Для пользователя user мы не создаем такой файл, в результате, к нему прилетят только те настройки которые указаны в server.conf, для него наш OpenVPN НЕ будет шлюзом по умолчанию и к нашему серверу будут прилетать только пакеты адресованные нашей локальной сети, ведь мы подсунули ему маршруты в файле server.conf, но не переназначили шлюз, также IP адрес ему будет предоставляться случайным образом.
Думаю суть ясна, в общем создаете файл, с именем ключа который вы сгенерировали, в директории ccd и после подключения к OpenVPN пользователь получит эти настройки, сам сервер OpenVPN перезагружать при этом не нужно!
Его необходимо перезагружать только случае внесения изменений в server.conf
Ну и нам осталось настроить клиентов и протестировать работу OpenVPN сервера и корректность маршрутизации пакетов между сетями.

5. Управление пользователями и удостоверяющим центром

Удаление удостоверяющего центра
Если так получилось что вам необходимо полностью переделать удостоверяющий центр, то можно удалить директорию PKI в /etc/openvpn/easy-rsa/easyrsa3/pki и далее, повторить шаги из пункта 2, все ключи будут перевыпущены, все старые ключи работать перестанут, от слова, совсем!

Управление пользователями
Как отключать пользователей от сервера, для этого нужно отозвать сертификат, делается это так:

Отзыв сертификатов:

Code: Select all

./easyrsa revoke user
Обновление базы отозванных сертификатов:

Code: Select all

./easyrsa gen-crl
После этого пользователь не сможет подключиться к нашему серверу.

Краткая рекомендация. Если в логах у вас появляется ошибка вида:

Code: Select all

ERROR: Linux route add command failed: external program exited with error status: 2
Обычно это связано с неправильно добавленными маршрутами т.е. когда вы добавляете маршрут должен быть доступен линк в эту подсеть иначе маршрут не добавится, а система выдаст ошибку в syslog
На этом я закончу эту статью, надеюсь что она была вам полезной за более подробной информацией вы всегда можете обратиться к документации:

Code: Select all

https://openvpn.net/community-resources/
6. Проброс 1194 порта на примере маршрутизатора MikroTik
Image
Image
Более детально см. инструкцию

Code: Select all

https://mdex-nn.ru/page/probros-portov-v-mikrotik.html
7. Настраиваем клинет OpenVPN на Windows.

Для подключения к нашему OpenVPN серверу из вне, под управлением ОС семейства Windows необходимо:
  • Скачать OpenVPN
  • Установить OpenVPN
  • Создать файл client.ovpn конфигурации OpenVPN клиента с содержимым (Обязательно укажите ВНЕШНИЙ-IP и ПОРТ):

    Code: Select all

    ##############################################
    # Sample client-side OpenVPN 2.0 config file #
    # for connecting to multi-client server.     #
    #                                            #
    # This configuration can be used by multiple #
    # clients, however each client should have   #
    # its own cert and key files.                #
    #                                            #
    # On Windows, you might want to rename this  #
    # file so it has a .ovpn extension           #
    ##############################################
    
    # Specify that we are a client and that we
    # will be pulling certain config file directives
    # from the server.
    client
    
    # Use the same setting as you are using on
    # the server.
    # On most systems, the VPN will not function
    # unless you partially or fully disable
    # the firewall for the TUN/TAP interface.
    ;dev tap
    dev tun
    
    # Windows needs the TAP-Win32 adapter name
    # from the Network Connections panel
    # if you have more than one.  On XP SP2,
    # you may need to disable the firewall
    # for the TAP adapter.
    ;dev-node MyTap
    
    # Are we connecting to a TCP or
    # UDP server?  Use the same setting as
    # on the server.
    ;proto tcp
    proto udp
    
    # The hostname/IP and port of the server.
    # You can have multiple remote entries
    # to load balance between the servers.
    remote ВНЕШНИЙ-IP ПОРТ
    ;remote my-server-2 1194
    
    # Choose a random host from the remote
    # list for load-balancing.  Otherwise
    # try hosts in the order specified.
    ;remote-random
    
    # Keep trying indefinitely to resolve the
    # host name of the OpenVPN server.  Very useful
    # on machines which are not permanently connected
    # to the internet such as laptops.
    resolv-retry infinite
    
    # Most clients don't need to bind to
    # a specific local port number.
    nobind
    
    # Downgrade privileges after initialization (non-Windows only)
    ;user nobody
    ;group nobody
    
    # Try to preserve some state across restarts.
    persist-key
    persist-tun
    
    # If you are connecting through an
    # HTTP proxy to reach the actual OpenVPN
    # server, put the proxy server/IP and
    # port number here.  See the man page
    # if your proxy server requires
    # authentication.
    ;http-proxy-retry # retry on connection failures
    ;http-proxy [proxy server] [proxy port #]
    
    # Wireless networks often produce a lot
    # of duplicate packets.  Set this flag
    # to silence duplicate packet warnings.
    ;mute-replay-warnings
    
    # SSL/TLS parms.
    # See the server config file for more
    # description.  It's best to use
    # a separate .crt/.key file pair
    # for each client.  A single ca
    # file can be used for all clients.
    ca "C:\\Program Files\\OpenVPN\\config\\ca.crt"
    cert "C:\\Program Files\\OpenVPN\\config\\user1.crt"
    key "C:\\Program Files\\OpenVPN\\config\\user1.key"
    
    # Verify server certificate by checking that the
    # certicate has the correct key usage set.
    # This is an important precaution to protect against
    # a potential attack discussed here:
    #  http://openvpn.net/howto.html#mitm
    #
    # To use this feature, you will need to generate
    # your server certificates with the keyUsage set to
    #   digitalSignature, keyEncipherment
    # and the extendedKeyUsage to
    #   serverAuth
    # EasyRSA can do this for you.
    remote-cert-tls server
    
    # If a tls-auth key is used on the server
    # then every client must also have the key.
    tls-auth "C:\\Program Files\\OpenVPN\\config\\ta.key" 1
    
    # Select a cryptographic cipher.
    # If the cipher option is used on the server
    # then you must also specify it here.
    # Note that v2.4 client/server will automatically
    # negotiate AES-256-GCM in TLS mode.
    # See also the ncp-cipher option in the manpage
    cipher AES-256-CBC
    
    # Enable compression on the VPN link.
    # Don't enable this unless it is also
    # enabled in the server config file.
    comp-lzo
    
    # Set log file verbosity.
    verb 3
    
    # Silence repeating messages
    ;mute 20
    
    Заметка. Для каждого пользоватя, в приведенной выше конфигурации, указывается индивидуальный (в наше случае номерной) сертификат user.crt и ключ user.key
  • Скопируйте в /Program Files/OpenVPN/config следующие файлы:
    • ca.crt
    • dh.pem
    • ta.key
    • user1.crt
    • user1.key
    • client.ovpn
  • Пробуйте подключиться.
    После подключения проверьте в командной строке cmd клиента Windows

    Code: Select all

    ipconfig /all
    правильные-ли настройки получил Ваш клиент от сервера OpenVPN.
Linux 5.4.8-porteus #1 SMP Sun Jan 5 09:14:47 UTC 2020 x86_64 Intel(R) Core(TM) i5-6600K CPU @ 3.50GHz GenuineIntel GNU/Linux
MS-7A12 » [AMD/ATI] Tobago PRO [Radeon R7 360 / R9 360 OEM] (rev 81) » Vengeance LPX 16GB DDR4 K2 3200MHz C16

AcnapyxoB
Black ninja
Black ninja
Posts: 35
Joined: 24 Dec 2014, 10:15
Distribution: 4.0 XFCE x64
Location: Bulgaria

Установка и настройка OpenVPN сервера в Porteus

Post#2 by AcnapyxoB » 06 Jan 2020, 17:36

Очень подробная информация. Спасибо Blaze! :worship:

Post Reply