Обновлённая и более универсальная инструкция по настройке OpenVPN на всех основных платформах теперь в статье «Инструкция по настройке сервера и клиента OpenVPN».
В данной статье подробно описывается, как получить подключение на OpenVPN с использованием Debian Linux. Эти команды запускаются от рута.
Что такое OpenVPN?
OpenVPN – это VPN программа, которая использует SSL/TLS для создания безопасных, зашифрованных VPN соединений для маршрутизации вашего интернет трафика, тем самым предотвращая слежку (снупинг). OpenVPN имеет высокую способность прозрачности для прохода через файерволы. На самом деле, если ситуация требует этого, вы можете запустить его на том же TCP порту как HTTPS (443), что делает трафик неразличимым и практически невозможным для блокировки.
OpenVPN использует различные методы для аутентификации клиентов на сервере: предварительно разделяемые секретные ключи, сертификаты или имя/пароль. OpenVPN использует протокол OpenSSL и реализует много функций безопасности и контроля, к которым относятся запрос отклика аутентификации, возможность единого входа, балансировка нагрузки и функции отказоустойчивости, а также поддержка множества демонов.
Почему использовать OpenVPN?
Говоря «безопасные подключения» - подразумеваем OpenVPN. Если вы не хотите, чтобы кто-либо шпионил (занимался снупингом) за вашим интернет трафиком, используйте OpenVPN для маршрутизации всего вашего трафика через сильно зашифрованный, безопасный туннель.
Это особенно важно при подключении к публичным WIFI сетям в аэропортах и других местах. Вы никогда не можете быть уверенным, кто шпионит за вашим трафиком. Вы можете направить ваш трафик через ваш собственный OpenVPN сервер для предотвращения снупинга.
Если вы в одной из тех стран, которые постоянно мониторят весь ваш трафик и блокируют по своему желанию веб-сайты, вы можете использовать OpenVPN через TCP порт 443, чтобы сделать его неотличимым от HTTPS трафика. Вы даже можете комбинировать ваши стратегии безопасности, например, туннелировать ваш OpenVPN трафик через SSL туннель, чтобы отбиться от техник Deep Packet Inspection (глубокого анализа пакетов), которые могут быть способными идентифицировать сигнатуры OpenVPN.
Системные требования
Для работы OpenVPN нужны минимальные требования. Система с 64 MB оперативной памяти и 1 GB места на жёстком диске достаточно для OpenVPN. OpenVPN работает почти на всех основных системах.
Установка и настройка OpenVPN на Debian
Установка OpenVPN on Мастер-сервер
Запустите следующую команду для установки OpenVPN.
apt-get install openvpn
По умолчанию скрипты easy-rsa scripts устанавливаются в директорию ‘/usr/share/easy-rsa/‘. Поэтому нам нужно скопировать эти скрипты в нужное расположение, например /root/easy-rsa.
mkdir /root/easy-rsa cp -prv /usr/share/easy-rsa /root/easy-rsa
Генерируем CA сертификат и CA ключ
Откройте файл ‘vars‘ и сделайте следующие изменения, но перед внесением изменений я предлагаю сделать резервную копию.
cd /root/easy-rsa cp vars{,.orig}
Используя ваш текстовый редактор измените значения по умолчанию для easy-rsa.
vim ./vars
Например, добавьте в самый низ:
KEY_SIZE=4096 KEY_COUNTRY="TH" KEY_PROVINCE="ChonBuri" KEY_CITY="Pattaya" KEY_ORG="MiAlConsorcium" KEY_EMAIL="user@example.net"
Здесь я использую 4096 битный ключ. Вы можете по своему использовать 1024, 2048, 4096 или 8192 битный ключ.
Экспортируем величины по умолчанию выполнив.
source ./vars
Очистим все сертификаты, которые были сгенерированы ранее.
./clean-all
Далее запустите следующую команду для генерации сертификата CA и ключа CA.
./build-ca
Сгенерируйте сертификат сервера следующей командой. Вместо «server» можно подставить любое имя сервера.
./build-key-server server
Сгенерируйте PEM сертификат Diffie Hellman PEM.
./build-dh
Сгенерируйте клиентский сертификат. Вместо «client» можно подставить ваше имя клиента.
./build-key client
Сгенерируйте код HMAC.
openvpn --genkey --secret /root/easy-rsa/keys/ta.key
Скопируйте сертификаты на машины клиента и сервера следующим образом.
- Убедитесь, что ca.crt присутствует и на клиентской и на серверной машинах.
- Ключ ca.key должен быть на машине, сгенерировавшей ключ.
- Сервер требует server.crt, dh4096.pem, server.key и ta.key.
- client.crt, client.key и ta.key должны быть на клиенте.
Для установки сертификатов на сервере запустите команды.
mkdir -p /etc/openvpn/certs cp -pv /root/easy-rsa/keys/{ca.{crt,key},server.{crt,key},ta.key,dh4096.pem} /etc/openvpn/certs/
Настройка сервера OpenVPN
Теперь вам нужно настроить OpenVPN. Откройте фйл ‘/etc/openvpn/server.conf‘. Пожалуйста, сделайте изменения, как написано ниже.
port 1194 proto udp dev tun ca /etc/openvpn/certs/ca.crt cert /etc/openvpn/certs/server.crt key /etc/openvpn/certs/server.key dh /etc/openvpn/certs/dh4096.pem tls-auth /etc/openvpn/certs/ta.key 0 server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" client-to-client keepalive 1800 4000 cipher DES-EDE3-CBC # Triple-DES comp-lzo max-clients 10 user nobody group nobody persist-key persist-tun log /var/log/openvpn.log status /var/log/openvpn-status.log verb 5 mute 20 #client-config-dir ccd mode server tls-server
Запустите следующую команду для настройки OpenVPN запускаться при загрузке.
update-rc.d -f openvpn defaults
Запустите службу OpenVPN.
service openvpn restart
Включение перенаправления и IPTABLES
Создайте файл vpn_firewall.sh
vim /root/vpn_firewall.sh
B этот файл скопируйте следующее содержимое, отредактировав его под свои нужды. Обратите внимание на:
- PRIVATE=10.8.0.0/24 – измените подсеть в соответствии с вашими настройками. Если делали по этой инструкции, то менять ничего не нужно.
- имя интерфейса - eth0, у вас может быть другое значение, измените его на своё везде, где оно встречается
- в строке iptables -A INPUT -p tcp --dport 22 -j ACCEPT мы открываем доступ к порту 22, чтобы могли подключиться по SSH, если у вас нестандартный порт, то обязательно отредактируйте его, поскольку может получиться так, что после применения этого файла вы не сможете подключиться к вашему серверу по сети, добавьте нужно количество строк с необходимыми вам портами
#!/bin/sh echo 1 > /proc/sys/net/ipv4/ip_forward # Пример настройки файервола для OpenVPN. # Если нужно, сделайте соответствующие # изменения, сети вашего OpenVPN PRIVATE=10.8.0.0/24 # Петлевой адрес LOOP=127.0.0.1 # Удалить старые правила iptables # и временно заблокировать весь трафик. iptables -P OUTPUT DROP iptables -P INPUT DROP iptables -P FORWARD DROP iptables -F # Установление политик по умолчанию iptables -P OUTPUT ACCEPT iptables -P INPUT DROP iptables -P FORWARD DROP # Предотвращаем использование локальных адресов внешними пакетами iptables -A INPUT -i eth0 -s $LOOP -j DROP iptables -A FORWARD -i eth0 -s $LOOP -j DROP iptables -A INPUT -i eth0 -d $LOOP -j DROP iptables -A FORWARD -i eth0 -d $LOOP -j DROP # Всё, что приходит из Интернета, должно иметь реальный адрес iptables -A FORWARD -i eth0 -s 192.168.0.0/16 -j DROP iptables -A FORWARD -i eth0 -s 172.16.0.0/12 -j DROP iptables -A FORWARD -i eth0 -s 10.8.0.0/8 -j DROP iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP iptables -A INPUT -i eth0 -s 10.8.0.0/8 -j DROP # Блокируем исходящий NetBios (если в вашей подсети # есть машины с Windows). Это не окажет влияния на какой-либо # трафик NetBios, который идёт по VPN туннелю, но остановит # локальные машины Windows от самостоятельного # широковещания в Интернет. iptables -A FORWARD -p tcp --sport 137:139 -o eth0 -j DROP iptables -A FORWARD -p udp --sport 137:139 -o eth0 -j DROP iptables -A OUTPUT -p tcp --sport 137:139 -o eth0 -j DROP iptables -A OUTPUT -p udp --sport 137:139 -o eth0 -j DROP # Разрешаем локальные петли iptables -A INPUT -s $LOOP -j ACCEPT iptables -A INPUT -d $LOOP -j ACCEPT # Позволяем входящий пинг (можно отключить) # iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # Разрешаем такие службы как www и ssh (можно отключить) iptables -A INPUT -p tcp --dport http -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # Разрешаем входящие пакеты OpenVPN # Дуплицируйте строку ниже для каждого # туннеля OpenVPN, меняя --dport n # для соответствия порту OpenVPN UDP. # # В OpenVPN номер порта # контролируется опцией --port n. # Если вы разместили эту опцию в конфигурационном # файле, вы можете удалить предшествующие '--' # # If you taking the stateful firewall # approach (see the OpenVPN HOWTO), # then comment out the line below. iptables -A INPUT -p udp --dport 1194 -j ACCEPT # Разрешить пакеты от устройств TUN/TAP. # Когда OpenVPN запущен в безопасном режиме, # он будет проверять подлинность пакетов до # их прибытия на интерфейс # tun или tap. Следовательно нет # необходимости добавлять сюда какие-либо фильтры, # если вы не хотите ограничить # тип пакетов, которые могут проходить # через туннель. iptables -A INPUT -i tun+ -j ACCEPT iptables -A FORWARD -i tun+ -j ACCEPT iptables -A INPUT -i tap+ -j ACCEPT iptables -A FORWARD -i tap+ -j ACCEPT # Сохранить состояние подключений от локальной машины и частных сетей iptables -A OUTPUT -m state --state NEW -o eth0 -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state NEW -o eth0 -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Маскировка локальной сети iptables -t nat -A POSTROUTING -s $PRIVATE -o eth0 -j MASQUERADE
Проверить работу файла:
bash vpn_firewall.sh
ОБЯЗАТЕЛЬНО проверьте работу файла ДО добавления его в автозагрузку. Отключитесь и подключитесь по SSH чтобы убедиться, что всё действительно работает.
Установка OpenVPN на клиенте
Запустите следующую команду для установки OpenVPN на клиентской машине.
apt-get install openvpn mkdir -p /etc/openvpn/certs/
Настройки даны исходя из расположения файлов здесь:
- /etc/openvpn/certs/ca.crt
- /etc/openvpn/certs/client.crt
- /etc/openvpn/certs/client.key
- /etc/openvpn/certs/ta.key
Используя текстовый редактор, настройте конфигурацию OpenVPN клиента в ‘/etc/openvpn/client.conf‘ на клиенте. Пример конфигурации ниже:
client remote 185.117.153.79 ca /etc/openvpn/certs/ca.crt cert /etc/openvpn/certs/client.crt key /etc/openvpn/certs/client.key cipher DES-EDE3-CBC comp-lzo yes dev tun proto udp tls-auth /etc/openvpn/certs/ta.key 1 nobind auth-nocache persist-key persist-tun user nobody group nogroup
Обратите внимание на строку remote 185.117.153.79 – вам обязательно нужно заменить это значение на IP вашего собственного VPN сервера!
Запустите следующую команду для настройки OpenVPN запускаться при загрузке.
update-rc.d -f openvpn defaults
Запустите службу OpenVPN на клиенте.
service openvpn restart
Как просматривать логи OpenVPN
Для наших настроек это делается так:
cat /var/log/openvpn.log cat /var/log/openvpn-status.log
Ещё это можно делать, например, командой:
grep VPN /var/log/syslog
Настройка входа в OpenVPN по логину и паролю
Принцип работы с подключением по логину и паролю следующий:
- OpenVPN не может проверять действительность логина и пароля;
- вместо проверки OpenVPN сохраняет присланные ей логин и пароль в файл со случайным именем в директорию, которую мы указали в tmp-dir (в нашем случае это /tmp).
- после этого OpenVPN запускает скрипт, который мы указали в auth-user-pass-verify (в нашем случае это /etc/openvpn/verify.sh), в качестве аргумента этому скрипту передаётся имя только что сохранённого файла с логином и паролем.
- если от скрипта получен код выхода 0, то OpenVPN авторизует клиента, если 1, то считает, что логин или пароль неверны.
- после этого OpenVPN удаляет временный файл.
Схема работы, мягко говоря, так себе. Поскольку предусматривает хранение паролей в открытом виде и на сервере и на клиенте…
Внесём изменения в конфигурационный файл сервера:
vim /etc/openvpn/server.conf
Добавим туда следующие строки:
auth-user-pass-verify /etc/openvpn/verify.sh via-file client-cert-not-required username-as-common-name tmp-dir /tmp script-security 2
Создаём файл
vim /etc/openvpn/verify.sh
копируем туда следующий код (можете придумать свой механизм аутентификации):
#!/bin/sh USERS=`cat /etc/openvpn/user.pass` for i in $USERS; do if [ "$i" = "`cat $1 | paste -sd ':' -`" ]; then exit 0 fi done echo "С таким паролем пользователей не найдено" exit 1
Делаем файл исполнимым:
chmod 755 /etc/openvpn/verify.sh
Файл с паролями /etc/openvpn/user.pass выглядит так:
user1:pass1 user2:pass2 ...
то есть идёт через пробел пара логин:пароль. Пароль находится в открытом виде!
В конфигурационный файл клиента добавляем такую строку:
auth-user-pass /etc/openvpn/pass.txt
и создаём соответственно файл pass.txt, где будет находится логин и пароль в таком виде:
username password
Примечание: Если в параметре auth-user-pass убрать путь к файлу, будет запрашиваться логин/пароль.
Полные конфигурационные файлы в моём случае. Для сервера:
port 1194 proto udp dev tun ca /etc/openvpn/certs/ca.crt cert /etc/openvpn/certs/server.crt key /etc/openvpn/certs/server.key dh /etc/openvpn/certs/dh4096.pem #tls-auth /etc/openvpn/certs/ta.key 0 server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" client-to-client keepalive 1800 4000 cipher DES-EDE3-CBC # Triple-DES comp-lzo max-clients 10 user nobody group nobody persist-key persist-tun log /var/log/openvpn.log status /var/log/openvpn-status.log verb 5 mute 20 #client-config-dir ccd mode server tls-server auth-user-pass-verify /etc/openvpn/verify.sh via-file client-cert-not-required username-as-common-name tmp-dir /tmp script-security 2
Для клиента:
client remote 185.117.153.79 ca /etc/openvpn/certs/ca.crt #cert /etc/openvpn/certs/client.crt #key /etc/openvpn/certs/client.key cipher DES-EDE3-CBC comp-lzo yes dev tun proto udp #tls-auth /etc/openvpn/certs/ta.key 1 nobind auth-nocache persist-key persist-tun user nobody group nogroup auth-user-pass /etc/openvpn/pass.txt
Перезапустите службу OpenVPN.
service openvpn restart
Связанные статьи:
- Изменения в конфигурационных файлах при переходе с OpenVPN 2.4.* на OpenVPN 2.5.* (82.8%)
- Как использовать OpenVPN с протоколом TCP (82.8%)
- Сравнение производительности (скорости передачи данных) OpenVPN через UDP и TCP (82.8%)
- Одновременное использование нескольких OpenVPN на одном сервере (82.8%)
- Ошибки «TLS Error: TLS key negotiation failed to occur within 60 seconds» и «TLS handshake failed» (РЕШЕНО) (82.8%)
- Ошибка в TigerVNC «CConn: End of stream» (РЕШЕНО) (RANDOM - 50%)
А как же списки отозванных сертификатов? и про них надо указать и уже давно можно использовать обёртку pkitool для генерации сертификатов и для сервера и для клиента
Не совсем понимаю про сертификат. Здесь мы используем сгенерированный нами сертификат. По-моему, он по определению не может быть отозванным. Скомпрометированным – да, может быть. Такое может случиться, если кто-то получил доступ к нашим сертификатам. Но, опять же, в данной ситуации его нужно не отзывать, а просто заменить на новый.
Про pkitool ничего не знаю и в репозиториях Debian и Arch Linux её нет. На github есть пара утилит с таким именем, но нет документации…
/etc/openvpn/certs/client.crt
/etc/openvpn/certs/client.key
если эти файлы скомпроментированы, то нужно отозвать client.crt, иначе сервер продолжит доверять утеряному client.crt