Установка OpenVPN-сервера в Debian и бонус

Задачка тривиальная, конечно, но пусть будет тут.
На авторство кода не претендую, но внес небольшие изменения “под себя”.

Интересующимся велкам под кат.

Проверяем возможность запуска tun-интерфейса

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

ls -l /dev/net/tun

Если вывод ничего не покажет – это повод задать вопрос своему хостеру (или подкрутить настройки контейнера).

Установка и настройка

aptitude install openvpn openssl easy-rsa
cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/

Редактируем данные по-умолчанию, которые будут использоваться при генерации ключей:
cd /etc/openvpn/easy-rsa/ && nano vars

Редактируем, приводим примерно к такому виду:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="Leningradskaya"
export KEY_CITY="Saint-Petersburg"
export KEY_ORG="Nixman"
export KEY_EMAIL="info@nixman.info"

Инициируем наши переменные и, на всякий случай, очищаем папку keys (на случай, если там случайно оказались чужие ключи ;)). Будьте внимательны – после выполнения clean-all, если вы уже генерировали ключи для клиентов, их придется переделывать заново, как и ключ сервера.

# source ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

# ./clean-all

А этой командой мы создаем корневой сертификат CA, которым будем подписывать наши ключи. Если он у вас уже есть (например, корпоративный) то этот шаг можно пропустить.
# ./build-ca

Теперь создаем ключи сервера:
# ./build-key-server server

И клиентов (повторить сколько потребуется):
# ./build-key user

Генерируем ключи DH и TLS:
# ./build-dh
# openvpn --genkey --secret keys/ta.key

Теперь копируем наши ключи сервера в папку с openvpn:

# cd keys && cp server.crt server.key ca.crt dh1024.pem ta.key /etc/openvpn/

Клиенту копируем (если это обычный linux-клиент):
# cd keys && cp user.crt user.key ca.crt ta.key home/snake/openvpn
Если в качестве клиента выступает микротик, то нужны только файлы user.crt и user.key

Моя конфигурация выглядит вот так:
nano /etc/openvpn/server.conf

port 1194
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh1024.pem
server 10.0.0.0 255.255.0.0
ifconfig-pool-persist ipp.txt
client-config-dir /etc/openvpn/staticlients
keepalive 10 120
cipher AES-128-CBC # AES
persist-key
persist-tun
status openvpn-status.log
log openvpn.log
log-append openvpn.log
verb 4

Связано это с тем, что она заточена под клиенты-микротики, которые не умеют компрессию, работу поверх udp и еще несколько “фишек” обычного vpn-клиента.

Наконец, последний штрих:

cd /etc/openvpn
mkdir staticlients

Здесь будут размещаться файлы с ip наших клиентов.

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

Остановлюсь, на минутку, на настройке клиента. Клиентом у нас будет выступать Mikrotik, и его конфигурация будет, примерно, такая (будем считать, что ключ и сертификат вы на микротик уже поставили.

/interface ovpn-client
add cipher=aes128 connect-to=$srv name=hs-ovpn-$project user=$project certificate=[/certificate find common-name="$name"]

Обещанный бонус

Теперь мы для каждого пользователя сгенерируем свой сертификат и ключ буквально одним взмахом
Обратите внимание: здесь мы явно указываем, какой ip будет выдан пользователю. Это может быть полезно в ряде случаев, хотя чаще всего совершенно не требуется. Скрипт при этом упрощается.

#! /bin/bash
# Script to automate creating new OpenVPN clients
# The client cert and key, along with the CA cert is
# zipped up and placed somewhere to download securely
#
# H Cooper - 05/02/11
# Snake - 18/09/15
#
# Usage: new-openvpn-client.sh

# Set where we're working from
OPENVPN_RSA_DIR=/etc/openvpn/easy-rsa/
OPENVPN_KEYS=$OPENVPN_RSA_DIR/keys
KEY_DOWNLOAD_PATH=/var/www/vhosts/site/cfg
HSPOT_PATH=/opt/hotspot/var
# Either read the CN from $1 or prompt for it
if [ -z "$1" ]
then echo -n "Enter new client common name (CN): "
read -e CN
else
CN=$1
fi

# Ensure CN isn't blank
if [ -z "$CN" ]
then echo "You must provide a CN."
exit
fi

# Enter the easy-rsa directory and establish the default variables
cd $OPENVPN_RSA_DIR
# Check the CN doesn't already exist
if [ -f $OPENVPN_KEYS/$CN.crt ]
then echo "WARN: certificate with the CN $CN alread exists!"
echo " $OPENVPN_KEYS/$CN.crt"
else
source ./vars > /dev/null

# Copied from build-key script (to ensure it works!)
echo "Generating keys..."
export EASY_RSA="${EASY_RSA:-.}"
"$EASY_RSA/pkitool" --batch $CN

fi
# Take the new cert and place it somewhere it can be downloaded securely
#echo "Zip and moving"
zip -q $KEY_DOWNLOAD_PATH/$CN.zip keys/$CN.crt eys/$CN.key

# Write information about ip
echo "ifconfig-push $2 10.0.0.1" > /etc/openvpn/staticlients/$1
# Celebrate!

Скрипт простой, но, на всякий случай, поясню:
1. Принимаем два параметра – имя клиента и желаемый IP. IP берем не с потолка, а только тот, который согласуется с маской сети и адресом сервера, которые мы указали в server.conf
2. Сгенерированные ключи помещаются в zip-архив и копируются в KEY_DOWNLOAD_PATH. Это может быть, например, папка на сайте (только обязательно включите хотя бы basic-авторизацию по паролю), либо папка ftp-сервера, откуда можно эти ключи передать клиенту.
3. IP клиента записывается в специальный файлик в папке staticlients.

Leave a Reply