ZaLinux.ru

Установка и настройка сервера и клиента OpenVPN на Debian

Обновлённая и более универсальная инструкция по настройке 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.pemserver.key и ta.key.
  • client.crtclient.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

Рекомендуемые статьи:

3 Комментарии

  1. n1mda

    А как же списки отозванных сертификатов? и про них надо указать и уже давно можно использовать обёртку pkitool для генерации сертификатов и для сервера и для клиента

    1. Alexey (Автор записи)

      Не совсем понимаю про сертификат. Здесь мы используем сгенерированный нами сертификат. По-моему, он по определению не может быть отозванным. Скомпрометированным – да, может быть. Такое может случиться, если кто-то получил доступ к нашим сертификатам. Но, опять же, в данной ситуации его нужно не отзывать, а просто заменить на новый.

      Про pkitool ничего не знаю и в репозиториях Debian и Arch Linux её нет. На github есть пара утилит с таким именем, но нет документации…

      1. вася

        /etc/openvpn/certs/client.crt

        /etc/openvpn/certs/client.key

        если эти файлы скомпроментированы, то нужно отозвать client.crt, иначе сервер продолжит доверять утеряному client.crt

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *