Что нового

Article [2] Умный VPN-сервер на Raspberry Pi: Установка и Настройка

Vander 0

Vander

Команда форума
10.11.2019
480
1 100
Приветствую аудиторию форума Protey!

1612813214260.png

Продолжаем разбираться с созданием умного VPN сервера на базе RPi.

Я полагаю, что у вас установлена последняя версия OS Raspbian, все дефолтные пакеты имеют последние версии и настроен доступ по SSH, приступаем к установке дополнительного ПО, для построения VPN сервера.

Установка UPnP Client

Universal Plug-n-Play (UPnP) - это протокол для открытия портов на вашем интернет-маршрутизаторе, чтобы приложения могли общаться друг с другом через Интернет. Нам это нужно, чтобы Putty могла общаться с вашим RPi после его установки в удаленном месте, и чтобы клиент OpenVPN на ваших устройствах Windows и / или Android мог его использовать.

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

MiniUPnP

MiniUPnP самый простой в установке и самый быстрый в работе. Итак, мы собираемся установить его изначально. Если у вас есть проблемы с тем, как MiniUPnP будет работать с вашим маршрутизатором, вы можете обратиться ко следующей части этой статьи, чтобы установить PortMapper, альтернативный программный пакет UPnP.

Выполняем команды установки MiniUPnP и его модуля Python:

Код:
apt install miniupnpc
Код:
apt install python-pip
Код:
pip install miniupnpc
Ответьте «Y» на любой запрос о дополнительном дисковом пространстве и т. Д.

Первая команда устанавливает программу upnpc из командной строки для тестирования. Вторая команда устанавливает установщик пакетов Python (PIP), который используется в третьей команде для установки слоя, используемого пакетом miniupnpc Python в нашем скрипте.

Теперь протестируем. Введите следующее:

Код:
upnpc -s
Среди всего выплевываемого хлама должна быть строка, начинающаяся с:
  • Found valid IGD
1612818941424.png

Однако, если вы этого не видите или вместо этого находите сообщения об ошибках, такие как “No IGD UPnP Device found on the network !

То MiniUPnP не сможет подключиться к вашему маршрутизатору. Это может быть связано с тем, что на вашем маршрутизаторе не включен UPnP или MiniUPnP несовместим с вашим маршрутизатором. Обратитесь к руководству пользователя вашего маршрутизатора, чтобы убедиться, что он поддерживает UPnP и как его включить.

Если MiniUPnP не работает с вашим маршрутизатором и поддерживает UPnP, перейдите к следующему разделу, PortMapper (альтернатива MiniUPnP), чтобы использовать его. В противном случае мы закончили с этой частью.

PortMapper (альтернатива MiniUPnP)

Вы здесь, потому что MiniUPnP не может связаться с вашим маршрутизатором, хотя он поддерживает UPnP и включен. Не бойтесь, у нас есть альтернатива.

PortMapper - это приложение Java, поэтому для его установки требуется больше работы. Он также работает немного медленнее, но для нас это не должно быть проблемой.

Если вы еще не вошли в свой RPi с помощью puTTY, сделайте это сейчас, установите пользователя root и перейдите в «корневую» папку:

Код:
sudo -s
cd / root
Теперь запустите команду wget, чтобы загрузить PortMapper:

Код:
wget -O PortMapper.jar https://downloads.sourceforge.net/project/upnp-portmapper/PortMapper-1.9.5.jar
Или скачайте скрипт отсюда:
Команда wget ‘web-gets’ PortMapper-1.9.5.jar переименовывает его в просто PortMapper.jar (с этим намного проще работать).
  • Примечание: я тестировал это ТОЛЬКО с версией 1.9.5 PortMapper. Могут быть более новые версии этой программы (а некоторые являются альфа-версиями (непроверенными)). Использование любой другой версии может не работать и не поддерживается.
PortMapper требует Java Runtime Enviroment (JRE), и в зависимости от того, какой вариант Raspbian вы скачали, он может не быть установлен. Итак, мы запустим команду установки для JRE, чтобы убедиться, что она у нас есть:

Код:
apt-get install default-jre-headless
Если он уже там, вы увидите сообщение о том, что это актуально. Если нет, вам будет предложено установить его вместе с требованиями к пространству. Просто ответьте "Y"

Мы выполняем «headless» установку, потому что мы общаемся только с RPi через SSH, а не через графический интерфейс пользователя (GUI), поэтому нам не нужны все эти дополнительные компоненты. Тем не менее, он немного велик и требует времени на установку.

Теперь давайте протестируем его и убедимся, что он может взаимодействовать с вашим маршрутизатором. Введите эту единственную строку:

Код:
java -jar PortMapper.jar -s | grep 'Router Info:'
Это выдаст около дюжины строк (если все работает правильно). Они должны содержать такую информацию, как название вашего маршрутизатора, производитель, модель и т. Д. Если вы не видите эту информацию или вместо этого видите сообщения об ошибках, то PortMapper несовместим с вашим маршрутизатором.

Надеюсь, что у вас всё получилось, но вопросы можно задавать в комментариях.

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

Для Wireless: OpenVPN на Jessie плохо работает с адаптерами WiFi. При запуске разрывает соединение Wi-Fi. Итак, если вы используете свой RPi по беспроводной сети, нам нужно сначала отредактировать файл:

Код:
nano /etc/default/ifplugd
Отредактируйте строку HOTPLUG_INTERFACES, чтобы она выглядела так:

Код:
HOTPLUG_INTERFACES="eth0 wlan0 "
Нажмите Ctrl + X и Y, чтобы сохранить и выйти.
  • Примечание: Приведенный выше файл ifplugd не применяется к моделям Raspberry Pi 3 или версии Raspbian Stretch или Buster.
Так, как мы предпочитаем подключение по Ethernet, просто идем далее.

Итак, теперь выполняем следующую команду на вашем Raspberry Pi:

Код:
apt install openvpn
Ага, теперь у вас есть рабочий VPN-сервер! Но…

Проблема в том, что никто не может с ним поговорить или даже не знает, как с ним разговаривать. Так что нам предстоит еще немного поработать.

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

Мы будем использовать RSA (Rivest-Shamir-Adleman) Cryptosystem. Он уже встроен в OpenVPN, поэтому все, что нам нужно сделать, это указать OpenVPN использовать его.

Выполняем следующую команду:

Код:
cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa
Это копирует программное обеспечение RSA из каталога «examples» в каталог «etc», чтобы мы могли внести изменения и не испортить оригинал.

Теперь мы просто «сменим каталог» на нашу рабочую копию, чтобы мы могли с ней работать:

Код:
cd /etc/openvpn/easy-rsa
И сделаем рабочую копию файла vars.example:

Код:
cp vars.example vars
На этом этапе нет необходимости изменять какие-либо параметры в файле vars, значения по умолчанию хорошо подходят для этой настройки.

Теперь пришло время сгенерировать сертификат CA (Центр Сертификации) и сертификат корневого CA. Это первый шаг в создании пары ключей (сервер и клиент) для использования нашего VPN-сервера.

Так что сделайте следующее:

Инициализируйте Public Key Infrastructure (PKI).

Инфраструктура открытых ключей (ИОК, PKI - Public Key Infrastructure) - набор средств (технических, материальных, людских и т. д.), распределённых служб и компонентов, в совокупности используемых для поддержки криптозадач на основе закрытого и открытого ключей. В основе PKI лежит использование криптографической системы с открытым ключом и несколько основных принципов:
  • Закрытый ключ (private key) известен только его владельцу;
  • Удостоверяющий центр создает электронный документ — сертификат открытого ключа, таким образом удостоверяя факт того, что закрытый (секретный) ключ известен эксклюзивно владельцу этого сертификата, открытый ключ (public key) свободно передается в сертификате;
  • Никто не доверяет друг другу, но все доверяют удостоверяющему центру;
  • Удостоверяющий центр подтверждает или опровергает принадлежность открытого ключа заданному лицу, которое владеет соответствующим закрытым ключом.
Это создает структуру для нашего главного сертификата полномочий (CA) и пар открытого и закрытого ключей (на самом деле эти ключи создаются не только для структур):

Код:
./easyrsa init-pki
Создайте наш CA, введите:

Код:
./easyrsa build-ca nopass
Вы можете не использовать опцию «nopass», и вам будет предложено ввести кодовую фразу. Она понадобится вам каждый раз при подключении к серверу OpenVPN.

Но если вы не раскрываете свой центр сертификации публично, нет необходимости защищать его паролем с помощью ключевой фразы. Теперь вам будет предложено ввести «Common name».

Я рекомендую использовать имя хоста Raspberry Pi, если вы его указали, или уникальное имя для этого сервера. Если вы создадите несколько серверов Raspberry Pi VPN, их будет легче отличить друг от друга.
  • Примечание: запомните это общее имя, которое вы ввели! Вам это понадобится позже.
Теперь пришло время создать сертификат корневого центра сертификации, поэтому введите в командной строке # следующее:

Код:
./easyrsa gen-req servername nopass
Servername - это именно то, что вы ввели в поле «Common Name». Вы ведь уже его не забыли?

Вам также снова будет предложено ввести «Common Name», но по умолчанию оно должно соответствовать введенному имени сервера, поэтому просто нажмите Enter.

Теперь нам нужно подписать этот сертификат сервера, чтобы его можно было использовать:

Код:
./easyrsa sign-req server servername
1612729594267.png

Где "servername", опять же, это имя сервера, которое вы выбрали выше. Затем просто ответьте «yes» на приглашение.

Далее следует создать обмен ключами Диффи-Хеллмана. Это позволяет двум компьютерам обмениваться секретными ключами, не зная заранее, кто они. Введите (это может занять некоторое время... например, часы, если вы используете размер ключа 2048 бит - настоятельно рекомендуется):
  • Протокол Диффи — Хеллмана (Diffie–Hellman, DH) — криптографический протокол, позволяющий двум и более сторонам получить общий секретный ключ, используя незащищенный от прослушивания канал связи. Полученный ключ используется для шифрования дальнейшего обмена с помощью алгоритмов симметричного шифрования.
    Схема открытого распределения ключей, предложенная Диффи и Хеллманом, произвела настоящую революцию в мире шифрования, так как снимала основную проблему классической криптографии — проблему распределения ключей.
    В чистом виде алгоритм Диффи — Хеллмана уязвим для модификации данных в канале связи, в том числе для атаки «Man-in-the-middle (человек посередине)», поэтому схемы с его использованием применяют дополнительные методы односторонней или двусторонней аутентификации.
Код:
./easyrsa gen-dh
1612813872026.png

Сделайте кофе (или посмотрите фильм, если вы использовали размер ключа 2048 бит) и вернитесь сюда, когда он будет готов. Иногда, если вам действительно повезет, это может произойти быстро, если он рано найдет подходящую пару случайных простых ключей.

У меня это заняло примерно 40 минут, и результатом будет следующий вывод:

1612816297686.png

Теперь мы должны предпринять дополнительные меры безопасности, чтобы предотвратить атаки типа «отказ в обслуживании» (DoS). Нам нужно создать код аутентификации сообщений на основе хэша (HMAC).

Если сервер OpenVPN увидит VPN-запрос без этого кода, он даже не ответит, что предотвратит DoS-атаки.

Просто введите:

Код:
openvpn --genkey --secret pki/ta.key
1612816448531.png

Затем нам нужно создать файл конфигурации сервера, который сообщает OpenVPN, как работать на этом RPi.

Код:
nano /etc/openvpn/server/server.conf
Затем скопируйте в nano следующее:

Код:
# local 111.111.111.111
dev tun
proto udp
port 1194
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/SERVERNAME.crt # TBD - Change SERVERNAME to your Server name
key /etc/openvpn/easy-rsa/pki/private/SERVERNAME.key # TBD - Change SERVERNAME to your Server name
dh /etc/openvpn/easy-rsa/pki/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig 10.8.0.1 10.8.0.2
push "route 10.8.0.1 255.255.255.255"
push "route 10.8.0.0 255.255.255.0"
push "route 111.111.111.111 255.255.255.0"
push "dhcp-option DNS 222.222.222.222"
push "redirect-gateway def1"
client-to-client
duplicate-cn
keepalive 10 120
tls-auth /etc/openvpn/easy-rsa/pki/ta.key 0
compress lzo
persist-key
persist-tun
user nobody
group nogroup
cipher AES-128-CBC
log /var/log/openvpn.log
status /var/log/openvpn-status.log 20
verb 1
Вам нужно изменить две строки. Все они помечены "# TBD". Установите имя вашего OpenVPN-сервера вместо SERVERNAME (это CaSe Sensitive!).

Нажмите Ctrl + X и Y, чтобы сохранить и выйти.
  • Примечание: не беспокойтесь о необычных IP-адресах 111.111.111.111 и 222.222.222.222, небольшой скрипт в следующей главе все это установит.
Почти сделано. Следующая часть - это настройка файла конфигурации сервера, который позволяет OpenVPN отправлять / получать данные (пересылка пакетов).

По умолчанию ОС Raspbian все это блокирует.

Код:
nano /etc/sysctl.conf
Расскомментируем следующую строку:
  • net.ipv4.ip_forward=1
1612817235587.png
Нажмите Ctrl + X и Y, чтобы сохранить и выйти. Затем введите это, чтобы применить это изменение:

Код:
sysctl -p
Затем нам нужно немного открыть брандмауэр Raspbian, чтобы позволить OpenVPN общаться с внешним миром. Для этого нам нужно создать новый файл.

Код:
nano /root/open_vpn_firewall.sh
Вставляем следующие строки:

Код:
#!/bin/sh
sleep 30
Adapter=`ip -o link show | awk '{print $2,$9}' | grep 'UP'| awk -F: '{print $1}'`
if [ -z "$Adapter" ]
then
    Adapter='eth0'
fi
echo "Adapter = |$Adapter|"
/sbin/iptables -t nat -A POSTROUTING -o $Adapter -j MASQUERADE
/sbin/iptables -A FORWARD -i $Adapter -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A FORWARD -i tun0 -o $Adapter -j ACCEPT
1612817775191.png

Мы только что создали сценарий Bash, и нам нужно сделать его исполняемым и настроить так, чтобы он запускался при каждой загрузке нашего RPi.

Итак, введите эти 2 команды, чтобы сделать его исполняемым и назначить владельцем "root":

Код:
chmod 700 /root/open_vpn_firewall.sh
chown root /root/open_vpn_firewall.sh
На этом пока закончим, продолжение следует.
 
Последнее редактирование:
Верх Низ