Openvpn передать dns клиенту

Обновлено: 07.07.2024

Команды OpenVPN

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

Приведенные в статье команды без "--" (двумя знаками дефиса) перед командой должны быть использованы в конфигурационном файле, команды с "--" в начале используются только из командной строки. Подробности использования команд и их параметры - man openvpn.

remote < host > - определяет удаленный конец туннеля. Могут использоваться записи IP и DNS.

local < host > - определяет локальный ip или имя хоста, на котором будет работать OpenVPN. Актуально, если на локальной машине несколько адресов.

dev < device > - определяет какой использовать тип устройства tun или tap. Например:
dev tun
или
dev tap
При одном из таких указаний будет использован свободный интерфейс tun или tap. Так же можно явно указывать номер виртуального интрефейса, например tun0.

port < port number > - указывает на каком порту будет работать OpenVPN (локально и удаленно).

proto < proto > - какой протокол будет использоваться. Возможные значения: udp, tcp, tcp-client, tcp-server. С первыми двумя все ясно, а на последних двух остановимся чуть подробнее:
tcp-client - сам пытается установить соединение
tcp-server - только ждет подключений
Примечательно, что с использованием протокола udp VPN будет работать чуть быстрее, чем tcp. Но в плане стабильности работы лучше выбирать tcp (как показывает практика, VPN-соединение более устойчиво)

remote-random - если указана данная опция и в random перечисленно несколько удаленных хостов, то OpenVPN в случайном порядке будет к ним подключаться. Применяется для балансировки нагрузки.

float - позволяет удаленному хосту изменять IP во время работы туннеля. Соединение при этом не разрывается.

ipchange < cmd > - выполняет скрипт или команду указанную в < cmd >, если IP сменился. Пример:
ipchange script-ip.sh

connect-retry < seconds > - пробует переподключиться через указанное время в секундах, если соединение было разорвано.

connect-retry-max < n > - максимальное количество повторов если соединение было разорвано

resolv-retry < seconds > - если OpenVPN не удалось узнать имя удаленного хоста по DNS, то через указанное количество секунд попытаться переподключиться.

lport < port > - указывает на локальный порт для использования OpenVPN

rport < port > - аналогично для удаленного порта. Пример:
rport 8000 - OpenVPN будет пытаться подключится к удаленному порту 8000

nobind - использовать динамический порт для подключения (только для клиента)

shaper < bytes > - указывает скорость передачи данных в байтах для исходящего трафика (только для клиента)

tun-mtu < mtu size > - устанавливает максимальный размер MTU. По умолчанию tun-mtu равен 1500. Использование:
tun-mtu 1200

dev-node < interface name > - устанавливает имя виртуального интерфейса. Например:
dev-node openvpn1

ifconfig - устанавливает локальный IP и маску подсети для туннельного интерфейса. Например:
ifconfig 10.3.0.1 255.255.255.0

server < network > < mask > - автоматически присваивает адреса всем клиентам (DHCP) в указанном диапазоне с маской сети. Данная опция заменяет ifconfig и может работаеть только с TLS-клиентами в режиме TUN, соответственно использование сертификатов обязательно. Например:
server 10.3.0.0 255.255.255.0
Подключившиеся клиенты получат адреса в диапазоне между 10.3.0.1 и 10.3.0.254.

server-bridge < gateway > < mask > < pool > - сервер в режиме моста для TAP устройств. Пример:
server bridge 10.3.0.1 255.255.255.0 10.3.0.128 10.3.0.254
Клиентам будут выданы адреса в диапазоне 10.3.0.128 - 10.3.0.254, в качестве шлюза будет указан 10.3.0.1.

mode server - переключает OpenVPN в режим сервера (начиная с 2-й версии)

mode p2p - данная опция идет по умолчанию.

Опции в режиме сервера

push < options > - передача клиенту конфигурационных параметров. Пример:
push "route 192.168.0.0 255.255.255.0"

Аналогично с помощью push клиенту могут передаваться следующие параметры:

route
route-gateway
route-delay
redirect-gateway
inactive
ping, ping-exit, ping-restart
persist-key, persist-tun
comp-lzo
dhcp-option
ip-win32

Последние две опции применимы только для Window-клиентов. Например передадим Windows-клиенту адрес DNS-сервера 11.11.11.11:
push "dhcp-option DNS 11.11.11.11"

comp-lzo - параметр сжатия трафика, идущего через виртуальный туннель. Может принимать значения yes, no, adaptive. Последнее используется по умолчанию.
Например:
comp-lzo yes - принудительно включить сжатие
comp-lzo no - принудительно отключить сжатие
comp-lzo adaptive - адаптивный режим.

Команды и параметры при работе с сертификатами x509 и параметрами шифрования

cipher < alg > - указываем алгоритм шифрования. Например:
cipher AES-256-CBC
Рекомендуется использование шифров в режиме CBC (Cipher Block Chaining).

keysize < n > - размер ключа в битах. Например:
keysize 128

auth < alg > - алгоритм хэширования. Пример:
auth SHA1

df < file > - файл с ключем Диффи-Хелмана

ca < file > - файл сертификата для CA

cert < file > - сертификат локальной машины

key < file > - локальный ключ машины

tls-server - явно указывает, что данный хост является tls-server

tls-client - соответственно tls-client

pkcs12 < file > - указываем файл (PKCS12), который содержит в себе сертификат, ключ и CA в одном файле. Пример:
pkcs12 /file

crl-verify < file > - список отозванных сертификатов, т.е. blacklist.

no-replay - отключает защиту OpenVPN от атаки повторного воспроизведения (replay attack). Крайне не рекомендуется отключать!

no-iv - отключает использование вектора инициализации шифра (IV). Крайне не рекомендуется отключать!

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

secret < file > - включает режим шифрования и аутентификации на статических ключах. В качестве параметра использует заранее сгенерированный, командой --genkey, файл. Например:
secret key.txt

Все доступные алгоритмы шифрования можно просмотреть выполнив из командной строки:
openvpn --show-ciphers

Алгоритмы хэширования:
openvpn --show-digests

Показать все доступные TLS-шифры (TLS используется только для шифрования канала управления)
openvpn --show-tls

Показать все доступные крипто-устройства в системе (если такие имеются):
openvpn --show-engines

Для улучшения безопасности рекомендовано запускать все сервисы с минимальными правами. Следующими двумя командами мы укажем с правами какого пользователя и группы будет работать openvpn:

user nobody
group nogroup

Где, соответственно, nobody и nogroup имена пользователя и группы.

Команды для управления маршрутизацией

Обозначение: VPN-хост - удаленная сторона (удаленный хост)

route < network > - устанавливает указанную маршрутизацию на VPN-хосте, после успешного запуска туннеля. Пример:
route 10.0.10.0 255.255.255.252

route-gateway < IP > - устанавливает шлюз на VPN-хосте. Пример:
route-gateway 192.168.0.22
После успешного запуска виртуального туннеля клиенту будет задан шлюз 192.168.0.22

route-delay < seconds > - указывает подождать n-секунд перед установкой маршрутов. Пример:
route-delay 5
Т.е. через 5 секунд после установки туннеля будут заданы маршруты.

route-up < cmd > - выполнить скрипт или программу < cmd > после установки маршрутов. Пример:
route-up /script.sh

redirect-gateway - установить шлюзом по умолчанию удаленный сервер. Т.е. когда удаленный пользователь подключается к нашему серверу, то ему будет задан шлюз по умолчанию на наш сервер.

Команды для управления туннелем

ping < seconds > - указывает отсылать ping на удаленный конец тунеля после указанных n-секунд, если по туннелю не передавался никакой трафик. Пример:
ping 10

ping-restart < seconds > - если за указанное время не было получено ни одного пакета с удаленной стороны, то перезапускать туннель. Пример:
ping-restart 60 - если в течении 60 секунд не было получено ни одного пакета, то туннель будет перезапущен.

ping-timer-rem - позволяет перезапускать туннель, только когда указан удаленный адрес.

persist-tun - данная опция оставляет без изменения устройства tun/tap при перезапуске OpenVPN.

persist-key - указывает не перечитавать файлы ключей при перезапуске туннеля.

resolv-retry < seconds > - устанавливает время в секундах для запроса об удаленном имени хоста. Актуально только если используется DNS-имя удаленного хоста. Пример:
resolv-retry 86400
inactive < seconds > - после n-секунд неактивности устройство TUN/TAP автоматически отключется. Пример:
inactive 120

ping-exit < seconds > - если за указанные n-секунд не было получено ни одного пакета, то отключать OpenVPN. Пример:
ping-exit 120

keepalive < seconds > < seconds > - является совмещением сразу двух команд - ping и ping-restart. Использует сразу два параметра в секундах, перечисленных через пробел. Пример:
keepalive 10 180
Означает следующее: каждые 10 секунд посылать ping на удаленный хост, и, если за 180 секунд не было получено ни одного пакета - то перезапускать туннель.

persist-local-ip < IP > - оставлять неизменными локальный IP адрес и номер порт, если туннель был перезапущен.

persist-remote-ip < IP > - оставлять неизменными удаленный IP адрес и номер порт, если туннель был перезапущен.
persist-remote-ip 192.168.50.1

Методы аутентификации

auth-user-pass-verify < script > < method > - указывается только на серверной стороне.
< script > - путь к скрипту, который будет производить авторизацию. Скрипт должен возвращать 0 если авторизация успешна, и соответственно, 1 если авторизация не успешна.
< method > - метод авторизации, может быть двух типов: via-env и via-file

auth-user-pass < file >- указывается на клиентской стороне. Параметр не обязателен, если он отсутствует то будет предложено ввести пару логин/пароль.
должен содержать имя пользователя и пароль в двух строчках:
username
password

client-cert-not-required - отключает авторизацию по сертификатам.

Работа с прокси

Если требуется авторизация на прокси-сервере:

Так же после authfile требуется указать метод авторизации. Можно оставить auto для автоматического выбора метода авторизации или указать явно через auth-method.
auth-method может быть трех видов "none", "basic" или "ntlm".
Используется в OpenVPN начиная с версии 2.1.

socks-proxy < server port > - указываем сокс-прокси сервер. Пример:
socks-proxy 192.168.0.12 8080

socks-proxy-retry - переподключаться, если соединение было разорвано.

auto-proxy - автоматически определять прокси-сервер. Требуется версия OpenVPN 2.1 и выше.

Скриптинг

up < command >- выполнить команду после запуска устройства TUN/TAP. Пример:
up script-up.sh

up-delay < seconds > - подождать n-секунд перед запуском команды указанной в up. Пример:
up-delay 5

down < command > - выполнить команду когда интерфейс TUN/TAP выключится. Пример:
down script-down.sh

down-pre - выполнить команду, указанную в down перед выключением интерфейса TUN/TAP

up-restart < command > - выполнить команду после каждого реконнекта

route-up < command > - выполнить команду после установки сетевых маршрутов. Пример:
route-up script.sh

learn-address < command > - выполнить указанную команду, если ip удаленной стороны изменился.

ipchange < command > - выполнить команду, если ip сервера изменился.

client-connect < command > - выполнить команду, когда клиент подключился.

client-disconnect < command > - выполнить команду, когда клиент отключился.

Команды отладки и поиска неисправностей

Логирование

log < file > - указываем лог-файл. Если данный параметр не указан, то весь вывод openvpn будет производиться в stdout.

status < file > - указывает путь к статус-файлу, в котором содержится информация о текущих соединениях и информация о интерфейсах TUN/TAP.

Разные вопросы

В. Чем отличаются виртуальные устройства tun и tap?
О. TUN - туннель, соединение по которому указывается по типу: локальный IP < --- > удаленный IP. Например, при явном указании ifconfig:
--ifconfig 10.3.0.2 10.3.0.1
в этом примере 10.3.0.2 - локальный IP, 10.3.0.1 - удаленный IP
TAP - эмулирует виртуальную ethernet карточку, для которой требуется указывать локальный IP и маску подсети. Например:
--ifconfig 10.3.0.2 255.255.255.0

В. Для чего нужны файлы serial и index.txt при генерации ключей с easy-rsa?
О. Эти два файла используются в качестве временной базы данных, используемой при генерации ключей. Должны находиться в том каталоге, где и ключи.

Если клиент получил ошибку AUTH_FAILED
то он перестает переподключение и тупо гасит демона/сервис, помогает только перезапуск ОС или ручной запуск клиента

Опция "connect-retry" в данном случае поможет заставить клиента переподключаться принудительно даже при ошибке AUTH_FAILED ?

Захотелось немного побаловаться с одним бесплатным VPN-ом.
Вооружился дистрибутивом OpenVPN. Установился без накладок. Появился TAP-интерфейс.

В route -print появились соответствующие пути с приоритетами на VPN-интерфейс.

192.168.1.1 - роутер с dhcp (раздает ip и гугло-dns.
192.168.1.33 - клиент
10.15.0.81 - dhcp в vpn-сети
10.15.0.82 - vpn-интерфейс


Подключается успешно.
Wireshark показывает что весь обмен протекает через VPN-сервер.
А вот что не отправляется на VPN-сервер, так это DNS-запросы. Они почему-то шлются через роутер (единственный трафик во внешний мир который бежит в обход VPN).

Пробовал в настройках VPN-задать в ручную DNS-сервер. Все одно и то же.
Шерстил гугло-запросами официальную документацию, но так ничего внятного и не нашел.

Может ли быть причина в том что это VPN-сервис блокирует трафик по 53 порту и потому не получив доступа, система обращается к следующему доступному пути - тоесть на прямую через роутер и провайдера? Можно ли это как-то проверить?

Удалось самостоятельно устранить дыру с DNS-запросами при помощи костыля из DNSCrypt.

В настройках TAP-интерфейса прописываю статический DNS-шлюз 127.0.0.1;
Подключаюсь через OpenVPN без предварительной правки route-ов (в них все по дефолту);
В след за чем запускаю exe-шник DNSCrypt;

В итоге все пингуется и открывается. В логах wireshark'a тишина. Один лишь шифрованный трафик бегает.

Проверить блокируется ли порт можно телнетом на 53 порт.
Собственно удали из DHCP-роутера настройки DNS и посмотри что будет. В принципе можно вообще route-ом зарулить весь трафик в VPN.

> Собственно удали из DHCP-роутера настройки DNS и посмотри что будет.
Пробовал. В таком случае dns-имена не преобразовываются.

> В принципе можно вообще route-ом зарулить весь трафик в VPN.
Попробовал сделать так.
Подключился к впн, и из маршрутов удалил 0.0.0.0 что идет на шлюз.


Коннект сохранился но dns-запросы все равно текли через роутер.
Методом тыка выяснил, что если удалить маршрут для 5.254.100.70 то сразу отваливается разрешение имен.

Попробовал принудительно этот 5.254.100.70 зарулить на VPN:

Но ничего не работает. Ни пинги ни разрешение имен (превышен интервал ожидания запроса).

Может и правда через данный конкретный VPN нельзя пустить DNS-траффик? Либо я все же что-то упустил.

OpenVPN это еще одна из реализаций VPN туннелей. У нее есть некоторые преимущества. Например возможность работы по произвольному порту и использование TCP или UDP на выбор, а так же возможность использования Proxy. Но и есть относительные минусы, например требуется установка своего клиента.

Программный маршрутизатор VyOS помимо L2TP, DMVPN, IPsec так же поддерживает OpenVPN.

Создание сертификатов

В начале нужно скопировать скрипты для генерации ключей, чтобы их не потерять при обновлении версии.

cp -rv /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /config/rsa2

После копирования, изменим параметры создаваемых сертификатов, для этого отредактируем файл /config/rsa2/vars:

Полезные параметры в vars:

export KEY_SIZE=1024
export CA_EXPIRE=3650
export KEY_EXPIRE=3650
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Moscow"
export KEY_CITY="Moscow"
export KEY_ORG="BlackDiver.Net"
export KEY_EMAIL="admin@blackdiver.net"

Теперь нужно загрузить переменные (это нужно делать перед каждым началом создания сертификатов):

После загрузки переменных, перейдем к созданию сертификатов.

Перейдем в скопированную папку:

Очистим все текущие сертификаты:

Создадим корневой сертификат:

Создадим Diffie-Hellman key exchange:

Создадим сертификат сервера (в примере сертификат будет иметь имя blackdiver-server):

Создадим пользовательские сертификаты ( в примере создаваемый пользовательский сертификат будет иметь имя user1):

./build-key user1

Для всех сертификатов не должен быть установлен пароль, а так же все сертификаты, кроме корневого, должны быть подписаны корневым сертификатом.

При запросе пароля просто нажимаем Enter:

A challenge password []:

При запросе подписи сертификата вводим y и нажимаем Enter:

Sign the certificate? [y/n]:
1 out of 1 certificate requests certified, commit?

Настройка OpenVPN

Нужные сертификаты созданы. Теперь перейдем к настройке OpenVPN сервера на VyOS.

Описание команд:
Создаем OpenVPN сервер и назначаем ему виртуальный интерфейс vtun0:

set interfaces openvpn vtun0 mode server

Создаем виртуальную сеть 172.16.0.0/24 для OpenVPN клиентов:

set interfaces openvpn vtun0 server subnet 172.16.0.0/24

Передаем OpenVPN клиентам адрес DNS сервера:

set interfaces openvpn vtun0 server name-server 192.168.123.1

Указываем локальный домен для OpenVPN клиентов:

set interfaces openvpn vtun0 server domain-name blackdiver.ovpn

Настройка сертификатов для сервера:

set interfaces openvpn vtun0 tls cert-file /config/rsa2/keys/blackdiver-server.crt
set interfaces openvpn vtun0 tls key-file /config/rsa2/keys/blackdiver-server.key
set interfaces openvpn vtun0 tls ca-cert-file /config/rsa2/keys/ca.crt
set interfaces openvpn vtun0 tls dh-file /config/rsa2/keys/dh1024.pem

Настройка маршрутизации

Если требуется, чтобы клиенты выходили в интернет через VPN канал:

set interfaces openvpn vtun0 replace-default-route

и разрешаем трансляцию адресов для подсети 172.16.0.0/24:

set nat source rule 110 outbound-interface eth0
set nat source rule 110 source address 172.16.0.0/24
set nat source rule 110 translation address masquerade

Если только требуется доступ к локальной сети за маршрутизатором:

set interfaces openvpn vtun0 server push-route 192.168.123.0/24

Дополнительные настройки

Если используется DNS-forwarder на маршрутизаторе VyOS, то нужно его включить на интерфейсе vtun0:

set service dns forwarding listen-on vtun0

Если у маршрутизаторе несколько IP адресов и требуется разрешить подключение к VPN только на один из адресов:

set interfaces openvpn vtun0 local-host 1.1.1.2

Изменить порт OpenVPN на 80-й (по умолчанию используется 1194 порт):

set interfaces openvpn vtun0 local-port 80

Использовать TCP протокол (по умолчанию используется UDP):

set interfaces openvpn vtun0 protocol tcp-passive

Настройка VyOS закончена.
Сохраняем конфигурацию:

Настройка OpenVPN клиентов

Для настройки OpenVPN клиентов нам потребуются корневой сертификат, сертификат и ключи пользователя user1:

user1.crt;
user1.key;
ca.crt.

Эти сертификаты находятся в каталоге /config/rsa2/ и их можно скопировать себе с помощью утилиты SCP или WinSCP с маршрутизатора.

Далее создаем текстовый файл конфигурации (например blackdiver-openvpn.ovpn) и записываем в него настройки подключения:

Конфигурация для подключения по протоколу UDP:
client
proto udp
remote-cert-tls server
verb 2
dev tun0
cert user1.crt
key user1.key
ca ca.crt
remote 1.1.1.2 1194

Конфигурация для подключения по протоколу TCP:
client
proto tcp
remote-cert-tls server
verb 2
dev tun0
cert user1.crt
key user1.key
ca ca.crt
remote 1.1.1.2 1194

Если требуется работа через Proxy, то в конфигурацию клиента так же дописываем:

после этого, помещаем все файлы (ca.crt, user1.crt, user1.key, blackdiver-openvpn.ovpn) в каталог config на клиенте и инициируем подключение.

Отзыв клиентских сертификатов

Для отзыва сертификатов переходим в каталог:

Отзываем сертификат пользователя user1:

При первом отзыве, создастся файл crl.pem в котором будет храниться список отозванных сертификатов. Этот файл нужно прописать в настройках сервера:

set interfaces openvpn vtun0 tls crl-file /config/rsa2/keys/crl.pem

Команды для диагностики

Посмотреть подключенных клиентов:

show openvpn server status

Перезапустить OpenVPN сервер:

reset openvpn interface vtun0

Посмотреть список отозванных сертификатов:

openssl crl -in /config/rsa2/crl.pem -text
cat /config/rsa2/keys/index.txt

Настройка OpenVPN на VyOS закончена. Из нюансов можно отметить, что сервер OpenVPN можно настроить на 443/TCP или 80/TCP порт и тогда можно будет инициировать подключение даже если в сети доступен только просмотр Web страниц и используется прокси.

Заказать создание и поддержку безопасной IT-инфраструктуры любой сложности


Я использую Network Manager в Ubuntu 12.10 для подключения к серверу openvpn. Связь работает без проблем. Однако при подключении я хотел бы изменить свой DNS-сервер по умолчанию на сервер в сети vpn. Таким образом, я могу использовать доменные имена, которые определены только в сети vpn. Есть ли способ сделать это автоматически с помощью Network Manager?

Я также могу изменить настройки на сервере openvpn, если мне нужно это сделать.

  • Это нужно делать на сервере. См. Аналогичный вопрос.
  • Похоже, это поможет. Я это попробую. Благодаря!
  • Для читателей более современных версий Ubuntu, использующих NetworkManager, см. Это решение.

Хотя это обычно делается на сервере, как упоминалось в комментариях, могут быть случаи, когда вы хотите использовать DNS VPN только для запросов внутри VPN. В этом случае вы, вероятно, захотите запустить в своей системе легкий DNS-демон и указать ему, куда отправлять какой запрос. Если вы находитесь в нескольких VPN одновременно, это просто необходимо.

  • Я бы проголосовал за dnsmasq, потому что его очень легко настроить и даже предварительно установить в некоторых системах. Подробно описано в моем ответе.
  1. Что касается конфигурации сервера, сервер OpenVPN должен выдавать что-то вроде

push dhcp-option DNS XXX.XXX.XXX.XXX

push dhcp-option DOMAIN mylocaldomain.local

(подробнее см. здесь). XXX.XXX.XXX.XXX это ваш DNS-сервер, mylocaldomain.local это ваш локальный домен. Его легко найти в выходных данных клиента OpenVPN (dhcp-option DNS . dhcp-option DOMAIN . ), когда вы запускаете его на локальном компьютере.

  1. Клиент OpenVPN должен обновить файл resolv.conf (проверено 14.04).

$ sudo openvpn --config client.ovpn --up /etc/openvpn/update-resolv-conf --down /etc/openvpn/update-resolv-conf --script-security 2

Как отмечает @peterph, облегченный DNS кажется лучшим вариантом. Это потому что /etc/resolv.conf действительно может обрабатывать только один DNS.

Поэтому я думаю, что dnsmasq - лучший вариант для Linux. Я использовал это в CentOS 6, но конфигурация должна быть похожей на все.

Читайте также: