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

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

Life-Hack [Жизнь-Взлом]/Хакинг

#Обучение

Продолжаем разбираться с созданием умного 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

Однако, если вы этого не видите или вместо этого находите сообщения об ошибках, такие как “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

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

Далее следует создать обмен ключами Диффи-Хеллмана. Это позволяет двум компьютерам обмениваться секретными ключами, не зная заранее, кто они. Введите (это может занять некоторое время... например, часы, если вы используете размер ключа 2048 бит - настоятельно рекомендуется): 

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

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

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

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

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

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

openvpn --genkey --secret pki/ta.key

Затем нам нужно создать файл конфигурации сервера, который сообщает 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

Нажмите 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

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

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

chmod 700 /root/open_vpn_firewall.sh
chown root /root/open_vpn_firewall.sh

На этом пока закончим, продолжение следует.​

Источник


Report Page