- B. настройка сервера.
- Включение маршрутизации трафика на openvpn сервере
- Запуск.
- Настройка openvpn сервера
- Настройка уц
- Обход блокировок с помощью российских vps
- Создание ключей openvpn
- Создание ключей openvpn в debian, ubuntu, linux mint, kali linux
- Тестирование и запуск сервера openvpn
- Управление ключами и сертификатами openvpn в xca
- Управление пользователями
- Фильтрация доступных хостов для клиентов
- Отзыв сертификата
B. настройка сервера.
Переменная port – указываем UDP-порт (или TCP-порт, если вы сменили протокол в переменной proto, нужно только чтобы значение proto совпадало на сторонах клиента и сервера), который сервер будет слушать. Можно выбрать любое значение от 1025 до 65535, важно чтобы оно не конфликтовало с другим серверным софтом, если таковой имеется (или другими программами, которые могут быть привязаны к конкретному порту, например торрент-качалки).
Аналогично клиентским, переменные ключей и сертификатов:ca «C:\Program Files\OpenVPN\easy-rsa\keys\ca.crt» (сертификат СА один, клиенту и серверу указывается один и тот же)
cert «C:\Program Files\OpenVPN\easy-rsa\keys\<имя_сервера>.crt»
key «C:\Program Files\OpenVPN\easy-rsa\keys\<имя_сервера>.key»
Плюс ключ Диффи-Хелмана:dh «C:\Program Files\OpenVPN\easy-rsa\keys\dh1024.pem»
Переменная server. Определяет частную («серую») сеть, из диапазона которой будут выбраны IP-адреса для соединяемых компьютеров. При организации VPN средствами OpenVPN на сервере и на клиенте появляются новые виртуальные сетевые интерфейсы, которые винда, благодаря драйверам в комплекте, считает вполне полноценными реальными сетевыми картами. Их настройки и определяются этой переменной. В большинстве случаев можно оставить по умолчанию.
Остальные переменные так же можно не менять, упомяну еще только про переменную verb. Она определяет подробность логов, которые будут вестись на стороне сервера про все события и ошибки. Значение 1 – самый минимум подробности, значение 9 вас впечатлит.
5. Теперь необходимо расположить нужные файлы на сторонах сервера и клиента. Самый простой вариант – установить на каждой стороне программу и все файлы, настроенные по алгоритму выше, скопировать в соответствующие папки. Если подходить тщательно и канонично – на стороне клиента оставить только клиентские ключи, сертификаты и сертификат центра сертификации, удалив все, что касается СА и сервера, на стороне сервера удалить все клиентское. Разумно – предварительно забекапив.
Включение маршрутизации трафика на openvpn сервере
На данном этапе, если бы кто-то подключился к OpenVPN серверу, то он не сможет подключаться к глобальной сети. Чтобы это стало возможным нужно настроить маршрутизацию трафика.
Для этого создайте файл vpn_route.sh.
Обратите внимание, что я создаю скрипт в папке /root/bin/, если у вас её нет, то создайте её предварительно
mkdir /root/bin/
Если вы хотите разместить скрипт в другой папке, то отредактируйте последующие данные под свои.
Создаём файл:
vim /root/bin/vpn_route.sh
B этот файл скопируйте следующее содержимое, отредактировав его под свои нужды. Обратите внимание на:
- PRIVATE=10.8.0.0/24 – измените подсеть в соответствии с вашими настройками. Если делали по этой инструкции, то менять ничего не нужно.
- Укажите значение DEV! Впишите там имя вашего сетевого интерфейса. Это имя можно посмотреть командой
ip a
Если вы не впишите имя, то есть вероятность, что при загрузке компьютера скрипт не сможет автоматически получить имя сетевого интерфейса и поэтому маршрутизация трафика не будет работать правильно!
#!/bin/sh # укажите имя интерфейса, иначе скрипт попытается выбрать его автоматически #DEV='eth0' DEV='ens3' PRIVATE=10.8.0.0/24 if [ -z "$DEV" ]; then DEV="$(ip route | grep default | head -n 1 | awk '{print $5}')" fi # Включаем форвардинг пакетов, чтобы из туннельного интерфейса # они попадали на внешний интерфейс sysctl net.ipv4.ip_forward=1 # Убеждаемся, что iptables не блокируют перенаправляемый трафик: iptables -I FORWARD -j ACCEPT # Преобразование адресов (NAT) для приходящих из туннеля пакетов # При включенной пересылке пакеты по умолчанию перенаправляются # с исходным адресом без изменений, то есть в нашем случае 10.8.0.* # такие пакеты либо удаляются на шлюзе ISP, либо даже если они # отправляются в пункт назначения, ответ никогда не находит обратного пути. # Эти частные адреса не маршрутизируются в Интернете. # # Решением является преобразование адресов (NAT) исходящего трафика, # то есть заменить частный 10.8.0.* адрес общедоступным IP адресом VPN-сервера. # Это позволит ответам достичь VPN-сервера, # и там они будут отправлены обратно в туннель. iptables -t nat -I POSTROUTING -s $PRIVATE -o $DEV -j MASQUERADE
Сделайте файл исполняемым:
chmod 755 /root/bin/vpn_route.sh
Чтобы изменения вступили прямо сейчас, до перезапуска компьютера, выполните:
bash /root/bin/vpn_route.sh
Если всё нормально, то для добавления его в автозагрузку создайте файл /etc/systemd/system/enable-openvpn-routing.service:
vim /etc/systemd/system/enable-openvpn-routing.service
Со следующим содержимым:
Запуск.
6. Настройка завершена, можно пытаться запустить все это. (Не забудьте открыть нужные порты и IP-адреса в файерволах!) Для этого есть два варианта:
a. Переходим на сервере в C:Program FilesOpenVPNconfig, правая кнопка мыши на server.ovpn -> Start OpenVPN on this config file. Аналогично на стороне клиента с файлом client.ovpn. В каждом случае наблюдаем сообщения и в случае удачи на клиенте увидим в последней строке: «Initialization Sequence Completed»
илиb. Запускаем графическую оболочку C:Program FilesOpenVPNbin openvpn-gui-1.0.3.exe – Правая кнопка мыши на значке в трее – server – connect (для клиента – client – connect). В случае удачи на клиенте увидим поп-ап окошко из трея вида: «Assigned IP: 10.8.0.6» и значок позеленеет.
7. Еще одни, последние грабли, с которыми мне довелось столкнуться. Если системная служба “DHCP-клиент” не запущена на клиенте (а я ее намеренно отключил сразу после установки винды, так как IP-адрес у машины постоянный), он не сможет получить IP-адрес, который ему будет пытаться выдать сервер.
Настройка openvpn сервера
Чтобы случайно всё не удалить, создадим папку C:Program FilesOpenVPNssl и скопируем в неё сертификаты. Это будет рабочая папка сервера.
mkdir "C:Program FilesOpenVPNssl"
copy "C:Program FilesOpenVPNeasy-rsakeys" "C:Program FilesOpenVPNssl"
Создадим конфигурационный файл сервера C:Program FilesOpenVPNconfigserver.ovpn:
copy "C:Program FilesOpenVPNsample-configserver.ovpn" "C:Program FilesOpenVPNconfigserver.ovpn"
Открываем блокнотом и редактируем:
notepad "C:Program FilesOpenVPNconfigserver.ovpn"
Лучше изучить конфигурационный файл, я предлагаю свой вариант конфига:
port 1194
proto udp
dev tun
ca "C:\Program Files\OpenVPN\ssl\ca.crt"
cert "C:\Program Files\OpenVPN\ssl\server.crt"
key "C:\Program Files\OpenVPN\ssl\server.key" # This file should be kept secret
dh "C:\Program Files\OpenVPN\ssl\dh2048.pem"
server 10.8.0.0 255.255.255.0
tls-auth "C:\Program Files\OpenVPN\ssl\ta.key" 0 # This file is secret
keepalive 10 120
comp-lzo
persist-key
persist-tun
cipher AES-256-CBC
status "C:\Program Files\OpenVPN\log\status.log"
log "C:\Program Files\OpenVPN\log\openvpn.log"
verb 4
mute 20
Указываем параметры сервера, пути к ключам и сертификатам. Здесь же пути к логам. Для тестирования можно использовать tcp протокол:
proto tcp
Переходим к службам:
services.msc
Находим службу OpenVPNService.
Настраиваем на автоматический запуск при загрузке сервера.
Запускаем службу.
Согласно настройкам сервера в папке C:Program FilesOpenVPNlog должны появиться логи. Это один из инструментов администратора OpenVPN сервера.
Активировался сетевой адаптер TAP-Windows Adapter V9.
Согласно настройкам сервера IP адрес 10.8.0.1.
Проверяем поднялся ли порт tcp 1194:
netstat -tan | find "1194"
Порт должен прослушиваться.
Теперь нужно настроить firewall. Открываем Windows Defender Firewall with Advanced Security.
Переходим в Inbound Rules.
Создаём правило — New Rule…
Тип правила — Port. Next.
Протоколы и порты — UDP 1194. Как в настройках сервера. Next.
Действия — Allow the connection. Next.
Для всех сетей. Next.
Указываем название правила — OpenVPN. Next.
Правило создано, теперь firewall не блокирует входящие UDP соединения на 1194 порту.
Настройка уц
Для начала установим системные компоненты, необходимые для работы Рутокен ЭЦП:
- CCID-драйвер
sudo apt-get install libccid
- PC/SC
sudo apt-get install libpcsclite1 pcscd
Установим XCA:
sudo apt-get install xca
Запустим XCA:
sudo xca
Следует создать новую базу File->New Database.
Создадим ключ УЦ: Private Keys-> New Key, newcakey, RSA, 1024.
Создадим сертификат УЦ:
Создадим ключ сервера OpenVPN: Private Keys-> New Key, newserver, RSA, 1024.Создадим сертификат сервера OpenVPN:
ВАЖНО! У сертификата сервера OpenVPN должно присутствовать специальное расширение (extendedKeyUsage — serverAuth)
Экспортируем сертификат УЦ в файл ca.crt, ключ сервера в файл server.key и сертификат сервера в файл server.crt, чтобы их можно было подсунуть серверу OpenVPN (Private Keys->Export, Certificates->Export).
Обход блокировок с помощью российских vps
Начнём с небольшого лайф-хака: если у вас уже есть VPS (виртуальный частный сервер – разновидность хостинга, когда в отличие от совместного (shared-хостинга) вам в аренду дают не папку на сервере, а целую виртуальную машину, в которую вы можете установить любую операционную систему и настроить её как вам заблагорассудится), так вот, если у вас уже есть VPS и даже если виртуальный сервер находится в РФ, то весьма вероятно, что он подойдёт для обхода блокировок Роскомнадзора.
Чтобы это проверить, необязательно настраивать VPN – подключитесь к вашему удалённому серверу (например, по SSH) и попробуйте выполнить что-то вроде:
curl заблокированный_URL_или_IP
Вполне вероятно, что вы получите HTML код страницы заблокированного ресурса – это означает, что на вашем российском VPS можно настроить VPN для обхода блокировок.
В принципе, причина очевидна: оборудование для блокировок заставили установить только провайдеров «последней мили». Т.е. это разные ростелекомы, билайны и т.п. – те, кому вы платите за Интернет.
У кого есть российские VPS – пишите в комментариях, у вас через VPS открываются заблокированные сайты или нет? Будет интересно собрать некоторую статистику. Также указывайте, настроен ли IPv6 – возможно, дело просто в этом.
Создание ключей openvpn
Для безопасности рекомендуется, чтобы центр сертификации был на отдельном компьютере, ключи сервера генерировались на другом компьютере, и каждый клиент генерировал свои ключи на своём компьютере.
Для простоты, я буду выполнять действия на одной системе (на OpenVPN сервере), а потом перенесу клиентские ключи на нужный компьютер.
Имя файла | Нужен для | Цель | Секретный |
ca.crt | сервер все клиенты | Публичный ключ (сертификат) корневого центра сертификации (CA) | НЕТ |
ca.key | только для машины, подписывающей ключи | Приватный ключ корневого центра сертификации (CA) | ДА |
dh{n}.pem | только сервер | Параметры Диффи Хеллмана | НЕТ |
ta.key | сервер все клиенты | HMAC подпись к пакетам SSL/TLS | ДА |
server.crt | только сервер | Сертификат (публичный ключ) сервера | НЕТ |
server.key | только сервер | Приватный ключ сервера | ДА |
client1.crt | только client1 | Сертификат (публичный ключ) Client1 | НЕТ |
client1.key | только client1 | Приватный ключ Client1 | ДА |
client2.crt | только client2 | Сертификат (публичный ключ) Client2 | НЕТ |
client2.key | только client2 | Приватный ключ Client2 | ДА |
client3.crt | только client3 | Сертификат (публичный ключ) Client3 | НЕТ |
client3.key | только client3 | Приватный ключ Client3 | ДА |
Ключи могут генерироваться на любой операционной системе – они будут работать также на любой ОС. Например, сервер работает на Arch Linux и ключи созданы на нём, а затем клиентские ключи передаются в ОС под управлением Windows или Ubuntu.
В зависимости от вашей системы, выберите нужную инструкцию: для производных Debian или для производных Arch Linux.
Создание ключей openvpn в debian, ubuntu, linux mint, kali linux
Начинаем с инициализации центра сертификации:
cd /usr/share/easy-rsa export EASYRSA=$(pwd) sudo ./easyrsa init-pki sudo dd if=/dev/urandom of=pki/.rand bs=256 count=1 sudo dd if=/dev/urandom of=pki/.rnd bs=256 count=1 sudo ./easyrsa build-ca
Нужно будет придумать и два раза ввести пароль от 4 до 1023 символов.
Будет создано два файла:
- /usr/share/easy-rsa/pki/ca.crt
- /usr/share/easy-rsa/pki/private/ca.key
Первый (ca.crt) – это сертификат, т.е. открытый ключ центра сертификации. Он нужен и для сервера и для каждого клиента – с помощью него они будут проверять, что публичные ключи других действительно подписаны центром сертификации и что не появился кто-то «левый», не одобренный центром сертификации.
Создаём папку, где будут все сертификаты сервера OpenVPN:
mkdir /etc/openvpn/certs/
и сразу копируем туда первый файл:
cp /usr/share/easy-rsa/pki/ca.crt /etc/openvpn/certs/ca.crt
Создание ключей OpenVPN сервера
Теперь нам нужно сгенерировать пару ключей OpenVPN сервера.
./easyrsa gen-req server nopass
Нужно подписать сертификат ключами Центра Сертификации, для этого:
./easyrsa sign-req server server
Будет задан вопрос, точно ли мы хотим подписать, наберите yes, затем введите пароль от Центра Сертификации (CA).
Когда появится фраза:
Enter pass phrase for /usr/share/easy-rsa/pki/private/ca.key:
Нужно будет ввести пароль Центра Регистрации, который установили на предыдущем шаге.
Копируем в нужную папку файлы, которые нужны для запуска сервера OpenVPN:
cp /usr/share/easy-rsa/pki/issued/server.crt /etc/openvpn/certs/ cp /usr/share/easy-rsa/pki/private/server.key /etc/openvpn/certs/
Файл параметров Diffie-Hellman (DH) нужен для протокола обмена публичными ключами.
openssl dhparam -out /etc/openvpn/certs/dh2048.pem 2048
Создайте ключ HMAC:
sudo openvpn --genkey secret /etc/openvpn/certs/ta.key
Теперь у нас 5 файлов, необходимые для запуска сервера OpenVPN, размещены в папке /etc/openvpn/certs/. Проверьте, все ли файлы на месте:
ls -l /etc/openvpn/certs/
Создание и подпись ключей клиентов OpenVPN
./easyrsa gen-req client1 nopass ./easyrsa sign-req client client1
Аналогично нужно будет ответить на вопрос yes и ввести пароль вашего Центра Сертификации.
Тестирование и запуск сервера openvpn
Протестировать настройки OpenVPN сервера можно так:
openvpn /etc/openvpn/server/server.conf
Если есть ошибки в файле конфигурации, то программа сразу завершиться с ошибкой. Для решения проблем включите логи в файле настроек, увеличьте вербальность до 6 и изучайте журнал ошибок:
cat /var/log/openvpn.log cat /var/log/openvpn-status.log
А если всё в порядке запустите OpenVPN сервер и добавьте его в автозагрузку
systemctl start [email protected] systemctl status [email protected] systemctl enable [email protected]
Обратите внимание, что с systemctl используется команда вида openvpn-server@<configuration>.service, где <configuration> – это файл конфигурации, который лежит в папке /etc/openvpn/server/, но без расширения .conf
Если вы следовали этой инструкции и не меняли название файла, то вышеприведённые команды вам подойдут, их не нужно менять.
Если вы столкнулись с ошибкой:
Options error: --explicit-exit-notify cannot be used with --mode server
То из файла /etc/openvpn/server/server.conf
Удалить директиву
explicit-exit-notify 1
Причина ошибки в том, что поддержка директивы explicit-exit-notify 1 была добавлена в OpenVPN начиная с версии 2.4. А на вашей машине, очевидно, OpenVPN более старой версии.
Если вы столкнулись с ошибкой «Address already in use», например:
TCP/UDP: Socket bind failed on local address [AF_INET][undef]:53: Address already in use Exiting due to fatal error
Это означает, что порт занят другой программой. Проверить, какая программа использует порт, можно командой:
sudo netstat -tulpn | grep ":НОМЕР_ПОРТА"
К примеру, для проверки порта 53:
sudo netstat -tulpn | grep ":53"
Используйте любой другой, не занятый порт – для этого в конфигурационных файлах OpenVPN сервера и клиента отредактируйте директиву port 53.
Управление ключами и сертификатами openvpn в xca
yum install wget -y
yum install unzip zip -y
yum install openvpn -y
mkdir /etc/openvpn/keys
cd /etc/openvpn/keys
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
unzip master.zip
cp vars.example vars
cd /etc/openvpn/keys/easy-rsa-master/easyrsa3
./easyrsa build-ca
./easyrsa gen-dh
cd /etc/openvpn/keys/easy-rsa-master/easyrsa3
./easyrsa gen-req client_name nopass
./easyrsa sign-req client client_name
./easyrsa gen-req my_home_pc nopass
./easyrsa sign-req client my_home_pc
./easyrsa gen-req my_smartphone
./easyrsa sign-req client my_smartphone
systemctl start openvpn@server
systemctl status -l openvpn@server
Управление пользователями
Добавление
В случае, если не используются токены, добавление пользователя осуществляется через тот же скрипт. Скрипт по сути генерит пользовательский ovpn-конфиг и вставляет туда сертификат, подписанный корневым сертификатом.
Если используются токены (см. ниже раздел про токены) тогда сертификат выписывается руками на основе запроса на сертификат, который генерится на токене. Пользовательский конфиг надо делать руками из имеющегося шаблона (из того же самого, из которого генерит конфиг скрипт).
УдалениеУдаление пользователей производится через тот же скрипт установки. Сертификат добавляется в CRL, новый CRL подпихивается vpn-серверу. Все сертификаты, которые есть в CRL сервер считает недействительными и принимать отказывается.
Как отозвать сертификат вручную:
cd /etc/openvpn/easyrsa
# отозвать сертификат
./easyrsa revoke $CLIENT
# сгенерировть новый crl
./easyrsa gen-crl
# удалить старый crl
rm -rf /etc/openvpn/crl.pem
# подменить его новым
cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/crl.pem
# openvpn должен уметь читать crl, когда он уже дропнул привилегии до nobody
chown nobody:nobody /etc/openvpn/crl.pem
Фильтрация доступных хостов для клиентов
Клиентов необходимо ограничивать по тем хостам на которые им можно ходить внутри сети, когда они подключаются к openvpn.
Вручную
Идея в том, чтобы ловить пакеты еще на интерфейсе tun0, в который они приходят от клиентов и фильтровать их до того как они попадают в NAT. После NAT фильтровать их будет уже не почему — у них у всех будет ip-адрес openvpn сервера во внутренней сети.
Пакеты, которые проходят сквозь систему (не исходят непосредственно из нее и не являются входящими, т.е. по сути роутятся системой) обрабатываются таблицей FORWARD. Таблицы в iptables обрабатываются сверху вниз, если ни одно из правил в таблице не привело к решению судьбы пакета, тогда срабатывает дефолтное правило.
Подготовка таблицы FORWARD:
# сбросить все
iptables -F FORWARD
# дефолтное правило для таблицы FORWARD - не пропускать ничего
iptables -P FORWARD DROP
# пропускать уже установленные соединения
iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Пример правил для конкретного клиента. Поскольку дефолтное правило для таблицы — DROP, осталось только разрешить те пары хост порт, куда можно. Разрешить доступ к порту на хосте пинговать сам хост:
Отзыв сертификата
Иногда нужно отозвать сертификат, выданный клиенту. Кто-то увольняется, кто-то палит сертификаты.
cd "C:Program FilesOpenVPNeasy-rsa"
vars.bat
revoke-full client
Где client — это имя клиента.
В папке C:Program FilesOpenVPNkeys появляется файл:
Копируем его с заменой в рабочую директорию сервера C:Program FilesOpenVPNssl.
Добавляем строчку в конфигурационный файл сервера:
crl-verify "C:\Program Files\OpenVPN\keys\crl.pem"
Перезапускаем службу OpenVPN сервера.
net stop OpenVPNService
net start OpenVPNService
Если в конфигурационном файле уже был ранее указан путь к crl.pem, то службу можно не перезапускать, OpenVPN перечитывает CRL один раз в час. Но в течении этого часа клиенты с отозванными сертификатами смогут продолжать подключаться и работать.
Для клиента с отозванным сертификатом процесс подключения будет “зависать”. В логе можно увидеть:
TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity) TLS Error: TLS handshake failed
Чтобы клиент не стучался постоянно на сервер, у него в конфиге есть опция:
connect-retry-max 25
Передать эту опцию при отзыве сертификата нельзя, поэтому указывайте её всем клиентам заранее.