За основу была взята статья, размещенная на хабре. Этот пост призван упростить установку OpenVPN сервера. отделив теорию от практики. Кроме того. на момент прочтения статьи я не понимал от какого пользователя должны были выполняться те или иные команды. Понятно, что # – root, а $ пользователь. Но $ – принадлежит какому пользователю? А еще мне нужно было разместить весь функционал в пределах одиного сервера. Я настоятельно рекомендую всё же прочитать и попытаться понять статью ибо лишним явно не будет.
И так, Устанавливаем сервер. ОС не имеет значения (винда не в счёт) ибо дело вкуса. Я выбрал Ubuntu LTS 14.04.3 на тот момент являющаяся последним стабильным релизом.
1 2 3 4 5 6 |
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.3 LTS Release: 14.04 Codename: trusty |
Обновляемся и устанавливаем необходимые пакеты.
1 2 3 |
# apt-get update # apt-get upgrade # apt-get install vim openvpn unzip ntpdate ntp wget -y |
Настраиваем синхронизацию времени
1 2 3 |
# /etc/init.d/ntp stop # ntpdate pool.ntp.org # /etc/init.d/ntp start |
Создаем три пользователя. vpnoperator, ca, openvpn
1 2 3 |
# adduser ca # adduser vpnoperator # adduser --system --no-create-home --home /nonexistent --disabled-login --group openvpn |
Создаем каталог для обмена ключами, который заменит нам флешку и отдаем его пользователю ca
1 2 |
# mkdir fflash # chown -R ca:ca /fflash |
Добавим в файловую систему два каталога для логов и индивидаульных настроек пользователей:
1 2 |
# mkdir /var/log/openvpn/ # mkdir /etc/openvpn/ccd |
Приводим файл openssl.cnf к такому виду:
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 |
# vim /etc/openvpn/openssl.cnf [ ca ] default_ca = CA_default [ CA_default ] dir = /etc/openvpn crl_dir = $dir database = $dir/index.txt new_certs_dir = $dir certificate = $dir/ca.crt serial = $dir crl = $dir/crl.pem private_key = $dir/server.key RANDFILE = $dir/.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 |
Замените в данном файле следующие ключи на те данные, которые используются в вашей организации:
1 2 3 4 |
organizationName = organizationName_default = organizationalUnitName = commonName = |
Редактируем файл openvpn.conf
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 |
# vim /etc/openvpn/openvpn.conf port 20220 proto udp dev tun management localhost 7505 user openvpn group openvpn cd /etc/openvpn persist-key persist-tun tls-server tls-timeout 120 dh /etc/openvpn/dh.pem ca /etc/openvpn/ca.crt cert /etc/openvpn/vpn-server.crt key /etc/openvpn/server.key crl-verify /etc/openvpn/crl.pem tls-auth /etc/openvpn/ta.key 0 server 192.168.79.0 255.255.255.0 client-config-dir /etc/openvpn/ccd client-to-client topology subnet max-clients 200 push "dhcp-option DNS 192.168.10.103" route 192.168.79.0 255.255.255.0 comp-lzo keepalive 10 120 status /var/log/openvpn/openvpn-status.log 1 status-version 3 log-append /var/log/openvpn/openvpn-server.log verb 3 mute 20 |
Генерим сертификаты, необходимые для работы openVPN:
1 2 3 4 5 6 7 8 9 10 |
# su ca $ cd $ wget https://github.com/OpenVPN/easy-rsa/archive/master.zip && unzip master.zip $ cd /home/ca/easy-rsa-master/easyrsa3 $ ./easyrsa init-pki $ ./easyrsa build-ca nopass $ cp /home/ca/easy-rsa-master/easyrsa3/pki/private/ca.crt /fflash $ ./easyrsa gen-crl $ cp /home/ca/easy-rsa-master/easyrsa3/pki/crl.pem /flash $ exit |
1 2 3 4 5 6 7 |
# su vpnoperator $ cd $ wget https://github.com/OpenVPN/easy-rsa/archive/master.zip && unzip master.zip $ cd /home/vpnoperator/easy-rsa-master/easyrsa3 $ ./easyrsa init-pki $ ./easyrsa gen-req server $ exit |
Увидим что-то типа:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Generating a 2048 bit RSA private key ...............................................................................................................+++ ....................................+++ writing new private key to '/home/vpnoperator/easy-rsa-master/easyrsa3/pki/private/server.key' Enter PEM pass phrase:****** Verifying - Enter PEM pass phrase:****** ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Common Name (eg: your user, host, or server name) [server]: vpn-server Keypair and certificate request completed. Your files are: req: /home/vpnoperator/easy-rsa-master/easyrsa3/pki/reqs/server.req key: /home/vpnoperator/easy-rsa-master/easyrsa3/pki/private/server.key |
Важно запомнить, что напишите тут: Common Name (eg: your user, host, or server name) [server]:
1 2 3 4 5 6 7 8 9 |
# cp /home/vpnoperator/easy-rsa-master/easyrsa3/pki/reqs/server.req /fflash # chown -R ca:ca /fflash # su ca $ cd /home/ca/easy-rsa-master/easyrsa3 $ ./easyrsa import-req /fflash/server.req vpn-server $ ./easyrsa sign-req server vpn-server $ cp /home/ca/easy-rsa-master/easyrsa3/pki/issued/vpn-server.crt /fflash/ $ ./easyrsa gen-dh $ cp /home/vpnoperator/easy-rsa-master/easyrsa3/pki/dh.pem /fflash |
1 2 3 4 5 6 7 8 9 |
# cd /etc/openvpn # openvpn --genkey --secret ta.key # cp ta.key /fflash # chown -R ca:ca /fflash # mv crl.pem /etc/openvpn # mv dh.pem /etc/openvpn # mv server.key /etc/openvpn # mv vpn-server.crt /etc/openvpn # chown -R openvpn:openvpn /etc/openvpn |
Должно получиться что-то типа:
1 2 3 4 5 6 7 8 9 10 11 12 |
# ls -l /etc/openvpn итого 44 -rw------- 1 openvpn openvpn 1155 дек. 31 02:19 ca.crt drwxr-xr-x 2 openvpn openvpn 4096 янв. 5 14:13 ccd -rw------- 1 openvpn openvpn 654 дек. 31 11:15 crl.pem -rw------- 1 openvpn openvpn 424 дек. 31 02:22 dh.pem -rw-r--r-- 1 openvpn openvpn 987 дек. 30 15:18 openssl.cnf -rw-r--r-- 1 openvpn openvpn 740 янв. 2 14:35 openvpn.conf -rw------- 1 openvpn openvpn 1704 дек. 31 02:21 server.key -rw------- 1 openvpn openvpn 636 дек. 30 16:16 ta.key -rwxr-xr-x 1 openvpn openvpn 1301 дек. 2 2014 update-resolv-conf -rw------- 1 openvpn openvpn 4358 дек. 31 02:45 vpn-server.crt |
1 2 3 4 |
# ls -l /fflash/ итого 28 -rw------- 1 ca ca 1155 дек. 31 02:17 ca.crt -rw------- 1 ca ca 636 дек. 31 00:36 ta.key |
Пришло время запустить первый раз наш сервер:
1 |
# /etc/init.d/openvpn start |
Проверяем стартанул ли наш сервер:
1 2 3 4 5 6 7 8 |
# ifconfig tun0 tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:192.168.79.1 P-t-P:192.168.79.1 Mask:255.255.255.0 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:7842816 errors:0 dropped:0 overruns:0 frame:0 TX packets:6596474 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:1980562597 (1.9 GB) TX bytes:2535715140 (2.5 GB) |
Сервер у меня находится за NAT-ом и не имеет публичного IP адреса. Но пользователю мы будем отдавать в конфиге публичный адрес: 44.214.1.11 (здесь в тексте, фейковый, можете не пытаться подключиться) >8)
Если нет, лезем в /var/log/openvpn/openvpn-server.log и смотрим в чём порылась собака.
И так. Сервер запущен и работает. Настало время создать пользователя. Признаться, по началу я просто терялся в каталогах, путях, системных пользователях, когда собирал нужные файлы для пользователя. Потом привык, запомнил. Но стоило мне отвлечься на пару недель за ненадобностью создания нового пользователя, как всё забывалось… Склероз, мать его… По этому я написал специально обученные скрипты для создания и удаления пользователей.
Для добавления пользователей:
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 |
# vim /root/add_vpn_user.sh #!/bin/bash if [ -z $1 ]; then echo "Usage: ./add_vpn_user.sh <USERNAME>" exit 1 else mkdir /fflash/$1 cd /home/vpnoperator/easy-rsa-master/easyrsa3/ && sudo -u vpnoperator ./easyrsa gen-req $1 nopass cp /home/vpnoperator/easy-rsa-master/easyrsa3/pki/reqs/$1.req /fflash/$1/ chown ca:ca /fflash/$1/* cd /home/ca/easy-rsa-master/easyrsa3/ && sudo -u ca ./easyrsa import-req /fflash/$1/$1.req $1 sudo -u ca ./easyrsa sign-req client $1 cp /home/ca/easy-rsa-master/easyrsa3/pki/issued/$1.crt /fflash/$1/ cp /home/vpnoperator/easy-rsa-master/easyrsa3/pki/private/$1.key /fflash/$1 cp /fflash/ca.crt /fflash/$1/ cp /fflash/ta.key /fflash/$1/ CONF_FILE_PATH=/fflash/$1/$1.ovpn touch $CONF_FILE_PATH echo "client" > $CONF_FILE_PATH echo "dev tun" >> $CONF_FILE_PATH echo "proto udp" >> $CONF_FILE_PATH echo "remote 44.214.1.11 20220" >> $CONF_FILE_PATH # Public IP address of the server echo "tls-client" >> $CONF_FILE_PATH echo "ca \"ca.crt\"" >> $CONF_FILE_PATH echo "cert \"$1.crt\"" >> $CONF_FILE_PATH echo "key \"$1.key\"" >> $CONF_FILE_PATH echo "tls-auth \"ta.key\" 1" >> $CONF_FILE_PATH echo "comp-lzo" >> $CONF_FILE_PATH echo "tun-mtu 1500" >> $CONF_FILE_PATH echo "mssfix 1450" >> $CONF_FILE_PATH echo "verb 3" >> $CONF_FILE_PATH rm /fflash/$1/$1.req fi exit 0 |
Пример использования:
1 2 |
# cd /root # ./add_vpn_user.sh developer |
После выполнения данного скрипта будет создан каталог по имени пользователя в /fflash в который, в свою очередь, будут помещены созданные для нового пользователя файлы и сертификаты. Файлы ta.key и ca.crt в корне /fflash общие для всех пользователей. По этому они оставлены в данном каталоге за тем, чтобы при создании нового пользователя быть скопированными скриптом в каталог вновь создаваемого пользователя.
1 2 3 4 5 6 7 8 9 10 |
# tree /fflash/ /fflash/ ├── ca.crt ├── developer │ ├── ca.crt │ ├── developer.crt │ ├── developer.key │ ├── developer.ovpn │ └── ta.key └── ta.key |
Нам остаётся создать пользовательский файл настроек, заархивировать каталог /fflash/developer и отдать файл пользователю.
1 2 3 4 5 6 |
# vim /etc/openvpn/ccd/developer ifconfig-push 192.168.79.2 255.255.255.0 push "route 192.168.1.0 255.255.255.0" push "route 192.168.2.0 255.255.255.0" push "route 192.168.6.0 255.255.192.0" |
Тут мы присваиваем аккаунту developer статический IP адрес 192.168.79.2 и отдаём необходимые этому пользователю маршруты.
Для удаления пользователя:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# /root/del_vpn_user.sh developer #!/bin/bash if [ -z $1 ]; then echo "Usage: ./del_vpn_user.sh <USERNAME>" && exit 1 else cd /home/ca/easy-rsa-master/easyrsa3 sudo -u ca ./easyrsa revoke $1 || echo "ERROR. Cant revoke $1 certificate"$1 && exit 1 sudo -u ca ./easyrsa gen-crl || echo "ERROR. Cant generate crt bloch file." && exit 1 cp -f /etc/openvpn/crl.pem /etc/openvpn/crl.pem.bk cp -f /home/ca/easy-rsa-master/easyrsa3/pki/crl.pem /etc/openvpn/ && chown openvpn:openvpn /etc/openvpn/* mv /fflash/$1 /fflash/!$1 rm /home/ca/easy-rsa-master/easyrsa3/pki/issued/$1.crt rm /home/ca/easy-rsa-master/easyrsa3/pki/reqs/$1.req rm /home/vpnoperator/easy-rsa-master/easyrsa3/pki/private/$1.key rm /home/vpnoperator/easy-rsa-master/easyrsa3/pki/reqs/$1.req fi exit 0 |
Каталог удаленного пользователя будет перемещён из /fflash/developer в /fflash/!developer. А файл отозванных сертификатов crl.pem будет скопирован в crl.pem.bk для того, чтобы можно было вернуть работоспособность ошибочно удаленному аккаунту пользователя.
Стоит отметить, что если в момент замещения файла отозванных сертификатов пользователь был подключен к системе, то он продложит работу до тех пор, пока не произойдет переподключение по любым известным причинам. Если нам необходимо немедленно ограничить доступ конкретного пользователя к приватной сети, то можно воспользоваться консолью управления:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# telnet localhost 7505 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. >INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info status TITLE OpenVPN 2.3.2 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [eurephia] [MH] [IPv6] built on Dec 1 2014 TIME Thu Jan 7 14:53:26 2016 1452167606 HEADER CLIENT_LIST Common Name Real Address Virtual Address Bytes Received Bytes Sent Connected Since Connected Since (time_t) Username CLIENT_LIST developer 19.148.36.72:42543 192.168.79.2 1874548037 1946562690 Sun Jan 3 12:27:54 2016 1451813274 UNDEF ROUTING_TABLE 192.168.79.2 developers 19.148.36.72:42543 Thu Jan 7 14:53:26 2016 1452167606 GLOBAL_STATS Max bcast/mcast queue length 1 |
а дальше используем одну из команд:
1 2 3 |
kill cn : Kill the client instance(s) having common name cn. kill IP:port : Kill the client instance connecting from IP:port. quit |
Have a nice day, как говорит OpenSuSE. 8)
[…] многие скажут: — «Зачем mpd, если есть openvpn«?Я не буду отвечать на этот вопрос, дабы понимаю, что […]