Создание сертификата клиента и пары ключей
Нам нужно будет создать каталог для хранения сертификатов и ключей клиентов. Обязательно предоставьте разрешение пользователю, не являющемуся пользователем root.
Сгенерируйте запрос на сертификат клиента:
Ответ в терминале:
Теперь скопируйте клиентский ключ в каталог client-configs:
Скопируйте файл запроса сертификата клиента на сервер центра сертификации:
На сервере центра сертификации импортируйте CSR:
Теперь мы должны подписать запрос для клиента, набрав:
Ответ в терминале:
Скопируйте сертификат клиента на сервер openvpn:
Теперь на сервере openvpn нам нужно скопировать все клиентские файлы в каталог клиента, который мы создали ранее.
Убедитесь в том, что пользователь не является root и имеет разрешения на файлы.
Описание команд и параметров
Каждый параметр (man openvpn) имеет свое значение и описание. Рассмотрим их более детально:
- client – означает, что конфигурационным файлом описывается подключение клиента, то есть установлено соединение самой программой, при этом ожидание от сервера исключено;
- dev (tap и tun) – используется для выбора виртуального сетевого драйвера. Значение tun указывает на сетевой уровень модели OSI, а tap требуется для эмуляции Ethernet устройства и работы на канальном уровне модели OSI;
- dev-node – актуален для систем Виндовс, когда присутствует несколько сетевых интерфейсов. В параметре должно быть название сетевого подключения для OpenVPN;
- proto (udp или tcp) – определение протокола, используемого для информационной передачи. Как правило, используется именно udp, поскольку он меньше загружает сеть;
- remote (VPN-сервер и порт) – указывает на сервер для клиентского подключения, а также на порт, в рамках которого принимаются запросы для OpenVPN;
- remote-random – необходимость подключения к удаленным серверам рандомно;
- resolv-retry (секунды или infinite) – сервер имеет доменное имя, а сам параметр задается в секундах для повторного подключения. Infinite означает постоянную связь с сервером;
- nobind – применение динамического порта для подключения;
- user – выбор конкретного пользователя для клиентской работы;
- group – выбор определенной группы для клиентской работы;
- persist-key – исключает перечитывание ключей, если перезагружается сервис OpenVPN;
- persist-tun – исключает перечитывание параметров туннеля при перезагрузке сервиса OpenVPN;
- http-proxy – использование прокси для установки подключения;
- http-proxy-retry – в случае разрыва связи переподключение к прокси;
- http-proxy-timeout – временной интервал, через который начинается переподключение;
- mute-replay-warnings – актуален при беспроводном соединении, поскольку отключается дублирование пакетных предупреждений;
- ca – корневой сертификат, генерация происходит на сервере;
- cert – открытый клиентский ключ, генерация происходит на сервере;
- key – закрытый клиентский ключ, генерация происходит на сервере;
- dh – ключ с алгоритмом Диффи-Хеллмана;
- remote-cert-tls – защита от mitm атаки с учетом верификации сертификата сервера;
- tls-client – определяет клиента TLS;
- tls-auth (ta.key 1) – дополнительный уровень идентификации с помощью tls;
- float – можно изменить IP удаленным хостом во время соединения, если оно не разрывается;
- keepalive (секунды) – пинговка через определенное количество секунд и перезапуск подключения, если в течение какого-либо времени не принимаются ответные пакеты;
- cipher – алгоритм шифрования;
- comp-lzo – применение сжатия;
- verb (0-9) – уровень детализации лога;
- mute – сколько лог-сообщений отображается в каждой категории;
- auth-user-pass – необходимость провести аутентификацию;
- ipchange – выполнение команды при смене адреса IP;
- connect-retry – через какое время переподключаться к серверу, если был разрыв соединения;
- connect-retry-max – количество повторений соединения при его разрыве;
- shaper – определение максимальной скорости передачи данных для исходящего потока;
- tun-mtu – задает MTU;
- status – путь к файлу статусного хранения;
- log – путь к лог-файлу.
Абсолютно все команды OpenVPN с соответствующими параметрами по OpenVPN для ОС Windows и Linux вы можете получить, воспользовавшись опцией openvpn —help.
Аутентификация пользователей
Позволяет требовать от пользователя ввод логина и пароля при каждом подключении. Также идентификация каждого пользователя необходима для уникальной идентификации каждого из них и выдачи разных IP-адресов.
Настройка на сервере
Открываем конфигурационный файл openvpn:
vi /etc/openvpn/server.conf
И добавляем следующие строчки:
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so login
tmp-dir /etc/openvpn/tmp
* где:
- plugin — путь до библиотеки проверки введенных логина и пароля. Как путь, так и название файла openvpn-plugin-auth-pam.so могут отличаться. Это зависит от версии Linux и OpenVPN. Чтобы найти путь до нужного файла, можно воспользоваться командой find / -name «openvpn-*auth-pam*» -print.
- tmp-dir — указание пути до директории хранения временных файлов. Если не указать, то будет использоваться /tmp, однако, на практике это может привести к ошибке Could not create temporary file ‘/tmp/openvpn_<набор символов>.tmp’: No such file or directory (errno=2).
Перезапускаем сервер:
systemctl restart openvpn@server
Создаем учетную запись для авторизации:
useradd vpn1 -s /sbin/nologin
passwd vpn1
В конфигурационный файл клиента добавляем:
auth-user-pass
Можно пробовать подключаться.
Вход без ввода пароля
Если необходимо настроить авторизацию, но автоматизировать вход клиента, открываем конфигурационный файл последнего и строку для авторизации меняем на:
auth-user-pass auth.txt
* где auth.txt — файл, в котором мы будем хранить логин и пароль.
Создаем текстовый файл auth.txt в той же папке, где находится файл конфигурации со следующим содержимым:
username
password
* где username — логин пользователя, а password — пароль.
Переподключаем клиента.
Описанный метод аутентификации является базовым и требует наличие обычной системной учетной записи. Если необходима более сложная авторизация на базе LDAP, можно воспользоваться инструкцией
настройка OpenVPN сервера с аутентификацией через LDAP (написана на базе Linux Ubuntu).
How Does It Work?
Initialize the volume container using the image with the
included scripts to automatically generate:
- Diffie-Hellman parameters
- a private key
- a self-certificate matching the private key for the OpenVPN server
- an EasyRSA CA key and certificate
- a TLS auth key from HMAC security
The OpenVPN server is started with the default run cmd of
The configuration is located in , and the Dockerfile
declares that directory as a volume. It means that you can start another
container with the argument, and access the configuration.
The volume also holds the PKI keys and certs so that it could be backed up.
To generate a client certificate, uses EasyRSA via the
command in the container’s path. The environmental
variables place the PKI CA under .
Conveniently, comes with a script called ,
which dumps an inline OpenVPN client configuration file. This single file can
then be given to a client for access to the VPN.
To enable Two Factor Authentication for clients (a.k.a. OTP) see this document.
Регистрация на DigitalOcean
Лучше всего регистрироваться по реферальной ссылке — тогда будет автоматически применён промокод на $10. А можно зарегистрироваться заполнив форму на главной странице и позже ввести любой промокод — он легко ищется через google. Их много разных и все по $10.
После нажатия на кнопку, придет письмо с ссылкой для подтверждения регистрации — по ней нужно будет перейти.
Далее нужно ввести данные кредитной карты, либо PayPal. Это обязательное требование для подтверждения аккаунта. PayPal есть практически у каждого.
После нажатия на кнопку подтверждения, запустится стандартный процесс оплаты. Но есть важная особенность, которая позволит немного сэкономить: ваш банк конвертирует рубли в доллары по более выгодному курсу, нежели PayPal
Нужно нажать и выбрать вариант
После окончания оплаты, вы попадете на главную страницу . Можно перейти в -> чтобы посмотреть баланс.
Здесь — внесенный аванс. А — сумма, которую нужно оплатить. Оплата обычно производится по факту — сколько потратили за месяц, столько вас и попросят оплатить(после исчерпания аванса). В самом низу можно посмотреть, какие были начисления.
Установка и настройка сервера Openvpn
Давайте перейдем ко второму серверу, чтобы установить и настроить openvpn. Вам также потребуется создать некорневого пользователя на этом сервере и предоставить ему соответствующие привилегии.
Чтобы установить openvpn на ubuntu, выполните следующие команды:
На сервере openvpn утилита easyrsa будет использоваться для генерации запроса сертификата, который будет проверен и подписан сервером центра сертификации (ЦА). Выполните те же действия, что и в предыдущем разделе, чтобы установить Easyrsa.
Теперь распакуйте загруженный файл tgz:
Ограничьте доступ только пользователю:
Переместите EasyRSA-3.0.8 в каталог:
Using OpenVPN
Enter the container:
# pct enter 123
You should now see the container shell prompt.
root@CT123:~# ls -l /dev/net/tun crw-rw-rw- 1 root root 10, 200 Dec 22 12:26 /dev/net/tun
If you see root:root inside the container and 100000:100000 outside the container, it’s correct. (This is because the unprivileged userid 100000 on your host is mapped to ‘root’ user of the container)
Update packages and install openvpn:
root@CT123:~# apt update root@CT123:~# apt dist-upgrade root@CT123:~# apt install openvpn git
Answer the setup wizard questions according to your setup.
At the end you should receive a message like this:
Finished! The client configuration is available in: /root/client.ovpn New clients can be added by running this script again.
If everything worked, then the service should be started and enabled by the setup script.
Verify service is working:
root@CT123:~# systemctl | grep openvpn openvpn-iptables.service loaded active exited openvpn-iptables.service [email protected] loaded active running OpenVPN service for server system-openvpn\x2dserver.slice loaded active active system-openvpn\x2dserver.slice root@CT123:~# ps aux | grep vpn nobody 136 0.0 1.3 11780 6844 ? Ss 14:41 0:00 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --config server.conf
Congratulations! You now have an unprivileged Debian container running OpenVPN!
Основа
LXC это набор инструментов для контейнеризации целых ОС, в отличии от Докера, который больше заточен под релизы и тесты для разработчиков, тут больше пространства для маневра, без надобности вдаваться сильно в зависимости и синтаксис конфигурационных файлов. Серьезно, для домашних служб Докер монстровато выглядит. Ладно, хватит субъективностей, раз я LXC выбрал, расскажу тут все полезное, что раскопал, пока строил заново домашние сервисы на новой платформе.
Первое, что и очень важное, это выбор хостовой системы для нашего контейнерного парка. К слову, я пробовал реализации lxc/lxd на debian, arch, centos, ubuntu, и выиграл по многим параметрам по моему мнению ubuntu 18.04 LTS
Не буду тут все расписывать подробно за и против, решайте сами что кому по душе.
Итак, я установил хостовую систему ubuntu 18.04 LTS. Настроил по своему вкусу безопасность и остальное, что мы там любим настроить на свежей системе. Перейдем к делу.
Как это работает ?
При инициализации плагина в OpenVPN, плагин возвращает масочный список всех функций, которые может обслужить. При наступлении очередной фазы подключения или внутреннего события, OpenVPN вызывает соответствующие функции из плагина. Плагин преобразует переменное окружение и параметры переданные функции в структуру, инициализирует python и передаёт структуру в соответствующую процедуру python модуля. Процедура возвращает плагину один из трёх ответов (0 — Success, 1 — Error, 2 — Deferred). Ответ транформируется и возвращается OpenVPN.
Обратите внимание, что все вызовы модуля являются «stateless», это означает, что процедуры не помнят и не знают, что происходило ранее в других вызовах. Ориентироваться можно только на переменное окружение передаваемое плагину из OpenVPN
Внутри python модуля вы можете реализовать любую логику, подключая нужные библиотеки и ресурсы. Если вы не уверены в скорости выполнения проверок, то используйте «отложенные» подтверждения.
Используя группировку пользователей подключаемых к сервису, через pf_file можно довольно тонко настроить сетевое взаимодействие между пользователями и другими ресурсами. В свою очередь подключив плагин на мониторинг, всегда можно будет через management интерфейс OpenVPN управлять сессиями клиентов.
Во время тестирования проекта был разработан механизм генерации паролей, аналогичный jwt токенам, но имеющим меньший размер.
Суть проста. Токен содержит в себе идентификатор клиента и срок окончания доступа. Для подписи токена используется HMAC_SHA1 с закрытым ключом. После подписи токена, текстовое содержимое ксорится подписью и конвертится в base64. Таким образом получается «запечатывание» токена. «Запечатанный» токен используется в качестве пароля пользователя. При несанкционированном изменении блока с данными, поломается xor, если поломается xor, значит поломается проверка подписи. Без закрытого ключа подпись изменить не получится.
Если вы не хотите руками контролировать время действия пароля, то генерируете такой токен, и проверяете его на валидность внутри плагина, не вызывая внешние сервисы. Данная схема очень удобна для сессионной генерации паролей на определенное время. При этом вы можете во внешнюю систему управления передать содержимое токена и она сама настроится на отключение пользователя по окончании действия токена.
Надеюсь информация в данной статье была вам полезна.
Спасибо за потраченное на её прочтение время.
Если есть вопросы, попробую ответить на что смогу.
Проверка туннеля
Поздравляем! Теперь ваш OpenVPN сервер или клиент должен быть в рабочем состоянии. Однако возможно, что сервер до сих пор не может отправлять трафик клиентам, так как всё ещё не настроена маршрутизация. Перед настройкой маршрутизации вы должны убедиться, что клиенты могут связаться с сервером.
Проверьте соединение в соответствии с инструкциями вашей ОС.
На OpenWrt это можно сделать с помощью команды traceroute.
Традиционный (TUN) Сервер
Проверьте соединение, введя команду:
traceroute 10.8.0.1
Тем не менее соединение с интернетом не будет идти через OpenWrt сервер без соответствующих маршрутов
traceroute 8.8.8.8 #Google-DNS сервер
После проверки работоспособности соединения вам нужно настроить встраивание маршрутов клиентам.
Server-Bridge (TAP) Server
Трафик внутри локальной подсети (192.168.7.XXX) будет маршрутизироваться через VPN без какой-либо дальнейшей настройки. Остальной трафик будет маршрутизироваться на шлюз по умолчанию. Для пинга клиента используйте:
traceroute 192.168.7.100 #Пример IP. Укажите IP вашей подсети.
Если вам требуется только доступ к интрасети и не требуется направлять обычный интернет-трафик (WAN) через VPN, ваша конфигурация завершена!
Client
Unless the OpenVPN option route-nopull was specified by the client, routes pushed by the server should be in place. If route-nopull was used, only the server will be accessible. Using traceroute on any address with a route pushed by the server should result in that traffic being sent through the VPN, while other addresses should be sent through the default gateway.
The OpenVPN gateway can generally be found on *nix systems using:
ifconfig tun0
And you can then test it using:
traceroute 10.8.0.1 #Arbitrary example IP
If you are not using route-nopull, then your configuration should now be complete!
Creating the Container
Firstly you need to download the Debian container template.
# pveam update # pveam available | grep debian-10-standard system debian-10-standard_10.7-1_amd64.tar.gz # pveam download local debian-10-standard_10.7-1_amd64.tar.gz
After the download is finished, create the container:
# pct create 123 local:vztmpl/debian-10-standard_10.7-1_amd64.tar.gz --unprivileged 1 --net0 name=eth0,bridge=vmbr0,firewall=1,ip=dhcp,type=veth --storage local-lvm
After container is created, you need to edit the configuration file to add the /dev/net/tun device.
# pct config 123 arch: amd64 hostname: CT123 memory: 512 net0: name=eth0,bridge=vmbr0,firewall=1,hwaddr=FE:75:64:2A:A3:58,ip=dhcp,type=veth ostype: debian rootfs: local-lvm:vm-123-disk-0,size=4G swap: 512 unprivileged: 1
# nano /etc/pve/lxc/123.conf
Add the following lines at the end (if you’re using PVE < 7.0, change `cgroup2` with `cgroup`)
lxc.cgroup2.devices.allow: c 10:200 rwm lxc.mount.entry: /dev/net dev/net none bind,create=dir
Press Ctrl-X and answer «Y» for saving and press Enter.
For your unprivileged container to be able to access the /dev/net/tun from your host, you need to set the owner by running:
# chown 100000:100000 /dev/net/tun
Check the permissions are set correctly:
# ls -l /dev/net/tun crw-rw-rw- 1 100000 100000 10, 200 Dec 22 13:26 /dev/net/tun
Finally start the container:
# pct start 123
If you did everything correctly then the container should start.
Подключение клиента к OpenVPN-соединению
Установите openvpn клиент. Он будет использоваться для установки vpn-соединения с сервером
Теперь скопируйте клиентский файл OpenVPN, который находится на сервере. Копировать надо на клиентский компьютер. После этого на клиентском компьютере выполните следующую команду:
Перед редактированием конфигурационного файла клиента OpenVPN мы должны проверить, используем ли мы resolvconf или systemd-resolved для разрешения DNS
С этим значением он показывает, что вы используете systemd-resolved. Далее установите пакет, который поможет systemd-resolved использовать VPN для разрешения DNS при подключении.
Теперь мы можем отредактировать файл vpn-клиента, раскомментировав строки, необходимые для systemd-resolved
Для системы, использующей update-resolv-conf раскомментируйте строки
Теперь попробуем подключиться к VPN с помощью команды openvpn:
Вы можете проверить информацию ip для туннельного интерфейса
Эта команда покажет IP-адрес туннеля, и мы можем пингануть сервер OpenVPN. С помощью пинга вы поймете подключились вы на сервер или нет.
Создание сервера центра сертификации с помощью EasyRSA
Первое что требуется сделать это создать файл с именем для хранения информации об организации. Для этого мы можем использовать пример файла, доступного в каталоге EasyRSA-3.0.8.
Чтобы перечислить файлы в каталоге EasyRSA, используйте команду:
В терминале вы увидите следующий ответ:
Сделайте копию файла vars.example как vars:
Теперь откройте файл vars и добавьте информацию об организации в конец файла:
Теперь инициализируйте PKI на сервере центра сертификации. После инициализации сервер создаст папку pki.
Теперь мы можем создать корневую пару открытых и закрытых ключей для нашего ЦС. Во время этого процесса вас попросят ввести кодовую фразу для пары ключей. А так же она потребуется, когда вам нужно будет подписать или отозвать сертификат. Но в нашем случае мы будем использовать команду так, чтобы нам кодовая фраза не предлагалась. Вам также будет предложено указать Общее имя (CN), но мы оставим его по умолчанию, нажав клавишу Enter.
Это создаст корневой сертификат с именем ca.crt в каталоге pki и приватным ключом ca.key в каталоге pki/private.
Вот и все наш сервер центра сертификации готов!
Создание клиента
Создание ключей и сертификатов
Ключи клиента создаются на сервере
Переходим в созданную директорию, где и замёмся генерацией ключей и сертификатов
cd /etc/openvpn/easy-rsa/2.0
Загружаем переменные
source vars
Создаем ключ клиента
В данном случае название ключа — client. Каждый ключ должен быть со своим именем.
./build-key client
Если хотим защитить ключ паролем, то генерируем его другой командой
./build-key-pass client
В этом случае при запуске соединения нужно будет каждый раз вводить пароль на ключ.
Теперь нужно не забыть скопировать ключи (ca.crt, client.crt, client.key, ta.key) на клиента OpenVPN в /etc/openvpn/keys/
Если планируется на клиенте импортировать файл настроек .ovpn вместе с сертификатами и ключами, например, для Android, важно в конфигурации клиента исключить строку tls-auth, вместо нее добавить key-direction 1. В противном случае будет ошибка вида tls error: incoming packet authentication failed from
Создание файла конфигурации клиента
/etc/openvpn/client.conf
client dev tun proto udp # Внеший IP, на или за которым находится ваш сервер OpenVPN и порт (на сервере или роутере, за которым стоит сервер) remote 111.222.333.444 1194 # необходимо для DynDNS resolv-retry infinite ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/client.crt key /etc/openvpn/keys/client.key tls-client tls-auth /etc/openvpn/keys/ta.key 1 auth SHA1 cipher AES-256-CBC remote-cert-tls server comp-lzo persist-key persist-tun status openvpn-status.log log /var/log/openvpn.log verb 3 mute 20
ИЛИ единый файл конфигурации клиента client.ovpn с сертификатами и ключами для импорта
client dev tun proto udp # Внеший IP, на или за которым находится ваш сервер OpenVPN и порт (на сервере или роутере, за которым стоит сервер) remote 111.222.333.444 1194 # необходимо для DynDNS resolv-retry infinite tls-client # Строка tls-auth /etc/openvpn/keys/ta.key 1, как выше говорилось, заменяется на key-direction 1 auth SHA1 cipher AES-256-CBC remote-cert-tls server comp-lzo persist-key persist-tun verb 3 mute 20 # Далее идут сертификаты и ключи которые берутся из соответствующих файлов сгенерированных выше # Из ca.crt <ca> -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- </ca> # Из client.crt <cert> -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- </cert> # Из client.key <key> -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY----- </key> # Из ta.key <tls-auth> -----BEGIN OpenVPN Static key V1----- ... -----END OpenVPN Static key V1----- </tls-auth>
Можно запускать наш клиент OpenVPN
service openvpn restart
Настройка маршрутизации на стороне клиента
Машина с openvpn уже готова работать с сервером в чём можно убедится
ping -c 2 10.8.0.1 ping -c 2 192.168.1.100
Но для того, чтобы пользоваться туннелем в другой офис могли другие устройства в локальной сети нужно указать им, чтобы доступ в подсеть 192.168.1.0/24 осуществляется через 192.168.0.100. Или, что часто проще и быстрее прописать это правило маршрутизации на роутере, который является шлюзом для устройств в сети.
Возможности
Самая полезная часть статьи — рецепты, как и что можно использовать с помощью LXD
Поехали
Инициализация LXD
Первый запуск предупредит о том, что мы должны инициализировать через команду lxd_init систему контейнеризации, то есть указать начальные настройки. Запускаем и дальше как по мастеру. Отвечаем на вопросы по своему вкусу.
Положить/забрать файл из контейнера.
LXC предоставляет хорошие возможности для управления контейнерами «на лету». Вот так, например, можно поместить созданный на основном хосте файл внутрь контейнера:
Можно совершить и обратную операцию — загрузить файл из контейнера на основной хост:
Можно и редактировать файлы в контейнере напрямую:
Создать общий ресурс
Импорт различных образов
LXD основан на образах. Контейнеры создаются из образа, поэтому хранилище образов должно содержать несколько образов перед основной работой с LXD.
Есть несколько путей заполнить хранилище:
- Используя удаленный LXD как сервер образов
- Используя встроенные источники образов
- Вручную импортируя по одному
Связать с определннным мостом и задать статический IPv4 адрес
Кстати, очень удобный инструмент, позволяющий держать систему в нескольких или различных сетях на одном хосте, при этом в основной системе требуется для этого организовать лишь интерфейс типа мост, к которому потом прикрепляем контейнер и задаем внутреннее имя интерфейса.
Редактируем файл «/etc/default/lxc-net» и меняем
на
Переместить пул хранилища
Я люблю хранить все конфигурации в определенном мною месте, поэтому тут способ, как переместить дефолтное хранилище наиболее безболезненно.
Останавливаем LXD, перемещаем содержимое /var/lib/lxd в новую директорию, после этого делаем симлинк на новое место, и можно запускать LXD
Проброс устройств
Шикарная возможность, позволяющая пробрасывать устройства внутрь контейнера, основываясь на vendor/product id, так как многие usb устройства любят менять свой номер устройства на шине pci (в листинге вывода lsusb). Подробнее по параметрам .
Автозапуск контейнера при запуске основной системы
Флаг автозапуска и приоритеты запуска, для того, чтобы определить очередность запуска контейнеров и задержку перед запуском
Дополнительно
Про CPU
Чтобы ограничить контейнер любыми 2 процессорами:
Данная команда сработает на лету, чтобы в этом убедится посмотрим применилось ли наше ограничение
На определенных ядрах процессора, скажем, на втором и четвертом команда примет вид:
Более сложные закрепление с помощью диапазонов:
Чтобы ограничить процессорное время контейнера до 10% от общего числа, набираем вот такую команду:
Про память
Что бы ограничить выделяемую контейнеру память, необходимо набрать следующую команду:
Смотрим инфо про память:
Для отключения файла подкачки swap
Если вы хотите монтировать директорий с привилегиями пользователя хост машины, то на эту тему написана статья вот ссылка
Пошаговая инструкция установки и настройки OpenVPN клиента на Android
В данном разделе инструкции мы не будем рассматривать процедуру формирования ключей клиента и сервера сертификации. Вопрос организации сервера сертификации отдельная тема и мы предполагаем, что данную задачу, уважаемый читатель, рассматриваете как отдельная тема для изучения. Раздел статьи предполагает уже созданные клиентские, серверные ключи и сертификаты.
1) Первое что нам необходимо сделать — установить OpenVPN на ваше Android устройство. Для этого вам необходимо скачать приложение OpenVPN for Android из любого источника, например из Google play:
Установка OpenVPN через Google Play
2) После установки запускаем приложение и переходим в раздел импорта файлов конфигурации, ключей и сертификатов. Файл конфигурации, ключи и сертификаты должны быть заблаговременных скопированы в файловое пространство вашего Android устройства. Способов скопировать необходимые файлы масса, выбирайте самый безопасный для вас.
Запуск OpenVPN для Android.
3) Выбираем нужную директорию с файлом конфигурации, ключем и сертификатами. Жмем на файл конфигурации и кнопку «Выбрать».
Импорт файлов конфигурации,ключей и сертификатов для OpenVPN Android.
4) По результатам процедуры импорта клиент OpenVPN для Android автоматически сформирует файл конфигурации и включит в файл конфигурации ключ, сертификаты клиента и сервера.
Примем импорта файлов конфигурации,ключа и сертификатов.
5) На данном этапе импорт и базовая конфигурация OpenVPN клиента для Андроид является завершенной. В дальнейшем вы можете провести дополнительную тонкую настройку используя графический интерфейс клиента OpenVPN для Android или вручную прописать нужные конфигурации в файле конфигураций. По завершению процедуры импорта, мы рекомендуем вам удалить исходные файлы конфигурации, ключи и сертификаты для большей безопасности вашей приватной VPN сети.
Конфигурация OpenVPN для Android через графический интерфейс.
6) Если вы правильно сконфигурировали сервер и клиент OpenVPN, то далее мы подключаем наше устройство к серверу. Для подключения OpenVPN клиента к нашему серверу необходимо нажать на импортированную запись и дождаться статуса подключения SUCCESS. В трее Android устройств будет висеть ваша аналитическая информация о количестве переподключений, трафике VPN сети и прочая аналитическая информация.
Подключение в OpenVPN серверу на Android
Настройка OpenVPN-клиента
На сервере:
Переходим в каталог easy-rsa:
cd /etc/openvpn/easy-rsa
Создаем системные переменные, настроенные ранее в файле vars:
. ./vars
Создаем сертификат для клиента:
./easyrsa build-client-full client1 nopass
Вводим пароль, который указывали при создании корневого сертификата:
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key:
На сервере скопируем ключи во временную директорию, выполнив последовательно 3 команды:
mkdir /tmp/keys
cp pki/issued/client1.crt pki/private/client1.key pki/ca.crt pki/ta.key /tmp/keys
chmod -R a+r /tmp/keys
* сертификаты скопированы в каталог /tmp для удобства переноса их на клиентский компьютер.
На клиенте:
Заходим на официальную страницу загрузки openvpn и скачиваем клиента для Windows:
Запускаем скачанный файл и устанавливаем программу, нажимая «Далее».
Переходим в папку C:\Program Files\OpenVPN\config. И копируем в нее файлы ca.crt, client1.crt, client1.key, ta.key из каталога /tmp/keys на сервере, например, при помощи программы WinSCP.
После переноса файлов, не забываем удалить ключи из временного каталога на сервере:
rm -R /tmp/keys
Теперь возвращаемся к компьютеру с Windows, открываем блокнот от имени администратора и вставляем следующие строки:
client
resolv-retry infinite
nobind
remote 192.168.0.15 443
proto udp
dev tun
comp-lzo
ca ca.crt
cert client1.crt
key client1.key
tls-client
tls-auth ta.key 1
float
keepalive 10 120
persist-key
persist-tun
verb 0
* где 192.168.0.15 443 — IP-адрес OpenVPN-сервера и порт, на котором он принимает запросы.
* подробнее про настройку клиента OpenVPN.
Сохраняем файл с именем config.ovpn в папке C:\Program Files\OpenVPN\config.
Запускаем с рабочего стола программу «OpenVPN GUI» от имени администратора (это важно). Нажимаем правой кнопкой по появившемуся в трее значку и выбираем «Подключиться»:
Нажимаем правой кнопкой по появившемуся в трее значку и выбираем «Подключиться»:
Произойдет подключение и значок поменяет цвет с серого/желтого на зеленый.
Установка и настройка LXC
В этой инструкции мы будем настраивать LXC в Ubuntu, поскольку это самая популярная операционная система, но все эти команды подойдут для всех других дистрибутивов. Отличие составляет только команда установки. Сначала нужно установить все необходимое программное обеспечение. Установка LXC на Ubuntu выполняется командой:
Дальше нужно задать базовые настройки, которые будут применяться для создания сети в контейнерах и установки других параметров. Сначала создаем папку с конфигурацией:
Настроим пользовательские пространства имен. Первая цифра означает первый UID пользователя linux в контейнере, вторая отвечающий ему UID пользователя в основной системе:
Дальше настраиваем сеть в контейнере:
Затем в файле /etc/lxc/lxc-usernet нужно разрешить использовать сетевые интерфейсы текущему пользователю, чтобы получить возможность запускать контейнер без root прав:
Для того чтобы пространства имен пользователей linux в контейнере работали нужно присвоить своему пользователю подпространство UID и GID 100000-165536:
И даем права на использование данного пользователя в cgm:
Теперь первоначальная настройка завершена и мы готовы перейти к загрузке и установке образа контейнера. Для установки в интерактивном режиме наберите такую команду, здесь ubu1, это имя будущего контейнера:
В этом списке вам предстоит выбрать нужную операционную систему. Просто введите необходимые параметры, имя, релиз и архитектура, выбрав их из списка доступных, например, для Ubuntu Yakkety Yak 64 бит:
Затем начнется загрузка уже готового, настроенного образа из интернета. Это может занять довольно много времени если у вас медленный интернет.
Также вы можете использовать не интерактивный режим и указать все необходимые параметры сразу в командной строке:
После завершения загрузки контейнера первоначальная установка будет завершена и мы можем перейти дальше.