Настройка OpenVPN

OpenVPN

  OpenVPN — свободная реализация технологии Виртуальной Частной Сети (VPN) с открытым исходным кодом для создания зашифрованных каналов типа точка-точка или сервер-клиенты. Она позволяет устанавливать соединения между компьютерами, находящимися за NAT-firewall, без необходимости изменения их настроек. OpenVPN была создана Джеймсом Йонаном (James Yonan) и распространяется под лицензией GNU GPL.

Для обеспечения безопасности управляющего канала и потока данных, OpenVPN использует библиотеку OpenSSL. Благодаря этому задействуется весь набор шифров, доступных в данной библиотеке. OpenVPN используется на операционных системах Solaris, OpenBSD, FreeBSD, NetBSD, GNU/Linux, Apple Mac OS X, QNX и Microsoft Windows. OpenVPN проводит все сетевые операции через TCP, либо UDP порт. Также возможна работа через большую часть прокси серверов, через NAT и сетевые фильтры. Сервер может быть настроен на назначение сетевых настроек клиенту. Например: IP адрес, настройки маршрутизации и параметры соединения. Также возможно использование библиотеки компрессии LZO, для сжатия потока данных.

Использование в OpenVPN стандартных протоколов TCP и UDP позволяет ему стать альтернативой IPsec в ситуациях, когда Интернет-провайдер блокирует некоторые VPN протоколы.

Настройка OpenVPN

 Создаём конфигурационный файл для сервера /etc/openvpn/server.conf:

 port 443

proto tcp

dev tun

ca /etc/openvpn/ca.crt

cert /etc/openvpn/server.crt

key /etc/openvpn/server.key

dh /etc/openvpn/dh1024.pem

server 10.10.10.0 255.255.255.0

ifconfig-pool-persist ipp.txt

push "route 10.0.0.0 255.255.255.0"

;duplicate-cn

keepalive 10 120

;cipher BF-CBC # Blowfish (default)

;cipher AES-128-CBC # AES

;cipher DES-EDE3-CBC # Triple-DES

comp-lzo

user nobody

group nogroup

persist-key

persist-tun

status openvpn-status.log

log-append openvpn.log

verb 4

mute 20

client-to-client

  

Комментируем файл конфигурации:

Указываем, на каком порту принимать соединения:

port 443

  

Указываем протокол (tcp или udp):

proto tcp

  

Указываем, что именно будем инкапсулировать в туннеле (ethernet фреймы — tap или ip пакеты — tun)

dev tun

  

Прописываем пути к ключам и сертификатам:

ca /etc/openvpn/ca.crt

cert /etc/openvpn/test.crt

key /etc/openvpn/test.key

dh /etc/openvpn/dh1024.pem

  

Выделяем внутренний диапазон адресов для VPN:

server 10.10.10.0 255.255.255.0

  

В какой файл будем записывать выданные для VPN адреса?:

ifconfig-pool-persist ipp.txt

  

Прописываем на клиенте маршрут до домашней сети (той которая за сервером):

push "route 192.168.7.0 255.255.255.0"

  

Пинговать каждые 10 секунд, если хост не отвечает в течении 120 секунд, считать его недоступным:

keepalive 10 120

 

Разрешить сжатие пакетов:

comp-lzo

 

Прописываем пользователя и группу, от имени которых будет запускаться демон:

user nobody

group nogroup

 

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

persist-key

 

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

persist-tun

 

Уровень подробности логов (от 0 до 9):

verb 4

 

Не писать в логи повторяющиеся сообщения:

mute 20

 

Разрешить пересылку пакетов между клиентами:

client-to-client

 

Создание ключей и сертификатов

  Теперь необходимо создать ключи и сертификаты для шифрования и авторизации. Соответствующие скрипты для этого находятся в папке /usr/share/doc/openvpn/examples/easyrsa/2.0 для Ubuntu server 12.04 или /usr/share/easy-rsa для Ubuntu server 14.04

  Переходим в каталог со скриптами и создаём CA (авторитетный сертификат):

#. ./vars

#./clean-all

#./build-ca

 

Теперь создадим сертификат и приватный ключ для сервера:

#./build-key-server server

 

Создаём ключ для клиента (если клиентов несколько, процедуру придётся повторить):

#./build-key client1

 

Примечание: для каждого клиента должно быть указано своё уникальное имя (в

данном случае client1).

 

Генерируем параметры Диффи-Хеллмана:

#./build-dh

 

Помещаем следующие файлы в директорию /etc/openvpn/

  • ca.crt

  • server.crt

  • dh1024.pem

  • server.key

 

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

  Конфигурационный файл клиентской машины /etc/openvpn/client.conf будет выглядеть следующим образом:

 

remote XX.XX.XX.XX 443

client

dev tun

proto tcp

resolv-retry infinite # this is necessary for DynDNS

nobind

user nobody

group nogroup

persist-key

persist-tun

ca /etc/openvpn/ca.crt

cert /etc/openvpn/client1.crt

key /etc/openvpn/client1.key

comp-lzo

verb 4

mute 20

 

Теперь необходимо скопировать с сервера в папку /etc/openvpn/ сгенерированные

клиентские ключи и авторитетный сертификат сервера:

ca.crt

client1.crt

client1.key

 

После этого можно запускать клиент OpenVPN и проверять связь с сервером.

 

Настройка OpenVPN в режиме моста

 

Иногда приведенной ранее конфигурации не достаточно. Самый простой пример — клиенты должны получать адреса из внутренней сети за OpenVPN.

 

В таком случае настройка сервера OpenVPN незначительно меняется.

 

Для начала необходимо установить bridge-utils

# apt-get install bridge-utils

 

Далее, в каталоге /etc/openvpn создаем скрипты со следующим содержимым:

bridge-start.sh

  

#!/bin/bash

br="br0"

tap="tap0"

eth="eth0"

 

eth_ip=`ifconfig $eth| grep Mask| awk '{print $2}'| awk -F : '{print $2}'`

eth_netmask=`ifconfig $eth| grep Mask| awk '{print $4}'| awk -F : '{print $2}'`

eth_broadcast=`ifconfig $eth| grep Mask| awk '{print $3}'| awk -F : '{print $2}'`

gw=`route |grep ^default|awk '{print $2}'`

 

openvpn --mktun --dev $tap

 

brctl addbr $br

brctl addif $br $eth

 

brctl addif $br $tap

 

 

ifconfig $tap 0.0.0.0 promisc up

 

ifconfig $eth 0.0.0.0 promisc up

 

ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast

route add default gw $gw

  

bridge-stop.sh

  

#!/bin/sh

br="br0"

tap="tap0"

eth="eth0"

 

gw=`route |grep ^default|awk '{print $2}'`

eth_ip=`ifconfig $br| grep Mask| awk '{print $2}'| awk -F : '{print $2}'`

eth_netmask=`ifconfig $br| grep Mask| awk '{print $4}'| awk -F : '{print $2}'`

eth_broadcast=`ifconfig $br| grep Mask| awk '{print $3}'| awk -F : '{print $2}'`

 

ifconfig $br down

brctl delbr $br

 

openvpn --rmtun --dev $tap

 

ifconfig $eth $eth_ip netmask $eth_netmask broadcast $eth_broadcast

route add default gw $gw

  

Далее создаем файл конфигурации для сервера /etc/openvpn/server.conf

  

port 443

proto tcp

dev tun0

ca ca.crt

cert server.crt

key server.key

dh dh2048.pem

server-bridge 192.168.20.177 255.255.255.0 192.168.20.10 192.168.20.20

keepalive 10 120

cipher BF-CBC

comp-lzo

user nobody

group nogroup

persist-key

persist-tun

verb 4

mute 20

client-to-client

up /etc/openvpn/bridge-start.sh

down /etc/openvpn/bridge-stop.sh

  

По сравнению с прошлым файлом конфигурации изменения были минимальны:

dev tun0 – используем сетевой интерфейс типа tun

server-bridge 192.168.20.177 255.255.255.0 192.168.20.10 192.168.20.20 – где

192.168.20.177 – IP-адрес сервера OpenVPN

255.255.255.0 – маска сети

192.168.20.10 начальный адрес диапазона для клиентов OpenVPN

192.168.20.20 – конечный адрес диапазона для клиентов OpenVPN

  

up /etc/openvpn/bridge-start.sh – скрипт создания бриджа при старте сервиса OpenVPN

down /etc/openvpn/bridge-stop.sh – скрипт отключения бриджа при остановке сервиса OpenVPN

  

Файл конфигурации клиента меняется только в описании используемого интерфейса.

Вместо dev tap нужно прописать dev tun0

  

OpenVPN в режиме bridge и VMWare ESXi

  Если сервер OpenVPN развернут на ESXi и там настроен бридж, то, скорее всего, по умолчанию ничего не заработает. Необходимо на виртуальном свиче, к которому подключен интерфейс br0 включить promiscuous mode

 

alt