Настройка OpenVPN с использованием сертификатов X.509

Настройка OpenVPN с использованием сертификатов X.509
В общих чертах:
Есть сервер с LAN - 192.168.0.0/24, нужно чтоб подключившийся получал ip из 10.0.0.0/24. Подключаться могут множество клиентов и должны иметь доступ друг к другу и в LAN, вот собственно и все..


Создание самоподписного доверенного сертификата (CA)
Для шифрования трафика нам понадобится сертификат X.509.
Для его генерирования нам понадобится openssl, для Linux это не проблема, а вот в Windows его нужно еще установить.
Скачать можно с офф. сайта openssl сложностей возникнуть не должно..


По умолчанию OpenSSL использует файл конфигурации /etc/ssl/openssl.cnf.
Я рекомендую создать отдельный файл конфигурации OpenSSL в папке /usr/local/etc/openvpn.
Создаем нужные папки (Описание для FreeBSD, должно быть актуально и для Linux)

mkdir /usr/local/etc/openvpn
cd /usr/local/etc/openvpn
mkdir ccd certs crl keys private req
chmod 700 keys private
echo "01" > serial
touch index.txt

Данный файл должен называться openssl.cnf и иметь следующее содержимое:

[ ca ]
default_ca               = CA_default
[ CA_default ]
dir                      = /usr/local/etc/openvpn
crl_dir                  = $dir/crl
database                 = $dir/index.txt
new_certs_dir            = $dir/certs
certificate              = $dir/CA_cert.pem
serial                   = $dir/serial
crl                      = $dir/crl/crl.pem
private_key              = $dir/private/CA_key.pem
RANDFILE                 = $dir/private/.rand
default_days             = 3650
default_crl_days         = 365
default_md               = md5
unique_subject           = yes
policy                   = policy_any
x509_extensions          = user_extensions
[ policy_any ]
organizationName         = match
organizationalUnitName   = optional
commonName               = supplied
[ req ]
default_bits             = 2048
default_keyfile          = privkey.pem
distinguished_name       = req_distinguished_name
x509_extensions          = CA_extensions
[ req_distinguished_name ]
organizationName         = Organization Name (must match CA)
organizationName_default = Company
organizationalUnitName   = Location Name
commonName               = Common User or Org Name
commonName_max           = 64
[ user_extensions ]
basicConstraints         = CA:FALSE
[ CA_extensions ]
basicConstraints         = CA:TRUE
default_days             = 3650
[ server ]
basicConstraints         = CA:FALSE
nsCertType               = server
Для создания самоподписного доверенного сертификата (Certification Authority, CA) и закрытого ключа для него необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

openssl req -new -nodes -x509 -keyout private/CA_key.pem -out CA_cert.pem -days 3650
Команды:
req заставляет OpenSSL создать сертификат, ключи:
-new - cоздать запрос на сертификат,
-nodes - не шифровать закрытый ключ,
-x509 (совместно с -new) - создать самоподписной сертификат (CA),
-keyout - задает местонахождение закрытого ключа,
-out - задает местонахождение самоподписного сертификата,
-days - задает время действия сертификата (365x10 дней, что приблизительно равно десяти годам).
-config cfg также можно указать путь к конфигурационному файлу при необходимости


В процессе выполнения команды на экран будут выданы запросы о вводе таких параметров как: Country Name, State or Province Name; Locality Name; Organization Name; Organizational Unit Name; Common Name; Email Address.

Самым важным параметром является значение Common Name.
В данном случае оно должно совпадать с FQDN-именем сервера (полное имя домена).
Для просмотра результата генерации самоподписного сертификата и закрытого ключа необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

openssl x509 -noout -text -in CA_cert.pem       (для сертификата)
openssl rsa -noout -text -in private/CA_key.pem (для закрытого ключа)

Создание сертификата сервера
Перед созданием сертификата сервера необходимо создать запрос на сертификат сервера и закрытый ключ сервера. Для этого необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

openssl req -new -nodes -keyout keys/server.pem -out req/server.pem

Команда и ключи OpenSSL рассмотрены выше.
В процессе выполнения комнды Вам опять придется ответить на вопросы. Ответы должны соответствовать ответам из предыдущего пункта.
В ответ на дополнительные запросы "A challenge password []:" и "An optional company name []:" необходимо просто нажать <Enter>.
Для просмотра результата генерации запроса на сертификат и закрытого ключа сервера необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

openssl req -noout -text -in req/server.pem  (для запроса на сертификат)
openssl rsa -noout -text -in keys/server.pem (для закрытого ключа)
Для создания сертификата сервера необходимо подписать запрос на сертификат сервера самоподписным доверенным сертификатом (CA).
Для этого необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:
openssl ca -batch -config openssl.cnf -extensions server -out certs/server.pem -infiles req/server.pem 
Команда ca заставляет OpenSSL подписать запрос на сертификат, ключи: -config задает местонахождение файла конфигурации OpenSSL,
-extensions - задает секцию файла конфигурации OpenSSL, содержащую дополнительные параметры генерируемого сертификата,
-out - задает местонахождение генерируемого сертификата,
-infiles - задает местонахождение запроса на сертификат,
-batch - избавляет Вас от ответов на дополнительные вопросы.
В процессе выполнения команды Вам будет задан вопрос "Sign the certificate? [y/n]:", на который нужно ответить утвердительно, после чего произойдет генерация сертификата и обновление базы данных сертификатов (файлов index.txt и serial).
Для просмотра результата генерации сертификата необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

openssl x509 -noout -text -in certs/server.pem

Создание файла параметров Диффи-Хэлмана
Для создания файла параметров Диффи-Хэлмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

openssl dhparam -out dh2048.pem 2048
Команда dhparam приказывает OpenSSL создать файл параметров Диффи-Хэлмана, число 2048 определяет разрядность в битах.
Внимание: данная команда выполняется достаточно медленно даже на очень мощных компьютерах.

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

Процедура создания клиентских запросов на сертификаты и закрытых ключей, подписания запросов на сертификаты и генерации сертификатов, а также просмотра запросов на сертификаты, сертификатов и закрытых ключей полностью аналогична соответствующей процедуре для сервера.
Сделаю одно небольшое замечание: запросы на сертификаты, закрытые ключи и сертификаты должны иметь шаблонные имена, например, вида: req/RClient для запросов на сертификаты,
keys/KClient для закрытых ключей и
certs/CClient для сертификатов, соответственно.
Слово Client должно быть заменено именем клиента, которое обязательно должно соответствовать значению параметра Common Name, вводимого при генерации запроса на сертификат для соответствующего клиента. Возможность дублирования Common Name у нескольких клиентов определяется конфигурацией сервера.
Для генерации запроса на сертификат и закрытого ключа, а также подписания запроса на сертификат и генерации сертификата для клиента Client необходимо выполнить следующие команды, находясь в папке /usr/local/etc/openvpn:

openssl req -new -nodes -keyout keys/KClient.pem -out req/RClient.pem
openssl ca -batch -config openssl.cnf -out certs/CClient.pem -infiles req/RClient.pem 
Для просмотра сгенерированных запроса на сертификат, закрытого ключа и сертификата клиента Client необходимо выполнить следующие команды, находясь в папке /usr/local/etc/openvpn:

openssl req -noout -text -in req/RClient.pem    (для запроса на сертификат)
openssl rsa -noout -text -in keys/KClient.pem   (для закрытого ключа)
openssl x509 -noout -text -in certs/CClient.pem (для сертификата) 
На данном этапе для рассматриваемого случая необходимо создать три групы, состоящих из запроса на сертификат / закрытого ключа / сертификата, с именами Rclient1 / Kclient1 / Cclient1, Rclient2 / Kclient2 / Cclient2 и Rclient3 / Kclient3 / Cclient3 для филиала № 1 (Common Name - client1), для филиала № 2 (Common Name - client2) и для системного администратора (Common Name - client3), соответственно.


Создание списка отзыва сертификатов
 
Для создания списка отзыва сертификатов необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

openssl ca -config openssl.cnf -gencrl -out crl/crl.pem
Команда:
ca с ключем -gencrl заставляет OpenSSL создать список отзыва сертификатов,
-config рассмотрен выше,
-out - задает местонахождение списка отзыва сертификатов.
Данная команда создает пустой список отзыва сертификатов.

Для того, чтобы отозвать сертификат клиента Client необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:
openssl ca -config openssl.cnf -revoke certs/CClient.pem

Команда
ca с ключем -revoke заставляет OpenSSL отозвать заданный сертификат, ключ
-config рассмотрен выше.

Для просмотра списка отозванных сертификатов необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:
openssl crl -noout -text -in crl/crl.pem

Создание статического ключа HMAC
Для создания статического ключа HMAC, обеспечивающего дополнительную защиту от DoS-атак и флудинга UDP-портов, необходимо выполнить следующую команду, находясь в папке /usr/local/etc/openvpn:

openvpn --genkey --secret ta.key


Файл конфигурации сервера 
По умолчанию конфигурация сервера OpenVPN хранится в файле openvpn.conf, который должен находится в папке /usr/local/etc/openvpn.
В простом варианте конфиг будет иметь вид:

dev               tun
local             <Внешний IP-адрес сервера>
port              1194
proto             udp
server            10.0.0.0 255.255.255.0
push              "route 10.0.0.0 255.255.255.0"
#route             192.168.1.0 255.255.255.0
#route             192.168.2.0 255.255.255.0
client-config-dir /usr/local/etc/openvpn/ccd
client-to-client
tls-server
dh                /usr/local/etc/openvpn/dh2048.pem
ca                /usr/local/etc/openvpn/CA_cert.pem
cert              /usr/local/etc/openvpn/certs/server.pem
key               /usr/local/etc/openvpn/keys/server.pem
crl-verify        /usr/local/etc/openvpn/crl/crl.pem
tls-auth          /usr/local/etc/openvpn/ta.key 0
comp-lzo
keepalive         10 120
tun-mtu           1500
mssfix            1450
persist-key
persist-tun
user              openvpn
group             openvpn
verb              3
dev - Выбор типа устройства TUN/TAP зависит от целей создания тунеля. Основное различие, что TUN - это обычный туннель, который работает на ip уровне, а TAP - работает на канальном уровне, за счет того, что создается виртуальная сетевая карточка.
При использовании TAP генерируется значительно больше трафика из-за того же броадкаста и увеличивающихся "накладных расходов" по инкапсуляции большего количества данных.
TAP используется для создания сетевого моста, а TUN для маршрутизации

local и port - IP-адрес и порт, на которых OpenVPN принимает входящие соединения

proto - Протокол лучше использовать UDP, т.к. там где нужно и так будет использован TCP, а TCP over TCP ничего хорошего не даст.
server - пул IP-адресов, выделенный для виртуальной частной сети и автоматически распределяемый между клиентами (не из внутреннего пула адресов использующегося в LAN)
push - команда OpenVPN, передаваемая клиенту и выполняемая клиентом (в данном случае "route 10.0.0.0 255.255.255.0" добавляет на стороне клиента маршрут к виртуальной частной сети), 
route - добавляет на стороне сервера маршруты к локальным подсетям, находящимся за клиентами (Должен быть прописан iroute в файле конфигурации клиента). Роут по умолчанию можно задать либо просто route с пустым значением либо в качестве параметра указать "default".
client-config-dir - папка с файлами конфигурации клиентов (лучше указывать полные пути)
client-to-client - разрешение клиентам "видеть" друг друга (естественно, при наличии соответствующих правил маршрутизации),
tls-server - включение поддержки TLS; 
dh - местонахождение файла параметров Диффи-Хэлмана, 
ca - местонахождение самоподписного доверенного сертификата (CA), 
cert - местонахождение сертификата сервера, 
key - местонахождение закрытого ключа сервера, 
crl-verify - местонахождение списка отзыва сертификатов, 
tls-auth - местонахождение статического ключа HMAC, 
comp-lzo - использование LZO-компрессии трафика (Увеличивает нагрузку на проц, но компенсирует потери за счет дополнительных данных для работы VPN), 
keeplive - поддержание соединения (в данном случае отправка пингов каждые 10 секунд, и закрытие соединения через две минуты после отсутствия ответных пакетов, как сервером, так и клиентами), 
tun-mtu и mssfix - параметры передачи данных по тоннелю, 
persist-tun - не закрывать / открывать по-новой tun-устройство при получении сигнала SIGUSR1 (перезапуск без привилегий root) или при выполнении ping-restarts, 
user и group - пользователь и группа, от имени которых работает OpenVPN после запуска (запуск выполняется под root'ом), 
verb - уровень детализации сообщений, выдаваемых OpenVPN в /var/log/messages.

ip-win32 netsh  для Windows! C этой опцией клиент шустрее коннектится к серверу.
Файлы конфигурации клиентов (на стороне сервера)
Файлы конфигурации клиентов являются текстовыми файлами и содержат команды, выполняемые сервером при подключении клиентов.
Имена файлов конфигурации клиентов должны соответствовать Common Name клиентов, т.е. при подключении клиента с Common Name client1 сервер выполнит команды, заданные в файле client1 и т.д.
Файлы конфигурации клиентов должны находиться в папке /usr/local/etc/openvpn/ccd.
Создадим файл конфигурации для клиента client1:
cd /usr/local/etc/openvpn/ccd
touch client1

Файл client1 должен содержать команду: добавляющую клиенту маршрут к локальной подсети VPN роутера
push "route 192.168.0.0 255.255.255.0"
т.е. так выглядит конфиг клиента который подключается для доступа в локальную сеть.
Если Вам нужен не просто доступ в локальную сеть, а также использование VPN сервера в качестве шлюза, то нужно будет проделать следующее:
1. Добавить команду для задания роута по-умолчанию
push "redirect-gateway def1"

Передача клиенту опции redirect-gateway заставит весь IP-трафик, порождаемый на клиентской машине, пройти через сервер OpenVPN. Сервер должен быть настроен на обработку этого трафика каким-нибудь образом, например, путем отправки в Интернет через NAT, или маршрутизацию через HTTP-прокси сайта сервера. 2. Для меня проще настроить через NAT на сервере(к тому же он и быстрее).
Вам данный способ также должен подойти, если не требуются какие-либо дополнительные возможности Proxy сервера, чтоб вы могли через сервер получать доступ наружу. Для этого необходимо выполнить команды:
Просмотр правил NAT
# iptables -t nat -L -n -v 

Добавление NAT для VPN-подсети 10.0.0.0/24 ([LAN_IP]) и что Внешний интерфейс tun0 ([eth]) c ip адресом [PUBLIC_IP]
# iptables -t nat -I POSTROUTING -s [LAN_IP] -o [eth]-j SNAT --to-source [PUBLIC_IP]
iptables -t nat -I POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source [PUBLIC_IP]

Не обязательно по такой схеме натить весь трафик. Можно например прописать конкретные маршруты на внешку через VPN, а все остальное будет ходить, как обычно :)
  Примечание: если у Вас остались какие-то вопросы по iptables, рекомендую почитать статью Руководство по iptables (Iptables Tutorial 1.1.19)

Приведу еще пару примеров для разных случаев
Соединение LAN-LAN. Нужно соединить сети двух офисов по vpn, т.е. по факту тоже что и выше, только клиент должен "сообщить"  серверу, что за ним находится подсеть 192.168.1.0/24 (в конфиге сервера должен быть соответствующая строка "route 192.168.1.0 255.255.255.0")
push "route 192.168.0.0 255.255.255.0"
iroute 192.168.1.0 255.255.255.0


Назначение статических ip адресов для клиентов
Назначение статических IP-адресов клиентам OpenVPN облегчает организацию систем учета трафика и упрощает настройку брандмауэра сервера OpenVPN как для ограничения прав доступа к сетевым службам, так и для управления полосой пропускания.
Назначение статических IP-адресов клиентам OpenVPN описано в HOWTO, не представляет каких-либо сложностей и не требует изменения файлов конфигурации клиентского программного обеспечения.
Процедура назначения статических IP-адресов клиентам OpenVPN состоит в добавлении строки ifconfig-push <IP-адрес клиента> <IP-адрес сервера> в файлы конфигурации клиентов, которые содержат команды, выполняемые сервером при подключении клиентов, и находятся в папке/usr/local/etc/openvpn/ccd (определяется параметром client-config-dir файла конфигурации сервера OpenVPN).  Выбранные пары IP-адресов должны удовлетворять условиям: 1.  должны быть уникальными 2. должны входить в состав последовательных подсетей, ограниченных маской /30 (255.255.255.252). Если у Вас сложности с вычислениями адресов, то можете воспользоваться LanCalculator (Windows) или ipcalc в *nix.3. должны находиться в пределах пула IP-адресов, выделенного для виртуальной частной сети (определяется параметром server файла конфигурации сервера OpenVPN). 

1-й вариант: для назначения статического ip для клиента client1 необходимо добавить в файл /usr/local/etc/ccd/client1 строку:
ifconfig-push 10.0.0.1 10.0.0.2
Примечание: настройки применяются только после перезапуска openvpn сервера

2-й вариант: для назначения статических ip в файле server.conf вставить строку
ifconfig-pool-persist /usr/local/etc/openvpn/ipp.txt 0

а в файл /usr/local/etc/openvpn/ipp.txt
#имя_сертификата,(!)адрес
client1,10.0.0.2
....
Для упрощения можно использовать сертификаты .p12 (PKCS12 – это архив из трех сертификатов. На FreeBSD они создаются командой build-key-pkcs12). Например:

build-key-pkcs12 client1
у клиента в файле client.ovpn пишу:

pkcs12 vds\\client.p12


Автоматический запуск сервера
Для автоматического запуска сервера OpenVPN при загрузке FreeBSD необходимо добавить строку openvpn_enable="YES" в файл /etc/rc.conf.


Замечания по настройке брандмауэров
Для корректной работы сервера OpenVPN необходимо внести следующие изменения в настройки брандмауэра:
 1. Разрешить прохождение любого трафика через интерфейс OpenVPN;
 2. Разрешить прохождение UDP-трафика на внешний адрес сервера порт 1194 (если вы его не меняли);
 3. Разрешить прохождение любого трафика из виртуальной частной сети в локальную подсеть;
 4. Разрешить прохождение любого трафика из локальной подсети в виртуальную частную сеть;
/sbin/ipfw -q add pass ip from any to any via ${vif}
/sbin/ipfw -q add pass udp from any to ${oip} 1194 in via ${oif}
/sbin/ipfw -q add pass ip from ${vnet} to ${inet} out via ${iif}
/sbin/ipfw -q add pass ip from ${inet} to ${vnet} in via ${iif}


Передача ключевых файлов клиенту
Для передачи файлов клиенту лучше использовать какой-либо твердый носитель, например дискету, но ни в коем случае не сеть Интернет.
Чтобы скопировать файлы, необходимые клиенту Client, на дискету, нужно выполнить следующую последовательность команд:
mount -t msdos /dev/fd0 /mnt
cd /usr/local/etc/openvpn
cp certs/CClient.pem /mnt
cp keys/KClient.pem /mnt
cp CA_cert.pem /mnt
cp ta.key /mnt
umount /mnt
Данные команды монтируют дискету к папке /mnt, копируют сертификат клиента, закрытый ключ клиента, самоподписной доверенный сертификат (CA) и статический ключ HMAC на дискету, а затем размонтируют ее.
Клиентское программное обеспечение
Если клиент работает под FreeBSD, то установка клиента OpenVPN ничем не отличается от установки сервера (используется тот же самый порт), если под Windows, есть два варианта - OpenVPN и OpenVPN GUI.
Первый вариант больше подходит для постоянно включенных серверов (OpenVPN может быть установлена как служба Windows),
второй - для мобильных клиентов, периодически подключающихся к корпоративной сети.
Во всех перечисленных случаях файлы конфигурации имеют один и тот же формат.
Внимание: в случае использовании Windows-клиентов не забывайте использовать в файлах конфигурации двойные бэкслэши вместо одинарных слэшей, используемых в файлах конфигурации Unix-клиентов.

Файл конфигурации клиентского программного обеспечения
Конфигурация клиента OpenVPN хранится в файле openvpn.conf, который должен находится в папке /usr/local/etc/openvpn, если мы имеем дело с FreeBSD-клиентом, или в файле с произвольным именем и расширением .ovpn, который должен находиться в папке C:\Program Files\OpenVPNconfig, если при установке OpenVPN (OpenVPN GUI) не был задан путь, отличный от предлагаемого по умолчанию.

Рассмотрим файл конфигурации клиента client1, установленного на ноутбук с Windows XP. Клиент OpenVPN GUI установлен в каталог по умолчанию, а ключевые файлы, которые ранее были переписаны на дискету, сохранены на диске P: в папке OpenVPN (я предпочитаю шифровать этот диск).
Для рассматриваемого случая файл конфигурация клиента OpenVPN имеет следующий вид:

client
remote       ip.ser.ve.ra 1194
dev          tun
proto        udp
tls-client
tls-remote   FQDN имя сервера которое вводилось при генерировании сертификатов
ca           "X:\\OpenVPN\\CA_cert.pem"
cert         "X:\\OpenVPN\\Chedg.pem"
key          "X:\\OpenVPN\\Khedg.pem"
tls-auth     "X:\\OpenVPN\\ta.key" 1
ns-cert-type server
comp-lzo
tun-mtu      1500
mssfix       1450
verb         3
script-security 2
В данном файле заданы следующие значения параметров клиента OpenVPN:
client - упрощенный вариант указания того, что это файл конфигурации клиента,
dev - устройство OpenVPN,
proto - протокол (в данном случае UDP),
remote - IP-адрес сервера OpenVPN,
tls-client - включение поддержки TLS,
tls-remote - Common Name сервера OpenVPN,
ca - местонахождение самоподписного доверенного сертификата (CA),
cert - местонахождение сертификата клиента,
key - местонахождение закрытого ключа клиента,
tls-auth - местонахождение статического ключа HMAC,
comp-lzo, tun-mtu, mssfix и verb рассмотрены выше.
route - прописывает маршрут при подключении VPN (формат: route network/IP [netmask] [gateway] [metric]). Полезно в случае, если вы получаете маршрут по-умолчанию от роутера и при этом не хотите, чтоб трафик на некоторые подсети шел через соединение VPN.

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

Настройка сервера на DD-WRT
Если мы хотим генерировать сертификаты на роутере с DD-WRT, то придется поставить openssl, а для этого вам понадобится включить поддержку jffs и флешка для роутера.
Затем качать и ставить дополнительные пакеты можно с ipkg.nslu2-linux.org и ставить с помощью ipkg.
Т.к. у меня не оказалось свободной флешки, то считаем, что у нас уже все сертификаты сгенерированы (см. выше) и мы имеем:
Box File to insert
Public Server Cert (CA Cert) CA_cert.pem
Certificate Revoke List crl/crl.pem
Public Server Cert certs/server.pem
Private Server Key keys/server.pem
DH PEM dh1024.pem
OpenVPN Config (см. ниже)
OpenVPN TLS Auth ta.key

Внимание! Вставьте только разделы текста из файлов сертификата вида

----BEGIN CERTIFICATE-----
....
-----END CERTIFICATE-----
Для начала создадим нужную структуру папок (Выполнить команды в Administration > Commands. ). Если Вы не используете flash с jffs то Ваши конфиги для openvpn хранятся в /tmp/openvpn/:

# mkdir /tmp/openvpn/certs /tmp/openvpn/keys /tmp/openvpn/crl /tmp/openvpn/ccd; ls -l /tmp/openvpn/
drwx------    2 root     root             0 Jan  1  1970 ccd
drwxr-xr-x    2 root     root             0 Jan 18 14:58 certs
drwxr-xr-x    2 root     root             0 Jan 18 14:58 crl
drwxr-xr-x    2 root     root             0 Jan 18 14:58 keys
-rw-r--r--    1 root     root           634 Jan 18 15:08 openvpn.conf
-rwx------    1 root     root            18 Jan 17 16:45 route-down.sh
-rwx------    1 root     root            34 Jan 17 16:45 route-up.sh

1. Заходим в Services->VPN. Выбираем "Enable" напротив openvpn server
2. Заполняем остальные поля:
Примечание: все команды с openssl выполняются в папке, в которой генерировали сертификаты. У нас использовалась /usr/local/etc/openvpn/ Client connect script (добавляем маршрут к локальной сети роутера)

push "route 192.168.0.0 255.255.255.0"

Public Server Cert (просматриваем командой)
cat certs/server.pem 

CA Cert
cat CA_cert.pem

Private Server Key
cat keys/server.pem

DH PEM
cat dh1024.pem
Additional Config (Конфиг сервера при стандартной установке без внешних носителей)

mode server
dev tun0
local       "ip Адрес сервера или его полное имя DNS либо DDNS "    
port        1194
proto       udp
push "route 192.168.0.0 255.255.255.0"
server 10.0.0.0  255.255.255.0
keepalive 10 120
dh /tmp/openvpn/dh.pem
ca /tmp/openvpn/ca.crt
cert /tmp/openvpn/cert.pem
key /tmp/openvpn/key.pem
client-config-dir /tmp/openvpn/ccd
crl-verify  /tmp/openvpn/ca.crl
tls-auth    /tmp/openvpn/ta.key 0
client-to-client
tls-server
comp-lzo

# management parameter allows DD-WRT\s OpenVPN Status web page to access the # servers management port
# port must be 5001 for scripts embedded in firmware to work
management localhost 5001
Примечание: если в роутере вставлен дополнительный носитель (например flash), то его нужно монтировать в /jffs. Если Вы хотите хранить ключи на нем, то их придется скопировать из стандартных путей (см. конфиг выше) в нужные места и поменять  соответственно конфигурационный файл. Например я хочу, чтоб все ключи хранились в папке /jffs/opt/openvpn/
Конфиг openvpn , который редактируется через веб, находится в /tmp/openvpn/openvpn.conf. После сохранения ключей через веб
Нужно перед запуском выполнить подготовку:
Создать нужные папки
mkdir /jffs/opt/openvpn/
cd /jffs/opt/openvpn/
mkdir certs keys crl ccd
И скопировать ключи и другие данные
cp /tmp/openvpn/dh.pem /jffs/opt/openvpn/dh1024.pem
cp /tmp/openvpn/ca.crt /jffs/opt/openvpn/CA_cert.pem
cp /tmp/openvpn/cert.pem /jffs/opt/openvpn/certs/server.pem
cp /tmp/openvpn/key.pem /jffs/opt/openvpn/keys/server.pem
cp /tmp/openvpn/ca.crl /jffs/opt/openvpn/crl/crl.pem
cp /tmp/openvpn/ta.key /jffs/opt/openvpn/ta.key
При таких настройках конфиг будет выгладить так:
Additional Config (Конфиг сервера при установке с внешних носителем)

dev               tun
local             "ip Адрес сервера или его полное имя DNS либо DDNS "    
port              1194
proto             udp
push              "route 192.168.0.0 255.255.255.0"
server            10.0.0.0  255.255.255.0
push              "redirect-gateway def1"
client-config-dir /tmp/openvpn/ccd
client-to-client
tls-server
dh                /jffs/opt/openvpn/dh1024.pem
ca                /jffs/opt/openvpn/CA_cert.pem
cert              /jffs/opt/openvpn/certs/server.pem
key               /jffs/opt/openvpn/keys/server.pem
crl-verify        /jffs/opt/openvpn/crl/crl.pem
tls-auth          /jffs/opt/openvpn/ta.key 0
comp-lzo
keepalive         10 120
tun-mtu           1500
mssfix            1450
persist-key
persist-tun
user              openvpn
group             openvpn
verb              3

CCD-Dir DEFAULT file (Добавление маршрута в локальную сеть)

push "route 192.168.0.0 255.255.255.0"
TLS Auth Key

cat ta.key
Certificate Revoke List

cat crl/crl.pem

Теперь нужно добавить разрешение подсоединяться по udp к порту 1194. Заходим в Administration > Commands.
iptables -I INPUT 1 -p udp --dport 1194 -j ACCEPT
Добавляем разрешение на пул адресов для сервера
Добавляем разрешение на пул адресов для сервера

iptables -I FORWARD 1 --source 10.0.0.0/24 -j ACCEPT
Некоторым также необходимо добавить следующие правила (но не всегда.)

iptables -I FORWARD -i br0 -o tun0 -j ACCEPT
iptables -I FORWARD -i tun0 -o br0 -j ACCEPT
Затем нажать "Save Firewall" Конфиг клиента я приводил уже выше.

Затем нужно убедиться что старт сервера проходит нормально. У меня к сожалению сервер не запускался автоматически при перезагрузке, пришлось добавить строчку в Administration > Commands и затем сохнанить "Save startup"

sleep 30;openvpn --daemon --config /tmp/openvpn/openvpn.conf

Примечание: пришлось ввести задержку при старте, т.к. не стартовал демон.

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

#netstat -nl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 127.0.0.1:5001          0.0.0.0:*               LISTEN      
...
udp        0      0 xx.xx.xx.xx:1194        0.0.0.0:*                           
....    
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node Path
Если что-то не получается, можно посмотреть на что ругается сервер при запуске

#openvpn --verb 11 --config /tmp/openvpn/openvpn.conf 
Также можно посмотреть, "висит" ли сервер в процессах

# ps
 PID USER       VSZ STAT COMMAND
...
17955 root      1904 S    openvpn --config /tmp/openvpn/openvpn.conf
...
Можно проверить доступен ли порт с использованием nmap

nmap -sU -p 1194 xx.xx.xx.xx
Просмотреть правила фаервола

iptables --list -n --line-numbers
Удалить правила фаервола (может понадобится для теста причины проблемы...)

iptables -F