Как настроить OpenVPN с Stunnel на сервере Ubuntu 22.04/20.04

Эта статья покажет вам, как запустить свой собственный сервер OpenVPN на Ubuntu 22.04/20.04. OpenVPN — это открытое программное обеспечение, надежное и высоко гибкое решение для VPN. Stunnel — это инструмент, который туннелирует трафик OpenVPN через TCP-порт 443 в режиме TLS, чтобы обойти блокировку брандмауэра.

Почему создавать свой VPN-сервер?

  • Возможно, вы являетесь поставщиком услуг VPN или системным администратором, что обязывает вас настроить свой собственный VPN-сервер.
  • Вы не доверяете политике отсутствия ведения журнала у поставщиков услуг VPN, поэтому вы предпочитаете путь собственного хостинга.
  • Вы можете использовать VPN для реализации политики безопасности сети. Например, если у вас есть свой почтовый сервер, вы можете требовать, чтобы пользователи входили только с IP-адреса VPN-сервера, создавая белый список IP-адресов в брандмауэре. Таким образом, ваш почтовый сервер укреплен для предотвращения хакерских атак.
  • Возможно, вас просто интересует, как работает сервер VPN.

Set Up OpenVPN with Stunnel on Ubuntu

Особенности сервера OpenVPN

  • Легкий и быстрый. На тестах я могу смотреть видео на YouTube в разрешении 4K через OpenVPN. YouTube заблокирован в моей стране (Китай).
  • Работает на серверах Linux и большинстве серверов BSD.
  • Есть клиентское программное обеспечение OpenVPN для Linux, macOS, Windows, Android, iOS и OpenWRT.
  • Поддерживает учет RADIUS.
  • Поддерживает виртуальное хостинг (несколько доменов).
  • Легко настраивается.
  • Поддерживает безопасность SSL/TLS, мостовое подключение Ethernet, туннелирование TCP или UDP через прокси или NAT.
  • Поддерживает динамические IP-адреса и DHCP.
  • Масштабируемость до сотен или тысяч пользователей.
  • Поддерживает обычное шифрование с использованием предварительно согласованного секретного ключа (режим статического ключа) или безопасность на основе открытого ключа (режим SSL/TLS) с использованием клиентских и серверных сертификатов.

Требования

Чтобы следовать этому учебнику, вам понадобится VPS (виртуальный частный сервер), который может свободно получить доступ к заблокированным веб-сайтам (вне вашей страны или системы фильтрации Интернета). Я рекомендую VPS от Kamatera, которая предлагает:

  • 30 дней бесплатной пробной версии.
  • Цены начинаются от 4 долларов в месяц (1 ГБ ОЗУ).
  • Высокопроизводительный VPS на основе KVM.
  • 9 центров обработки данных по всему миру, включая Соединенные Штаты, Канаду, Великобританию, Германию, Нидерланды, Гонконг и Израиль.

Следуйте приведенному ниже учебнику, чтобы создать свой сервер VPS с Linux на Kamatera.

После того как у вас есть работающий VPS с Ubuntu 22.04/20.04, следуйте приведенным ниже инструкциям.

Шаг 1: Установка сервера OpenVPN на Ubuntu 22.04/20.04

Войдите в свой сервер Ubuntu 22.04/20.04. Затем используйте apt для установки пакета openvpn из репозитория Ubuntu по умолчанию.

sudo apt update sudo apt install -y openvpn openvpn-systemd-resolved easy-rsa

Шаг 2: Настройка аутентификации по сертификату в OpenVPN

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

Для этого нам нужно настроить инфраструктуру открытых ключей (PKI), которая включает в себя:

  • Настройка центра сертификации (CA).
  • Создание ключа и сертификата сервера.
  • Создание ключа и сертификата клиента.

Настройка центра сертификации (CA)

Центр сертификации выдает серверные и клиентские сертификаты. Например, Let’s Encrypt — это центр сертификации, который выдает бесплатные серверные сертификаты TLS. Тем не менее, Let’s Encrypt не выдает клиентские сертификаты, поэтому нам нужно настроить частный центр сертификации для OpenVPN.

Утилита openssl широко используется для настройки центра сертификации, но ее синтаксис командной строки сложен. Вместо этого мы можем использовать утилиту easy-rsa, которая устанавливается на шаге 1. Как следует из ее названия, она проще, чем openssl.

Читайте также:  Список пакетов в Debian/Ubuntu

Сначала выполните следующую команду для копирования каталога /usr/share/easy-rsa/ в /etc/openvpn/ .

sudo make-cadir /etc/openvpn/easy-rsa

Переключитесь на пользователя root.

sudo su -

Перейдите в каталог /etc/openvpn/easy-rsa/.

cd /etc/openvpn/easy-rsa/

Инициализируйте инфраструктуру открытых ключей.

./easyrsa init-pki

Затем создайте центр сертификации.

./easyrsa build-ca

Вас попросят ввести пароль для ЦС. Когда спросят об установке общего имени для ЦС, вы можете нажать Enter, чтобы выбрать имя по умолчанию: Easy-RSA CA.

easy rsa build ca

Создание ключа и сертификата сервера

Сгенерируйте ключ и запрос на сертификат для сервера OpenVPN. Замените openvpn.example.com реальным поддоменом для вашего сервера OpenVPN. Вам нужно будет ввести общее имя. Используйте этот поддомен в качестве общего имени.

./easyrsa gen-req openvpn.example.com nopass

easy rsa Create server key and certificate request

Сгенерировать параметры Диффи-Хеллмана.

./easyrsa gen-dh

easy rsa Generate Diffie Hellman parameters

Теперь подпишите запрос на сертификат. Сертификат сервера будет создан.

./easyrsa sign-req server openvpn. example. com

easy rsa sign certificate request

Создайте ключ статического ключа OpenVPN для улучшения безопасности SSL/TLS.

openvpn --genkey tls-auth /etc/openvpn/easy-rsa/pki/ta.key

Создание ключа и сертификата клиента

Создайте запрос на сертификат для пользователя user01 .

./easyrsa gen-req user01 nopass

openvpn Generate a certificate request.

Подпишите этот запрос на сертификат. Сертификат клиента будет создан. Вам потребуется ввести пароль от CA.

./easyrsa sign-req client user01

openvpn Create client key and certificate

Каждый пользователь VPN должен иметь свой собственный сертификат/ключ.

Шаг 3: Редактирование файла конфигурации сервера OpenVPN

Скопируйте пример файла конфигурации сервера.

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server.conf
sudo nano /etc/openvpn/server.conf

В начале этого файла вы можете найти следующую строку, которая включает порт UDP на общедоступном IPv4-адресе сервера.

proto udp

Добавьте вторую директиву для поддержки IPv6.

proto udp proto udp6

Затем найдите следующие строки.

ca ca.crt cert server.crt key server.key # This file should be kept secret

Эти 3 строки указывают расположение файла сертификата CA, сертификата сервера и закрытого ключа сервера. Мы должны использовать фактическое расположение.

ca /etc/openvpn/easy-rsa/pki/ca.crt cert /etc/openvpn/easy-rsa/pki/issued/openvpn.linuxbabe.com.crt key /etc/openvpn/easy-rsa/pki/private/openvpn.linuxbabe.com.key

Затем найдите настройку параметров Диффи-Хеллмана.

dh dh2048.pem
dh /etc/openvpn/easy-rsa/pki/dh.pem

Следующая строка указывает частный IPv4-сетевой адрес для OpenVPN. У сервера OpenVPN будет частный IP-адрес 10.8.0.1.

server 10.8.0.0 255.255.255.0

Добавьте вторую директиву для включения частных адресов IPv6.

server 10.8.0.0 255.255.255.0 server-ipv6 2001:db8:0:123::/64

По умолчанию OpenVPN использует сетевую топологию net30, которая устарела. Найдите следующую строку.

;topology subnet

Раскомментируйте ее, чтобы использовать топологию подсети.

topology subnet

Найдите следующую строку

;push "redirect-gateway def1 bypass-dhcp"

Раскомментируйте ее (удалите начальную точку с запятой) и добавьте вторую директиву push, чтобы сервер OpenVPN стал шлюзом для клиентов VPN. Они также будут использовать OpenVPN в качестве DNS-сервера.

push "redirect-gateway def1 bypass-dhcp" push "route-ipv6 2000::/3"

Если вы хотите, чтобы клиенты VPN использовали конкретный DNS-сервер, найдите следующие две строки.

;push "dhcp-option DNS 208.67.222.222" ;push "dhcp-option DNS 208.67.220.220"

Раскомментируйте их и измените IP-адрес DNS-сервера.

;push "dhcp-option DNS 8.8.8.8" ;push "dhcp-option DNS 1.1.1.1"

Найдите следующую строку.

;client-to-client

Раскомментируйте ее, чтобы клиенты VPN могли пинговать друг друга.

;client-to-client

Наконец, найдите следующую строку.

tls-auth ta.key 0 # This file is secret

Укажите фактическое расположение статического ключа OpenVPN.

tls-auth /etc/openvpn/easy-rsa/pki/ta.key 0

Сохраните и закройте файл. Запустите сервер OpenVPN.

sudo systemctl enable --now openvpn@server

Проверьте его статус:

sudo systemctl status openvpn@server

sudo systemctl status openvpn@server

Как видите, он активен (работает), и включен автоматический запуск при загрузке.

Шаг 4: Включение IP-маршрутизации

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

echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/60-custom.conf

Также выполните следующие две команды, чтобы включить алгоритм TCP BBR для увеличения скорости TCP.

echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.d/60-custom.conf echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.d/60-custom.conf

Затем примените изменения с помощью следующей команды. Опция -p загрузит настройки sysctl из файла /etc/sysctl.d/60-custom.conf. Эта команда сохранит наши изменения после перезагрузок системы.

Читайте также:  Раскрыть все табы в пробелы в Linux

sudo sysctl -p /etc/sysctl.d/60-custom.conf

Шаг 5: Настройка IP-маскарадинга в брандмауэре

Нам нужно настроить IP-маскарадинг в брандмауэре сервера, чтобы сервер стал виртуальным маршрутизатором для клиентов VPN. Я буду использовать UFW, который является фронтендом для брандмауэра iptables/nftable. Установите UFW на Ubuntu с помощью:

sudo apt install ufw

Сначала вам нужно разрешить трафик SSH.

sudo ufw allow 22/tcp

Затем найдите имя основного сетевого интерфейса вашего сервера.

ip addr

Как видите, на моем сервере Ubuntu он называется ens3.

openconnect-ubuntu 20.04-command-line

Для настройки IP-маскарадинга нам нужно добавить команду iptables в файл конфигурации UFW.

sudo nano /etc/ufw/before.rules

По умолчанию в этом файле есть несколько правил для таблицы фильтрации. Добавьте следующие строки в конце этого файла. Замените ens3 на имя своего сетевого интерфейса.

# Правила таблицы NAT *nat :POSTROUTING ACCEPT [0:0] - A POSTROUTING -s 10.8.0.0/24 -o ens3 -j MASQUERADE # Завершите каждую таблицу строкой 'COMMIT', иначе эти правила не будут обработаны COMMIT

В текстовом редакторе Nano вы можете перейти в конец файла, нажав Ctrl+W, а затем Ctrl+V.

ufw masquerade rule openvpn ubuntu

Вышеуказанные строки добавят (-A) правило в конец цепочки POSTROUTING таблицы nat. Они свяжут ваш виртуальный частный сетевой экран с Интернетом и скроют вашу сеть от внешнего мира. Таким образом, Интернет может видеть только IP-адрес вашего сервера VPN, но не видит IP-адреса клиентов VPN, как, например, ваш домашний маршрутизатор скрывает вашу частную домашнюю сеть.

По умолчанию UFW запрещает пересылку пакетов. Мы можем разрешить пересылку для нашей частной сети. Найдите цепочку ufw-before-forward в этом файле и добавьте следующие 3 строки, которые будут принимать пересылку пакетов, если исходный IP или IP назначения находятся в диапазоне 10.8.0.0/24.

# разрешить пересылку для доверенной сети - A ufw-before-forward - s 10.8.0.0/24 - j ACCEPT - A ufw-before-forward - d 10.8.0.0/24 - j ACCEPT

Сохраните и закройте файл. Затем включите UFW.

sudo ufw enable

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

sudo systemctl restart ufw

Теперь, если вы выведете правила в цепочке POSTROUTING таблицы NAT с помощью следующей команды:

sudo iptables -t nat -L POSTROUTING

Вы увидите правило Masquerade.

Для UFW может потребоваться какое-то время для обработки правил брандмауэра. Если правило маскарада не появится, перезапустите UFW еще раз (sudo systemctl restart ufw).

Шаг 6: Откройте порт 1194 в брандмауэре

Выполните следующую команду для открытия TCP и UDP порта 1194.

sudo ufw allow 1194/tcp sudo ufw allow 1194/udp

Теперь сервер OpenVPN готов принимать подключения клиентов.

Если у вас есть локальный DNS-резольвер

Для тех из вас, кто использует локальный DNS-резольвер, если вы указали 10.10.10.1 в качестве DNS-сервера для клиентов VPN, то вы должны разрешить клиентам VPN подключаться к порту 53 следующим правилом UFW.

sudo ufw insert 1 allow in from 10.8.0.0/24

Вам также нужно отредактировать файл конфигурации DNS-сервера BIND ( /etc/bind/named.conf.options ), чтобы разрешить клиентам VPN отправлять рекурсивные DNS-запросы, как показано ниже.

allow-recursion { 127.0.0.1; 10.8.0.0/24; };

Затем перезапустите BIND.

sudo systemctl restart named

Как установить и использовать клиент OpenVPN на Ubuntu 22.04/20.04 Desktop

Выполните следующую команду для установки командной строки клиента OpenVPN на рабочем столе Ubuntu.

sudo apt install openvpn

Затем вам нужно скопировать сертификат CA, сертификат клиента, закрытый ключ клиента и файл статического ключа с сервера OpenVPN на компьютер клиента. Путь к файлам на сервере OpenVPN.

  • CA cert: /etc/openvpn/easy-rsa/pki/ca.crt
  • Client cert: /etc/openvpn/easy-rsa/pki/issued/user01.crt
  • Client key: /etc/openvpn/easy-rsa/pki/private/user01.key
  • Static key: /etc/openvpn/easy-rsa/pki/ta.key

Я сохранял их в каталоге /etc/openvpn/client/ на компьютере клиента.

Затем скопируйте файл конфигурации клиента.

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/
sudo nano /etc/openvpn/client.conf

Найдите следующие строки.

remote my-server-1 1194

Укажите общедоступный IP-адрес вашего сервера OpenVPN.

remote 12.34.56.78 1194

Затем найдите следующие строки.

ca ca.crt cert client.crt key client.key

Используйте фактический путь для сертификата CA, сертификата клиента и закрытого ключа клиента.

Читайте также:  Сравнение ОС Windows, Linux и Mac OS

ca /etc/openvpn/client/ca.crt cert /etc/openvpn/client/user01.crt key /etc/openvpn/client/user01.key

Найдите следующую строку.

tls-auth ta.key 1

Используйте фактический путь для статического ключа.

tls-auth /etc/openvpn/client/ta.key 1

Сохраните и закройте файл. Затем запустите клиент OpenVPN

sudo systemctl start openvpn@client
sudo systemctl status openvpn@client

sudo systemctl status openvpn@client

Проверьте, можете ли вы пинговать сервер OpenVPN.

ping 10.8.0.1

Затем перейдите по адресу https://icanhazip.com. Если все работает правильно, вы должны увидеть общедоступный IP-адрес сервера OpenVPN.

Если вы успешно подключились к серверу VPN, но ваш общедоступный IP-адрес не изменяется, это связано с тем, что IP-пересылка или IP-маскарадинг не работают. Однажды у меня была ошибка в команде iptables (использование неверного диапазона IP-адресов), из-за которой мой компьютер не мог обращаться в Интернет.

Чтобы остановить этот сервис Systemd, выполните

sudo systemctl stop openvpn@client

Если вы хотите использовать Network Manager для управления подключением OpenVPN, вам также нужно установить эти пакеты.

sudo apt install network-manager-openvpn network-manager-openvpn-gnome

OpenVPN GUI Client для Windows и macOS

Вы можете использовать бесплатный и открытый клиент OpenVPN Pritunl: https://client.pritunl.com/

Скорость

OpenVPN довольно быстр. Я могу использовать его для просмотра видеороликов на YouTube в разрешении 4K. Как вы видите, моя скорость соединения составляет 63356 Кбит/с, что равно 61 Мбит/с.

ocserv vpn speed test singapore server

А вот результаты теста на speedtest.net.

ocserv vpn speed test singapore

Отладка

Если возникают проблемы с установкой VPN-соединения, вы можете отредактировать файл конфигурации сервера OpenVPN ( /etc/openvpn/server.conf ) и увеличить уровень ведения журнала до 6.

verb 6

Эта директива находится внизу файла.

Затем вы можете проверить журналы.

  • клиент: sudo journalctl -eu openvpn@client
  • сервер: sudo journalctl -eu openvpn@server

Настройка Stunnel (по желанию)

Если вы живете в стране, такой как Китай или Иран, ваш национальный брандмауэр может блокировать соединения OpenVPN. Вы можете обернуть трафик OpenVPN внутри TLS-туннеля, чтобы скрыть факт использования OpenVPN.

Настройка Stunnel на сервере OpenVPN

Отредактируйте файл конфигурации сервера OpenVPN.

sudo nano /etc/openvpn/server.conf

Включите порт TCP.

proto tcp proto udp proto udp6

Сохраните и закройте файл. Затем установите Stunnel на сервере OpenVPN.

sudo apt install -y stunnel4

Скопируйте образец файла конфигурации:

sudo cp /usr/share/doc/stunnel4/examples/stunnel.conf-sample /etc/stunnel/openvpn.conf

Отредактируйте новый файл.

sudo nano /etc/stunnel/openvpn.conf

Найдите следующие строки и раскомментируйте их.

;setuid = stunnel4 ;setgid = stunnel4 ;pid = /var/run/stunnel.pid ;output = /var/log/stunnel.log
setuid = stunnel4 setgid = stunnel4 pid = /var/run/stunnel/stunnel.pid output = /var/log/stunnel/stunnel.log

Найдите следующие строки.

[gmail-pop3] client = yes accept = 127.0.0.1:110 connect = pop.gmail.com:995 verifyChain = yes CApath = /etc/ssl/certs checkHost = pop.gmail.com OCSPaia = yes [gmail-imap] client = yes accept = 127.0.0.1:143 connect = imap.gmail.com:993 verifyChain = yes CApath = /etc/ssl/certs checkHost = imap.gmail.com OCSPaia = yes [gmail-smtp] client = yes accept = 127.0.0.1:25 connect = smtp.gmail.com:465 verifyChain = yes CApath = /etc/ssl/certs checkHost = smtp.gmail.com OCSPaia = yes

Это включает туннели для серверов SMTP, IMAP и POP3. Удалите их и добавьте вместо них следующие строки, чтобы Stunnel мог передавать трафик на сервер OpenVPN, слушающий порт 1194.

[openvpn] cert=/etc/openvpn/easy-rsa/pki/issued/openvpn.example.com.crt key=/etc/openvpn/easy-rsa/pki/private/openvpn.example.com.key accept = 0.0.0.0:443 connect = 127.0.0.1:1194

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

Создайте PID-файл и файл журнала.

sudo mkdir /var/run/stunnel /var/log/stunnel

Предоставьте разрешения пользователю.

sudo chown stunnel4:stunnel4 /var/run/stunnel/ -R sudo chown stunnel4:stunnel4 /var/log/stunnel/ -R sudo setfacl -R -m u:stunnel4:rx /etc/openvpn/easy-rsa/
sudo /usr/bin/stunnel4 /etc/stunnel/openvpn.conf

Вы должны увидеть, что Stunnel использует порт 443.

sudo ss -lnpt | grep 443

Если не удается запустить, тогда проверьте файл журнала: /var/log/stunnel/stunnel.log . Если на вашем сервере есть другой процесс, слушающий TCP-порт 443, вам нужно его остановить, иначе Stunnel не сможет привязаться к TCP-порту 443.

Откройте TCP-порт 443 в брандмауэре, чтобы VPN-клиенты могли подключаться к этому порту.

sudo ufw allow 443/tcp

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

Установите Stunnel на клиенте OpenVPN.

sudo apt install -y stunnel4

Создайте файл конфигурации Stunnel.

sudo nano /etc/stunnel/client.conf

Добавьте следующие строки в этот файл.

output = /var/log/stunnel/stunnel.log pid = /var/run/stunnel/stunnel.pid client = yes [openvpn] sni = openvpn.example.com accept = 127.0.0.1:1194 connect = 12.34.56.78:443

Сохраните и закройте файл. Создайте каталог для журнала и каталог PID.

sudo mkdir /var/log/stunnel/ /var/run/stunnel/

Запустите клиент Stunnel.

sudo stunnel /etc/stunnel/client.conf

Он слушает 127.0.0.1:1194 и передает запросы на сервер Stunnel.

sudo ss -lnpt | grep 1194

Затем отредактируйте файл конфигурации клиента OpenVPN.

sudo nano /etc/openvpn/client.conf

Включите TCP и отключите UDP.

proto tcp ;proto udp

Измените адрес удаленного сервера на 127.0.0.1:1194.

remote 127.0.0.1 1194

Сохраните и закройте файл. Затем перезапустите клиент OpenVPN.