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-й версии)
Последние две опции применимы только для 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
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 - отключает авторизацию по сертификатам.
Работа с прокси
OpenVPN без проблем может работать через http и socks прокси.
http-proxy< server port [auth] > - указываем адрес и порт прокси-сервера.
http-proxy 192.168.0.12 8080
Если требуется авторизация на прокси-сервере:
http-proxy< server port authfile > - где authfile - файл содержащий две строки (имя пользователя и пароль) или stdin (будет запрошено имя пользователя и пароль).
Так же после authfile требуется указать метод авторизации. Можно
оставить auto для автоматического выбора метода авторизации или указать
явно через auth-method.
auth-method может быть трех видов "none", "basic" или "ntlm".
Используется в OpenVPN начиная с версии 2.1.
http-proxy-retry - переподключатся если соединение было разорвано.
http-proxy-timeout< seconds > - считать соедение с прокси-сервером разорванным после n-секунд неактивности. Например:
http-proxy-timeout 5
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 > - выполнить команду, когда клиент отключился.
Команды отладки и поиска неисправностей
verb< verbosity level > - устанавливает уровень информативности отладочных сообщений. Может принимать параметр от 0 до 11. По умолчанию verb равен 1.
При уровне verb 5 и выше в логе будут встречатся подобные записи: RwrW.
R (read), W (write) - соответственно чтение и запись. Большая буква
обозначает, что пакет был считан (R) или записан (W) на виртуальном
устройстве TUN/TAP, а маленькие считан (r) и записан (w) в туннеле.
mute< number of messages > - если значение установлено в 10, то в лог будет записываться только по 10 сообщений из одной категории.
Логирование
log< file > - указываем лог-файл. Если данный параметр не указан, то весь вывод openvpn будет производится в stdout.
log-append< file > - дописывать сообщения в лог-файл, а не перезаписывать.
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? О. Эти два файла используются в качестве временной базы данных,
используемой при генерации ключей. Должны находиться в том каталоге,
где и ключи.