OpenVPN
OpenVPN — свободная реализация технологии виртуальной частной сети (VPN) с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты между компьютерами. Она позволяет устанавливать соединения между компьютерами, находящимися за NAT и сетевым экраном, без необходимости изменения их настроек. OpenVPN была создана Джеймсом Йонаном (James Yonan) и распространяется под лицензией GNU GPL[1].
В данной статье будут наиболее подробно описаны основные команды используемые в OpenVPN.
Пояснение файла openvpn.conf
- mode server - указывает программе работать в режиме сервера
- tls-server - активирует работу Transport Layer Security (криптографический протокол) сервера
- proto tcp-server - выбираем протокол TCP (если необходим UDP, тогда: proto udp)
- dev tap - используемый тип интерфейса - L2 туннель (для L3-туннеля: dev tun)
- port 1200 - указываем порт, по которому будет работать OpenVPN
- daemon - программа будет работать в режиме демона, если нет в этом необходимости - просто раскомментируйте строку
- tls-auth /etc/openvpn/keys/ta.key 0 - активирует дополнительный уровень аутентификации
- ca /etc/openvpn/keys/ca.crt - путь к корневому сертификату
- cert /etc/openvpn/keys/server.crt - путь к сертификату сервера
- key /etc/openvpn/keys/server.key - ключ сервера
- dh /etc/openvpn/keys/dh1024.pem - файл алгоритма Diffie-Hellman
- client-config-dir /etc/openvpn/ccd - путь к каталогу индивидуальных клиентских конфигураций
- ifconfig 192.168.10.1 255.255.255.0 - устанавливает виртуальный адрес сервера
- ifconfig-pool 192.168.10.2 192.168.10.99 - устанавливает диапазон виртуальных адресов для клиентов
- push "route 192.168.10.0 255.255.255.0 192.168.10.1" - эта команда будет выполняться на клиентских компьютерах, во время инициализации OpenVPN, она будет активировать роутинг так, чтобы клиенты автоматически использовали openvpn-сервер как шлюз для этой подсети
- duplicate-cn - включает возможность использования одного ключа несколькими клиентами
- verb 3 - указывает уровень отладки
- cipher DES-EDE3-CBC - шифрование по алгоритму DES-EDE3-CBC
- persist-key - будет загружать ключи в режиме persist, то есть их перезагрузка не потребуется в случае разрыва соединения
- log-append /var/log/openvpn.log - путь к файлу лога
- persist-tun - активирует работу tun/tap устройств в режиме persist
- comp-lzo - активирует использование сжатия
Описание команд и параметров OpenVPN
Приведенные в статье команды без -- (двумя знаками дефиса) перед командой должны быть использованы в конфигурационном файле, команды с -- в начале используются только из командной строки. Подробности использования команд и их параметры - man openvpn.
- remote < host > - определяет удаленный конец туннеля. Могут использоваться записи IP и DNS.
- local < host > - определяет локальный ip или имя хоста, на котором будет работать OpenVPN. Актуально, если на локальной машине несколько адресов.
- dev < device > - определяет какой использовать тип устройства tun или tap. [2]
- port < port number > - указывает на каком порту будет работать OpenVPN (локально и удаленно).
- proto < proto > - какой протокол будет использоваться. Возможные значения: udp, tcp, tcp-client, tcp-server.[3]
- remote-random - если указана данная опция и в random перечисленно несколько удаленных хостов, то OpenVPN в случайном порядке будет к ним подключаться. Применяется для балансировки нагрузки.
- float - позволяет удаленному хосту изменять IP во время работы туннеля. Соединение при этом не разрывается.
- ipchange < cmd > - выполняет скрипт или команду указанную в < cmd >, если IP сменился.[4]
- connect-retry < seconds > - пробует переподключиться через указанное время в секундах, если соединение было разорвано.
- connect-retry-max < n > - максимальное количество повторов если соединение было разорвано
- resolv-retry < seconds > - если OpenVPN не удалось узнать имя удаленного хоста по DNS, то через указанное количество секунд попытаться переподключиться.
- lport < port > - указывает на локальный порт для использования OpenVPN
- rport < port > - аналогично для удаленного порта.[5]
- nobind - использовать динамический порт для подключения (только для клиента)
- shaper < bytes > - указывает скорость передачи данных в байтах для исходящего трафика (только для клиента)
- tun-mtu < mtu size > - устанавливает максимальный размер MTU. По умолчанию tun-mtu равен 1500.[6]
- dev-node < interface name > - устанавливает имя виртуального интерфейса.[7]
- ifconfig - устанавливает локальный IP и маску подсети для туннельного интерфейса.[8]
- server < network > < mask > - автоматически присваивает адреса всем клиентам (DHCP) в указанном диапазоне с маской сети. Данная опция заменяет ifconfig и может работаеть только с TLS-клиентами в режиме TUN, соответственно использование сертификатов обязательно.[9]
- server-bridge < gateway > < mask > < pool > - сервер в режиме моста для TAP устройств.[10]
- mode server - переключает OpenVPN в режим сервера (начиная с 2-й версии)
- mode p2p - данная опция идет по умолчанию.
Опции в режиме сервера
- push < options > - передача клиенту конфигурационных параметров.[11]
- comp-lzo - параметр сжатия трафика, идущего через виртуальный туннель. Может принимать значения yes, no, adaptive. Последнее используется по умолчанию.[12]
Команды и параметры при работе с сертификатами 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 имена пользователя и группы.
Примечания
- ↑ OpenVPN: An Introduction and Interview with Founder, James Yonan (англ.). LinuxSecurity.com.
- ↑ Например: dev tun или dev tap. При одном из таких указаний будет использован свободный интерфейс tun или tap. Так же можно явно указывать номер виртуального интрефейса, например tun0.
- ↑ tcp-client - сам пытается установить соединение
tcp-server - только ждет подключений
Примечательно, что с использованием протокола udp VPN будет работать чуть быстрее, чем tcp. Но в плане стабильности работы лучше выбирать tcp (как показывает практика, VPN-соединение более устойчиво) - ↑ Например: ipchange script-ip.sh
- ↑ Например: rport 8000 - OpenVPN будет пытаться подключится к удаленному порту 8000
- ↑ Например: tun-mtu 1200
- ↑ Например: dev-node openvpn1
- ↑ Например: ifconfig 10.3.0.1 255.255.255.0
- ↑ Например: server 10.3.0.0 255.255.255.0
Подключившиеся клиенты получат адреса в диапазоне между 10.3.0.1 и 10.3.0.254. - ↑ Например: 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. - ↑ Например: 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 - принудительно включить сжатие
comp-lzo no - принудительно отключить сжатие
comp-lzo adaptive - адаптивный режим.