You are here: Home » Инструкции » Как установить и настроить OpenVPN в ArchLinux / BlackArch

Как установить и настроить OpenVPN в ArchLinux / BlackArch

В этой инструкции будет рассказано, как установить и настроить OpenVPN в ArchLinux.

Хотя OpenVPN для аутентификации пользователей/клиентов поддерживает логин/пароли, общие ключи (PSK), SSL сертификаты, я для себя выбрал SSL сертификаты, поскольку они превосходят другие методы аутентификации.

Как обычной, держите под рукой также страницу с официальной документацией. Давайте уже начнём!

1. Убеждаемся, что система обновлена

Залогинтесь на ваш VPS через SSH. Загрузим информацию о новых пакетах и обновимся с помощью pacman. Наберите следующее:

pacman -Syyu

2. Убеждаемся, что в системе поддерживается TUN 

Чтобы проверить, работает ли на системе Arch Linux TUN, вы можете использовать следующую команду в одну строку. Если вы используете VPS (виртуальный частный сервер), то некоторые слои виртуализации такие как vServers и OpenVZ требует, чтобы TUN был включен на/из хостовой машине, поэтому если TUN не поддерживается, то свяжитесь со службой поддержки вашего хостинга перед тем, как продолжать.

test ! -c /dev/net/tun && echo openvpn requires tun support || echo tun включен

Если вы на выделенном сервере или используете виртуальный сервер KVM, ESXI или XEN убедитесь, что модуль CONFIG_TUN включён в ядре.

3. Установка OpenVPN 

Для установки службы OpenVPN просто наберите:

pacman -S openvpn

4. Установка EASY-RSA

Далее мы установим пакет easy-rsa используя pacman из дополнительного репозитория и установим его в /root/easy-rsa:

pacman -S easy-rsa
cp -prv /usr/share/easy-rsa /root/easy-rsa
cd /root/easy-rsa
cp vars{,.orig}

5. Установка значений по умолчанию в EASY-RSA

Установим значения по умолчанию для использования их скриптами. Чтобы сделать это отредактируйте:

vim ./vars

и добавьте:

KEY_SIZE= 2048
KEY_COUNTRY="TH"
KEY_PROVINCE="ChonBuri"
KEY_CITY="Pattaya"
KEY_ORG="MiAlConsorcium"
KEY_EMAIL="webmaster@your_domain_name.com"

Сохраните, закройте и экспортируйте файл:

source ./vars

После окончания экспорта удалите созданные ранее сертификаты:

./clean-all

6. Генерируем сертификат

Генерируем CA сертификат используя скрипт build-ca:

./build-ca

7. Генерируем сертификат сервера

Генерируем сертификат VPN сервера используя скрипт build-key-server:

./build-key-server server
  • Sign the certificate? [y/n]:y
  • 1 out of 1 certificate requests certified, commit? [y/n]y

8. Генерируем PEM сертификат DIFFIE-HELLMAN

Сгенерируйте PEM сертификат используя скрипт build-dh:

./build-dh

9. Генерируем клиентский сертификат

Генерируем клиентский сертификат используя скрипт build-key:

./build-key client
  • Sign the certificate? [y/n]:y
  • 1 out of 1 certificate requests certified, commit? [y/n]y

10. Генерируем (HMAC)

Сгенерируйте секретный, основанный на хеш, код сообщения авторизации (HMAC) используя:

openvpn --genkey --secret /root/easy-rsa/keys/ta.key

11. Распределение сертификатов

Скопируйте требуемые сертификаты на определённые машины/устройства (сервер или клиент).

  • Публичный сертификат ca.crt нужен на всех серверах и клиентах;
  • Приватный ключ ca.key является секретом и нужен только на машине, сгенерировавшей ключ;
  • Серверу нужны server.crtdh4096.pem (публичный), server.key и ta.key (приватный);
  • Клиенту нужны client.crt (публичный), client.key и ta.key (приватный).

12. Размещение сертификатов и ключей на сервере

Поместите сертификаты и ключи в директорию /etc/openvpn/certs:

mkdir -p /etc/openvpn/certs
cp -pv /root/easy-rsa/keys/{ca.{crt,key},имя-сервера.{crt,key},ta.key,dh2048.pem} /etc/openvpn/certs/

13. Настройка сервера OpenVPN

Конфигурация сервера OpenVPN будет в файле /etc/openvpn/server.conf поэтому откройте его для редактирования:

vim /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/dh2048.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

Сохраните и закройте файл.

Обратите внимание на строку server 10.8.0.0 255.255.255.0. Вам не нужно менять её под условия вашей сети. Дело в том, что VPN создаёт свою собственную сеть, со своими параметрами и эти значения используются только внутри новой локальной сети VPN.

14. Тестирование и запуск сервера OpenVPN

Протестировать настройки OpenVPN сервера можно примерно так:

openvpn /etc/openvpn/server.conf

и если всё в порядке запустите OpenVPN сервер и добавьте его в автозагрузку

systemctl start openvpn@server.service
systemctl enable openvpn@server.service
systemctl status openvpn@server

15. Включение перенаправления и IPTABLES

Создайте файл vpn_firewall.sh

vim /root/vpn_firewall.sh

B этот файл скопируйте следующее содержимое, отредактировав его под свои нужды. Обратите внимание на:

  • PRIVATE=10.8.0.0/24 – измените подсеть в соответствии с вашими настройками. Если делали по этой инструкции, то менять ничего не нужно.
  • имя интерфейса - ens3, у вас может быть другое значение, измените его на своё везде, где оно встречается
  • в строке 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 ens3 -s $LOOP -j DROP
iptables -A FORWARD -i ens3 -s $LOOP -j DROP
iptables -A INPUT -i ens3 -d $LOOP -j DROP
iptables -A FORWARD -i ens3 -d $LOOP -j DROP

# Всё, что приходит из Интернета, должно иметь реальный адрес
iptables -A FORWARD -i ens3 -s 192.168.0.0/16 -j DROP
iptables -A FORWARD -i ens3 -s 172.16.0.0/12 -j DROP
iptables -A FORWARD -i ens3 -s 10.8.0.0/8 -j DROP
iptables -A INPUT -i ens3 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i ens3 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i ens3 -s 10.8.0.0/8 -j DROP

# Блокируем исходящий NetBios (если в вашей подсети
# есть машины с Windows).  Это не окажет влияния на какой-либо
# траффик NetBios, который идёт по VPN туннелю, но остановит
# локальные машины Windows от самостоятельного 
# широковещания в Интернет.
iptables -A FORWARD -p tcp --sport 137:139 -o ens3 -j DROP
iptables -A FORWARD -p udp --sport 137:139 -o ens3 -j DROP
iptables -A OUTPUT -p tcp --sport 137:139 -o ens3 -j DROP
iptables -A OUTPUT -p udp --sport 137:139 -o ens3 -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 ens3 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state NEW -o ens3 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Маскировка локальной сети
iptables -t nat -A POSTROUTING -s $PRIVATE -o ens3 -j MASQUERADE

Проверить работу файла:

bash vpn_firewall.sh

ОБЯЗАТЕЛЬНО проверьте работу файла ДО добавления его в автозагрузку. Отключитесь и подключитесь по SSH чтобы убедиться, что всё действительно работает.

Для добавления файла в автозагрузску сделайте следующее.

Сделайте файл исполнимым:

chmod 755 /root/vpn_firewall.sh

Создайте файл

vim /etc/systemd/system/let-openvpn

Со следующим содержимым:

[Unit]
Description=Обеспечение работы OpenVPN.
 
[Service]
ExecStart=/root/vpn_firewall.sh
 
[Install]
WantedBy=multi-user.target

И активируйте запуск при автозагрузке

systemctl enable let-openvpn

16. Настройка клиента OpenVPN

  • разместите сгенерированные сертификаты vpn на клиентах/устройствах
  • установите клиент OpenVPN на машние/устройствах

Для установки клиента OpenVPN:

pacman -S openvpn

Настройки даны исходя из расположения файлов здесь:

  • /etc/openvpn/certs/ca.crt
  • /etc/openvpn/certs/client.crt
  • /etc/openvpn/certs/client.key
  • /etc/openvpn/certs/ta.key

Создайте следующий конфигурационный файл client.conf:

touch /etc/openvpn/client.conf

откройте его для редактирования:

vim /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 сервера!

Сохраните и закройте файл. 

Добавьте группу

groupadd nogroup

Для запуска и проверки статуса:

systemctl start openvpn@client
systemctl status openvpn@client

Для добавления в автозагрузку:

systemctl enable openvpn@client

17. Просмотр логов OpenVPN

Для наших настроек это делается так:

cat /var/log/openvpn.log
cat /var/log/openvpn-status.log

18. Настройка входа в 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/dh2048.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 /etc/openvpn/server.conf

Перезапускаем службу и проверяем её статус:

systemctl restart openvpn@server.service
systemctl status openvpn@server

2 комментария

  1. Надо какой-то пример на практике привести, зачем это все и как пользоваться. А так одна теоррия.
    например, есть офис с интернетом на модеме, и есть клиенты - домашние компы и смартфоны - задача их свести в офисную локалку.

    • Я с этим согласен. Поэтому, когда я переводил статью об установке OpenVPN на Debian, я начал с ответов на вопросы, что такое VPN и чего позволяет достичь его использование.

      Со статьёй для Arch Linux я поступил по-другому, потому что пользователи Arch, на мой взгляд, по определению более продвинуты в понимании работы сетей и ОС Linux. Т.е. для них эта информация была бы «водой».

      Обидно про «теорию»: я собрал материал из нескольких источников, исправил косяки других авторов, переписал нерабочий скрипт для аутентификации по паролю, два раза проверил на своём VDS, чтобы убедиться, что всё точно работает – для меня это не теория.

      Я понимаю, что вы имеете ввиду пример прикладного использования. Если бы я занимался настройкой корпоративной сети, то мог бы подробнее о чём-то таком рассказать. Но рассуждать о чём-то, что я не могу проверить, мне не хочется. Если доведётся решать прикладные задачи, связанные с VPN, то напишу об этом.

Добавить комментарий

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