Что нового

Article [5] Умный VPN-сервер на Raspberry Pi: OpenVPN over SSL

Vander 0

Vander

Команда форума
10.11.2019
483
1 109
filter-h.jpg

Это решение применимо только после того, как вы построили свой RPi VPN-сервер и успешно запустили его. Бывают ситуации, когда OpenVPN (или VPN в целом) не работает, поскольку некоторые интернет-провайдеры не разрешают использование VPN в своих сетях. Одним из решений этой проблемы является инкапсуляция данных VPN в пакеты SSL (Secure Socket Layer). Вероятность блокировки данных SSL гораздо меньше. Если вы оказались в такой ситуации, эта глава может вам помочь.

Поговорим о том, что мы собираемся делать.

Следующая диаграмма должна помочь проиллюстрировать эту новую настройку:

c5ebda6a-fad3-484f-a515-8873e974f679.jpg

  • Браузер (или другое интернет-приложение) на вашем устройстве Windows / Android запрашивает что-то из Интернета, например веб-страницу.
  • Клиент OpenVPN принимает этот запрос данных, шифрует его с помощью VPN и отправляет на порт 1194.
  • Клиент Stunnel получает эти данные через порт 1194, инкапсулирует их в пакеты SSL и отправляет их через порт 443 через (ограниченный) Интернет нашему ожидающему RPi.
  • Сервер Stunnel на нашем RPi считывает данные через порт 443, расшифровывает / деинкапсулирует их с SSL и передает их на сервер OpenVPN через порт 1194.
  • Сервер OpenVPN считывает данные из порта 1194, расшифровывает данные VPN и отправляет интернет-запрос в свободный и открытый Интернет.
  • Ответные данные из Интернета просто проходят этот процесс в обратном направлении, в конечном итоге возвращаясь в Интернет-приложение на вашем устройстве, которое их запросило.
Предостережения:
  • Вы будете шифровать и расшифровывать данные дважды: один раз для OpenVPN, а затем еще раз для SSL. Это может замедлить работу
  • Вы должны использовать TCP для OpenVPN и SSL. UDP нельзя использовать. Это также может замедлить работу.
  • Ваш RPi OpenVPN сервер должен всегда запускать OpenVPN через SSL для всех подключений. Это дополнительный шаг подключения, который вам не нужно было делать раньше, а также дополнительное программное обеспечение для настройки и обслуживания.
  • Возможно, вы нарушаете закон.
Настройка RPI для OpenVPN через SSL

Обновите программное обеспечение RPi и установите stunnel4.

stunnel4 - это реализация SSL в Raspbian. Прежде чем продолжить, мы должны убедиться, что все программное обеспечение на вашем RPi актуально, иначе мы можем столкнуться с ошибками и другими проблемами.

Поэтому выполните эти команды из командной строки RPi, чтобы обновить его программное обеспечение и установить stunnel4:

Код:
apt update
apt upgrade
apt install stunnel4
Создание SSL-ключа и сертификата частного сервера

Как и в случае с OpenVPN, для SSL требуется ключ сервера и сертификат - отсюда и двойное шифрование.

Эти 3 команды создадут SSL-ключи нашего частного сервера, которые будут использоваться при общении с ним:

Код:
cd /etc/stunnel
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
Вторая команда создает ключ сервера с 2048-битным шифрованием. Это медленнее, но безопаснее. Таким образом, вы можете изменить его на более низкое значение, например 1024, но это не рекомендуется.

Последняя команда выше очень похожа на то, когда мы создавали ключи сервера OpenVPN. Он попросит ввести несколько дополнительных полей. Вы можете установить для них все, что хотите, или просто оставить поле пустым. Однако мне нравится устанавливать в поле Common Name то же самое, что и имя хоста сервера, которое вы установили для RPi во второй статье, с суффиксом «SSL».

Это просто упрощает отслеживание ключей и серверов, которым они принадлежат. Все поля после «Common Name» следует оставить пустыми. Теперь создадим сертификат и объединим его с ключом.

Мы устанавливаем срок действия сертификата на 10 лет, как и сертификат OpenVPN.

Введите эти 5 команд (первая команда очень длинная и может состоять из нескольких строк):

Код:
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
cat server.key > server.pem
cat server.crt >> server.pem
chmod 400 server.pem
chown root server.pem
Включение stunnel и настройка

Отредактируйте файл stunnel4, используя следующую команду:

Код:
nano /etc/default/stunnel4
Добавьте эту строку в конец файла:

Код:
ENABLED=1
Нажмите Ctrl + X и Y, чтобы сохранить и выйти.

Теперь нам нужно создать файл stunnel.conf:

Код:
nano /etc/stunnel/stunnel.conf
Это новый файл, поэтому он будет пустым. Заполните его следующим:

Код:
sslVersion = all
options = NO_SSLv2
cert = /etc/stunnel/server.pem
pid = /var/run/stunnel.pid
output = /var/log/stunnel
socket = l:TCP_NODELAY=1

[openvpn]
client = no
accept = 443
connect = 000.000.000.000:1194
Примечание: Замените 000.000.000.000 IP-адресом вашего RPi. Его можно найти в первой строке файла /root/check_ip.txt.

«Уловка», которую мы здесь выполняем, находится в разделе [openvpn]. Это сообщает stunnel, что мы являемся хостом, а не клиентом, чтобы принимать данные через порт 443 (стандартный порт SSL) от внешних запросов, а затем перенаправлять эти пакеты данных на порт 1194 (порт OpenVPN) на нашем Raspberry Pi.

Нажмите Ctrl + X и Y, чтобы сохранить и выйти.

Измените OpenVPN на использование TCP вместо UDP

SSL (stunnel) работает только с данными TCP, но не с UDP. Хотя это будет немного медленнее, это лучше, чем вообще ничего (если вы не можете пройти через прямой OpenVPN).

Итак, давайте отредактируем файл конфигурации OpenVPN Server:

Код:
nano /etc/openvpn/server/server.conf
Найдите и измените строку proto udp на: proto tcp

Нажмите Ctrl + X и Y, чтобы сохранить и выйти.

Отредактируйте файл Defaults.txt для будущих клиентов

Код:
nano /etc/openvpn/easy-rsa/pki/defaults.txt
Запишите внешний IP-адрес RPi, как показано в третьей строке файла /root/check_ip.txt:

Код:
cat /root/check_ip.txt
Если вы создаете какие-либо новые клиентские сертификаты, вы захотите, чтобы они по умолчанию использовали правильный хост VPN (localhost), порт (1194) и протокол (TCP).

Итак, нам нужно отредактировать этот файл сейчас:

Измените remote на: remote localhost 1194

Измените строку proto на: proto tcp

Теперь добавьте следующую строку в конец файла:

Код:
route 000.000.000.000 255.255.255.255 net_gateway
Установите 000.000.000.000 на внешний IP-адрес RPi из файла /root/check_ip.txt.

Код:
client
remote localhost 1194
verb 1
nobind
mute 20
dev tun
auth-nocache
compress lzo
proto tcp
persist-tun
persist-key
key-direction 1
cipher AES-128-CBC
remote-cert-tls server
mute-replay-warnings
resolv-retry infinite
route 45.194.10.69 255.255.255.255 net_gateway
Нажмите Ctrl + X и Y, чтобы сохранить и выйти.

Эта последняя строка (маршрут) не позволяет OpenVPN перехватить данные, которые SSL отправляет вашему RPi, и перекодировать их (снова!).

Изменение скрипта check_ip.py

Перейдите в корневую папку:

Код:
cd /root
Скрипт check_ip.py поддерживает SSL.

В редакторе nano (nano ./check_ip.py) измените строку ExtSSLPort на: ExtSSLPort = 443

Затем измените строку ExtVPNPort на: ExtVPNPort = 0

1615225108956.png

OpenVPN больше не используется для внешнего использования вашим клиентом. Его данные передаются в SSL, который затем общается с SSL-клиентами извне. Следовательно, мы отключаем его внешний порт VPN, установив для него значение 0.

Убедитесь, что для него установлено значение «исполняемый файл» и владелец root:

Код:
chmod 700 ./check_ip.py
chown root ./check_ip.py
Добавление задания Cron для перезапуска SSL

Добавьте его в список задач cron:

Код:
crontab -e
Добавьте эти строки в конец файла:

Код:
# restart openssl daily at 5:10pm : 10 17
10 17 * * * /root/check_ip.py -s > /root/cron.log 2>&1
Нажмите Ctrl + X и Y, чтобы сохранить и выйти.

Запустите сценарий и перезапустите RPi. Теперь нам нужно запустить скрипт check_ip.py, чтобы он мог вносить изменения в сопоставление портов UPnP и проверять конфигурацию. Это не должно перезапускать ваш RPi, если его IP-адрес не изменился:

Код:
./check_ip.py
Если вы не получаете сообщений об ошибках по электронной почте, мы можем продолжить перезапуск вашего RPi, чтобы включить OpenVPN через SSL:

Код:
./check_ip.py -r
Мы закончили с настройкой RPi. Теперь нам нужно внести изменения в клиентов Android и Windows. Об этом несколько позже, в отдельной статье.

Спасибо за внимание.
 
Последнее редактирование:
Верх Низ