Задачка тривиальная, конечно, но пусть будет тут.
На авторство кода не претендую, но внес небольшие изменения “под себя”.
Интересующимся велкам под кат.
Проверяем возможность запуска tun-интерфейса
Если ваш хостер использует контейнеры OpenVZ, то, с вероятностью в 99%, запустить OpenVPN “из коробки” не получится. Все дело в том, что по умолчанию в OpenVZ не подключен модуль tun, его нужно включать руками. Проверить просто:
1 | ls -l /dev/net/tun |
Если вывод ничего не покажет – это повод задать вопрос своему хостеру (или подкрутить настройки контейнера).
Установка и настройка
1 | aptitude install openvpn openssl easy-rsa |
1 | cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/ |
Редактируем данные по-умолчанию, которые будут использоваться при генерации ключей:
1 | cd /etc/openvpn/easy-rsa/ && nano vars |
Редактируем, приводим примерно к такому виду:
1 2 3 4 5 | 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, если вы уже генерировали ключи для клиентов, их придется переделывать заново, как и ключ сервера.
1 2 | # source ./vars NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys |
1 | # ./clean-all |
А этой командой мы создаем корневой сертификат CA, которым будем подписывать наши ключи. Если он у вас уже есть (например, корпоративный) то этот шаг можно пропустить.
1 | # ./build-ca |
Теперь создаем ключи сервера:
1 | # ./build-key-server server |
И клиентов (повторить сколько потребуется):
1 | # ./build-key user |
Генерируем ключи DH и TLS:
1 | # ./build-dh |
1 | # openvpn --genkey --secret keys/ta.key |
Теперь копируем наши ключи сервера в папку с openvpn:
1 | # cd keys && cp server.crt server.key ca.crt dh1024.pem ta.key /etc/openvpn/ |
Клиенту копируем (если это обычный linux-клиент):
1 | # cd keys && cp user.crt user.key ca.crt ta.key home/snake/openvpn |
Если в качестве клиента выступает микротик, то нужны только файлы user.crt и user.key
Моя конфигурация выглядит вот так:
1 | nano /etc/openvpn/server.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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-клиента.
Наконец, последний штрих:
1 2 | cd /etc/openvpn mkdir staticlients |
Здесь будут размещаться файлы с ip наших клиентов.
Настройка Mikrotik-клиентов
Остановлюсь, на минутку, на настройке клиента. Клиентом у нас будет выступать Mikrotik, и его конфигурация будет, примерно, такая (будем считать, что ключ и сертификат вы на микротик уже поставили.
1 2 | /interface ovpn-client add cipher=aes128 connect-to=$srv name=hs-ovpn-$project user=$project certificate=[/certificate find common-name="$name"] |
Обещанный бонус
Теперь мы для каждого пользователя сгенерируем свой сертификат и ключ буквально одним взмахом
Обратите внимание: здесь мы явно указываем, какой ip будет выдан пользователю. Это может быть полезно в ряде случаев, хотя чаще всего совершенно не требуется. Скрипт при этом упрощается.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #! /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 <common-name> <ip-address> # 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.