Предположим мы хотим следующую сетевую конфигурацию:
Обозначения:УД-пользователь 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
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
Code: Select all
vi /etc/dnsmasq.conf
Code: Select all
interface=
Code: Select all
interface=tun0
Если нужны какие-то дополнительные параметры обслуживания DNS запросов, то это вам в конфиг DNSMASQ, там все снабжено подробными комментариями.
Запускаем службу 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
Code: Select all
chmod +x /etc/rc.d/rc.dnsmasq
/etc/rc.d/rc.dnsmasq start
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 "[email protected]"
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
Получим:
Code: Select all
./pki/dh.pem
Генерируем для него ключ и сертификат:
Code: Select all
./easyrsa build-server-full vpnserver nopass
Вводим пароль от корневой сертификата CA, который создали на начальном этапе.
Получим:
Code: Select all
./pki/issued/vpnserver.crt
./pki/private/vpnserver.key
Code: Select all
./easyrsa build-client-full user1 nopass
./easyrsa build-client-full user2 nopass
Решать, как всегда, вам!
Получим:
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
Code: Select all
chmod +x /etc/rc.d/rc.openvpn
/etc/rc.d/rc.openvpn start
Тут тоже все просто, для начала нам необходимо разрешить форвардинг пакетов:
Code: Select all
chmod +x /etc/rc.d/rc.ip_forward
/etc/rc.d/rc.ip_forward start
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
Представим ситуацию, пользователь должен ходить в локальную сеть в через наш 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
Для пользователя 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
На этом я закончу эту статью, надеюсь что она была вам полезной за более подробной информацией вы всегда можете обратиться к документации:
Code: Select all
https://openvpn.net/community-resources/


Более детально см. инструкцию
Code: Select all
https://mdex-nn.ru/page/probros-portov-v-mikrotik.html
Для подключения к нашему 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правильные-ли настройки получил Ваш клиент от сервера OpenVPN.Code: Select all
ipconfig /all