Главная >> Инструкции >> Настройка OpenVPN в Ubuntu 20.04

Настройка OpenVPN в Ubuntu 20.04

Частная виртуальная сеть или Virtual Private Network (VPN)  - это сеть между компьютерами или серверами в сети, в которой шифруются все передаваемые данные и к которой могут подключится только клиенты, имеющие специальные ключи. Фактически, это та же локальная сеть, только между компьютерами, которые могут находится на разных частях земного шара. Несмотря на то, что все данные передаются через сеть Интернет никто не может получить к ним доступ, потому что они зашифрованы.

В последнее время различные сервисы VPN набирают популярность. Они позволяют обходить блокировки сайтов в вашей стране, а также позволяют сотрудникам использовать корпоративные сервисы из дома, как будто они находятся в офисе. Существует много проприетарых VPN сервисов, но их использовать не обязательно, поскольку есть свободный и бесплатный OpenVPN. В этой статье мы рассмотрим как выполняется установка OpenVPN в Ubuntu 20.04.


Содержание статьи

Установка OpenVPN в Ubuntu

1. Установка пакетов

На обоих машинах должен быть установлен OpenVPN, это довольно популярная программа, поэтому вы можете установить ее из официальных репозиториев. Также нам понадобится Easy-RSA для работы с секретными ключами. Для установки программ в Ubuntu используйте такую команду:

sudo apt install openvpn easy-rsa

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

2. Настройка центра сертификации

Первое что нужно сделать, это создать правильную инфраструктуру для генерации открытых ключей на сервере. Сервером мы считаем ту машину, к которой будут подключаться пользователи. Обратите внимание, что все секретные ключи должны находится в надежном месте. В OpenVPN открытый ключ называется сертификатом и имеет расширение .crt, а закрытый ключ так и называется ключом, его расширение - .key. Обслуживать всё это мы будем с помощью набора скриптов Easy-RSA.

Для того чтобы после обновления системы все ваши сертификаты и настройки не были стёрты, надо скопировать набор скриптов из каталога /usr/share/easy-rsa куда-нибудь, например, в /etc/openvpn/:

sudo mkdir /etc/openvpn/easy-rsa

Затем скопируем в эту папку все необходимые скрипты easy-rsa:

sudo cp -R /usr/share/easy-rsa /etc/openvpn/

Далее нам нужно создать центр сертификации в этой папке. Для этого сначала перейдите в неё:

cd /etc/openvpn/easy-rsa/

Эта команда создаст папку pki и и необходимые файлы для генерации сертификатов. Алгоритм шифрования можно настраивать, но с параметрами по умолчанию тоже всё будет работать:

sudo ./easyrsa init-pki

Следующая команда создаёт ключ центра сертификации, для него понадобится придумать пароль:

sudo ./easyrsa build-ca

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

sudo ./easyrsa gen-dh

Команда создаст файл /etc/openvpn/easy-rsa/pki/dh.pem. Если вы хотите использовать TLS авторизацию, то вам ещё понадобится ключ Hash-based Message Authentication Code (HMAC). Он используется для предотвращения DoS атаки при использовании протокола UDP. Для его создания выполните:

sudo openvpn --genkey --secret /etc/easy-rsa/pki/ta.key

Для отзыва уже подписанных сертификатов нам понадобится сертификат отзыва. Для его создания выполните команду:

sudo ./easyrsa gen-crl

Будет создан файл ./pki/crl.pem.

3. Создание сертификатов сервера

Для создания сертификатов, которые будут использоваться сервером надо выполнить команду:

sudo ./easyrsa build-server-full server nopass

Здесь server - это имя нашего сервера, а опция nopass отключает использование пароля. Теперь все полученные ключи надо скопировать в папку /etc/openvpn:

cp ./pki/ca.crt /etc/openvpn/ca.crt
cp ./pki/dh.pem /etc/openvpn/dh.pem
cp ./pki/crl.pem /etc/openvpn/crl.pem
cp ./pki/ta.key /etc/openvpn/ta.key
cp ./pki/issued/server.crt /etc/openvpn/server.crt
cp ./pki/private/server.key /etc/openvpn/server.key

Все эти сертификаты надо будет использовать позже, при создании конфигурационного файла сервера.

4. Конфигурационный файл сервера

По умолчанию, конфигурационных файлов OpenVPN нет. Их нужно создать самостоятельно в зависимости от того, что планируется настраивать, сервер или клиент. Нужный файл конфигурации OpenVPN можно найти по адресу /usr/share/doc/openvpn/examples/sample-config-files/. Давайте создадим конфигурационный файл для сервера:

zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf

Здесь вам нужно настроить несколько параметров. Самые важные - port и proto - порт и протокол, по которым будет работать программа;

port 1194
proto udp

Все созданные ключи нужно прописать в конфигурационном файле. Наши ключи хранятся по адресу /etc/openvpn, в самой папке с конфигурационным файлом, поэтому можно не прописывать к ним полный путь:

ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0

Настраиваем диапазон адресов для виртуальной сети, наш сервер будет доступен по первому из них - 10.8.0.1:

server 10.8.0.0 255.255.255.0

Следующая директива позволяет раздавать одним и тем же клиентам одни и те же IP адреса:

ifconfig-pool-persist /var/log/openvpn/ipp.txt

После завершения настройки сохраните изменения в файле, вы можете либо вставить всю эту конфигурацию себе или отредактировать файл с примером. Если убрать все комментарии получится такой конфигурационный файл:

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
tls-auth ta.key 0
cipher AES-256-CBC
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3
explicit-exit-notify 1

Настройка сервера OpenVPN завершена. Дальше необходимо запустить OpenVPN сервер. Это можно сделать прямо из командной строки, просто укажите адрес конфигурационного файла:

sudo openvpn /etc/openvpn/server.conf

Если вы увидели сообщение Initialization Sequence Completed значит всё хорошо и можно двигаться дальше. Если возникли ошибки, исправьте их, скорее всего вы сделали что-то не то в конфигурационном файле. После этого остановите запущенный сервер и запустите его снова уже с помощью systemd:

sudo systemctl start openvpn@server

5. Настройка форвардинга пакетов

Для того чтобы OpenVPN сервер мог предоставить клиентам доступ к внешней сети сервера надо включить параметр ip_forwarding. Для этого откройте файл для этого выполните такую команду:

sysctl -w net.ipv4.ip_forward=1

6. Настройка брандмауэра

Теперь надо разрешить прохождение пакетов в брандмауэре. Давайте будем использовать iptables. Но сначала надо посмотреть сетевой интерфейс, который используется для доступа к внешней сети. Это можно сделать с помощью команды:

ip -br a

В данном случае - это ens3. Поэтому правила iptables будут выглядеть вот так:

sudo iptables -I FORWARD -i tun0 -o ens3 -j ACCEPT
sudo iptables -I FORWARD -i ens3 -o tun0 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE

Настройка OpenVPN Ubuntu на сервере завершена, теперь осталось подготовить всё необходимое для подключения клиентов.

7. Создание сертификатов для клиента

Чтобы не скидывать ключи на сервер, а потом обратно, лучше создавать ключи на сервере. Для этого в той же директории /etc/openvpn/easy-rsa/ выполните такую команду:

sudo ./easyrsa build-client-full losst nopass

Вместо losst используйте нужное вам имя пользователя, а опция nopass аналогично генерации ключей для сервера отключает использование пароля.

8. Конфигурационный файл клиента

Давайте создадим папку /etc/openvpn/clients, куда будем складывать все ключи и конфигурационные файлы клиентов:

sudo mkdir /etc/openvpn/clients

sudo mkdir /etc/openvpn/clients/losst

Затем перейдите в папку клиента:

cd /etc/openvpn/clients/losst

Затем туда надо скопировать ca.crt, ta.key и ключи клиента losst.crt и losst.key:

cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/clients/losst/
cp /etc/openvpn/easy-rsa/pki/ta.key /etc/openvpn/clients/losst/
cp /etc/openvpn/easy-rsa/pki/issued/losst.crt /etc/openvpn/clients/losst/
cp /etc/openvpn/easy-rsa/pki/private/losst.key /etc/openvpn/clients/losst/

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

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

Перед тем, как редактировать конфигурационный файл надо узнать публичный IP вашего сервера. Для этого можно воспользоваться командой:

ip -br a

Теперь можно открыть скопированный конфигурационный файл:

sudo vi ./losst.conf

Здесь обязательно надо заменить в этой строке my-server-1 на IP адрес сервера, который вы узнали ранее. Например:

remote 185.117.155.209 1194

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

client
dev tun
proto udp
remote 185.117.155.209 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert losst.crt
key losst.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3

Обратите внимание, что конфигурационные файлы должны максимально совпадать, отсутствие определенных опций в одном из файлов может привести к ошибкам. Это не значит, что файлы будут идентичны, но основные параметры openvpn должны быть одинаковыми. Например, если вы включили опцию comp-lzo для сервера, то она должна быть включена и для клиента.

Далее осталось всё это упаковать в архив и отправить клиенту. Но можно поступить по другому. Ключи для опций ca, cert, key и tls-auth можно упаковать в сам файл конфигурации. Например, для опции cert используется такой синтаксис:

<cert>
-----BEGIN CERTIFICATE-----
текст_сертификата
-----END CERTIFICATE-----
</cert>

Текст ключа надо взять из файла losst.crt между BEGIN CERTIFICATE и END CERTIFICATE. Например:

Для ca.crt всё будет выглядеть аналогично:

 

Для приватного ключа losst.key надо использовать немного другой синтаксис:

И для tls-auth тоже:

После этого директивы, указывающие на файлы можно удалить, и передать клиенту только один этот файл.

9. Проверка подключения

Вы можете скачать конфигурационный файл клиента с сервера, например, с помощью scp:

scp root@ip_сервера:/etc/openvpn/clients/losst/losst.conf /etc/openvpn/

Вам осталось запустить OpenVPN на этой машине используя этот конфигурационный файл:

openvpn /etc/openvpn/losst.conf

Готово, теперь все работает, если вы выполните ifconfig, то увидите что был добавлен интерфейс tun0. Также вы можете попробовать выполнить ping адреса 10.8.0.1, именно этот адрес мы настроили для нашего сервера OpenVPN, пакеты ping будут нормально отправляться.

ping 10.8.0.1

Если пакеты не идут, или еще что-то не работает, обратите внимание на вывод обоих программ, возможно, возникли какие-либо ошибки или предупреждения, также убедитесь, что брандмауэр сервера разрешает доступ извне по udp для порта 1194. Еще можно запустить сервер или клиент, настроив в конфигурационном файле уровень подробности на максимум verb 9. Очень часто это помогает понять почему что-то не работает. Но вы еще не можете направлять трафик через туннель.

Выводы

В этой статье мы рассмотрели как выполняется установка и настройка OpenVPN в Ubuntu 20.04, а также как настроить openvpn для работы с аутентификацией по ключу. Организация частных виртуальных сетей может быть очень полезной не только в организациях, но и скажем для обмена данными между двумя вашими компьютерами или для повышения безопасности в сети.

Оцените статью

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (17 оценок, среднее: 4,59 из 5)
Загрузка...

43 комментария к “Настройка OpenVPN в Ubuntu 20.04”

  1. спасибо за руководство, но есть ошибки а тексте - Настройка сертификатов клиента - команда
    ./clear-all, на скриншоте - ./clean-all

    Ответить
  2. "Настройка аутентификации сервера и клиента требует много работы, и поэтому коммерческие решения с минимумом настроек проигрывают в этом плане. " - Вообще не понял смысла фразы.
    Я полагал что коммерческие решения - это недешёвый роутер, который работает круглосуточно, позволяя экономить на покупке полноценного сервера.
    Может имелось ввиду "выигрывают в этом плане" - или вы думаете настроить опенвпн-сервер и организовать подключение клиентов через левый софт легче настройки другого сервера?

    Ответить
  3. Здравствуйте!
    Через sudo openvpn --config /etc/openvpn/server.conf
    а автоматом никак не стартует.
    Подсткажите, пожалуйсто, что можно сделать?

    Ответить
  4. Приветствую!
    Настроил, клиент подключается, но есть проблема.
    С клиента недоступна удаленная сеть (нет даже пинга), а из удаленной сети клиент вполне себе доступен.
    Уже и так и сяк пробовал, ничего не выходит...
    Настройка сервера:
    [code]
    port 1194
    proto udp
    dev tun
    tun-mtu 1500
    #mssfix
    ca ca.crt
    cert server.crt
    key server.key
    dh dh2048.pem
    server 172.23.104.0 255.255.255.0
    ifconfig-pool-persist ipp.txt
    push "route 172.23.11.0 255.255.255.0"
    push "redirect-gateway def1 bypass-dhcp"
    client-config-dir ccd
    push "dhcp-option DNS 172.23.11.100"
    client-to-client
    keepalive 10 60
    comp-lzo
    max-clients 10
    user nobody
    group nogroup
    persist-key
    persist-tun
    status openvpn-status.log
    log openvpn.log
    verb 3
    #;mute 20
    cipher AES-128-CBC
    auth SHA256
    tls-auth ta.key 0
    [/code]

    Настройка клиента:
    [code]
    client
    remote 1.2.3.4 1194
    dev tun
    proto udp
    nobind
    persist-key
    persist-tun
    ca ca.crt
    cert client1.crt
    key client1.key
    comp-lzo
    verb 3
    remote-cert-tls server
    cipher AES-128-CBC
    resolv-retry infinite
    auth SHA256
    auth-nocache
    tls-auth ta.key 1
    [/code]

    Если нужны правила фаервола, выложу.
    Ну могу понять в чем дело...

    Ответить
  5. Cоздаем ключ для tls-аутификации

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

    Вот об этом вообще не нужно было написать в статье?

    Не пользуйтесь данным руководством, оно не работает.

    Ответить
  6. статья не рабочая. Ошибки такие

    root@mint:/etc/openvpn/easy-rsa# source ./vars
    **************************************************************
    No /etc/openvpn/easy-rsa/openssl.cnf file could be found
    Further invocations will fail
    **************************************************************
    NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
    root@mint:/etc/openvpn/easy-rsa# ./clean-all
    root@mint:/etc/openvpn/easy-rsa# ./build-ca
    grep: /etc/openvpn/easy-rsa/openssl.cnf: No such file or directory
    pkitool: KEY_CONFIG (set by the ./vars script) is pointing to the wrong
    version of openssl.cnf: /etc/openvpn/easy-rsa/openssl.cnf
    The correct version should have a comment that says: easy-rsa version 2.x
    root@mint:/etc/openvpn/easy-rsa#

    Автору ставлю дизлайк, не советую использовать статью пока автор не исправит косяки

    Ответить
  7. вообще да, иду по шагам, и у меня ошибки с которыми я не знаю что делать:

    sudo -i
    :~# source ./vars
    -bash: ./vars: Нет такого файла или каталога
    :~# cd /etc/openvpn/easy-rsa/
    :/etc/openvpn/easy-rsa# source ./vars.example
    You appear to be sourcing an Easy-RSA 'vars' file.
    This is no longer necessary and is disallowed. See the section called
    'How to use this file' near the top comments for more details.

    Ответить
  8. Да, и установка Easy-rsa на клиенте тоже лишняя, генерим клиентские ключи на сервере, подписываем, и отсылаем на клиент

    Ответить
  9. В целом работает. В юзер.конф необязателен айпи адрес домен прекрасно схавал. Вопрос таков настроить настроил, но проблема такова что я интернетом, не могу пользоваться во время подключения и внутренние локальные адреса не доступны.

    Ответить
  10. Прошелся по шагам - есть пару незначительных ошибок в путях в целом все исправно на серверной части - сервер стартанул, пингуется 10.8.0.1 , но клиенты вне локалки присоединится не могут,конфиг переписывал несколько раз ни-фи-га...Скачал рандом конфиг с freeopenvpn все работает, т.е с пк траблов нету, правила для сетевого адаптара на NAT прописал на сервере - не помогло.......Гайд не рабочий от 18:38 18.02.2021

    Ответить
  11. UPD: рабочий клиент для подключение к серверу ( нужно было удалить comp-lzo)

    client
    dev tun
    dev-type tun
    remote yourIp 1194
    remote-random
    nobind
    persist-tun
    cipher AES-256-GCM
    auth SHA1
    verb 3
    mute 3
    push-peer-info
    ping 10
    ping-restart 60
    hand-window 70
    server-poll-timeout 5
    reneg-sec 2592000
    sndbuf 393216
    rcvbuf 393216
    max-routes 1000
    remote-cert-tls server
    auth-user-pass
    key-direction 1

    Ответить
  12. Господа, может кто-нибудь сможет мне подсказать.
    У меня имеются сервер, который подключен к локальной и внешней сети, на котором настроен файрволл, NAT и на котором поднят OpenVPN сервер, второй сервер, который находится за первым в локальной сети, и удалённый клиент. В UFW прописываю правило, разрешающее доступ из виртуальной сети (192.168.110.0/24) в локальную (192.168.10.0/24) (sudo ufw allow from 192.168.110.0/24 to 192.168.10.0/24; sudo ufw reload). И к серверу (его IP 192.168.10.42), который находится за VPN-сервером, получить доступ (например, по ssh или открыть веб-страницу) при подключении по VPN с удалённого клиента не получается, хотя пинги на него идут. К самому же VPN серверу по его локальному IP 192.168.10.254 подключения есть (проверял доступ по ssh), но ко всему, что находится за ним - нет. Если отключаю UFW - подключаться могу ко всем серверам локальной сети.
    Скажите пожалуйста, как настроить файрволл так, чтобы был доступ к нужным серверам в удалённой локальной сети?

    Ответить
  13. Спасибо. Инструкция рабочая. Роскомнадзор идет лесом.
    Единственное вот здесь опечатка по-моему:
    sudo openvpn --genkey --secret /etc/easy-rsa/pki/ta.key
    забыли про папку openvpn: /etc/openvpn/easy-rsa/pki/ta.key

    Ответить
  14. Сделал все по инструкции, вроде подключилось, ping 10.8.0.1 но страницы в браузере не открываются, либо открываются через раз, и очень медленно.

    Ответить
  15. Настраиваем диапазон адресов для виртуальной сети, наш сервер будет доступен по первому из них - 10.8.0.1:

    server 10.8.0.0 255.255.255.0

    Это всё прекрасно, но почему берется такой упрощенный пример?
    Если адрес VPN-сервера должен быть 10.8.0.100
    то как должна выглядеть конфиг-строка?

    Ответить
  16. Добрый день. Подскажите (надеюсь не совсем тупой вопрос, я новичек в линухах и сетевых технологиях). Здесь расписано как настроить VPN между 2 компьютерами. Мне же нужно выйти в интернет под VPN (из России некоторые нужные мне ресурсы недоступны). Это можно как то сделать? (в настройках сети в убунту 21.04 есть вкладка с настройкой VPN, только не решаюсь там что-то делать, не зная точно). Или все таки надо покупать подписку у сторонних VPN-серверов?

    Ответить
    • В любом случае нужен будет второй компьютер, которых находится в той сети, где нужные сервисы не заблокированные. На нём нужно настроить vpn сервер и к нему подключаться.

      Ответить
  17. дичь какая-то. пользовался вашим гайдом, пользовался скриптом с github, мануалом от hetzner community, но нифига не работает. server poll timeout - говорит десктопный windows openvpn

    Ответить
  18. Привествую. Все подключил по гайду 100% работае (автору + ) . Есть не большой момент : клиент1 пингует сервер, клиент 2 пингует сервер, клиент 1 не пингует клиент 2.
    Вирт сервер ubantu 20.04 . Клиент 1 вин 10. Клиент2 вин сервер 2019

    Ответить
  19. Добрый вечер! Я настраивал openVPN без данного мануала, однако, после старта сервера и подключения к нему двух клиентов из разных локальных сетей, пинг между каждым из клиентов и сервером ходит, при попытке пинговать с одного клиента другой клиент пинг не ходит, сервер на Ubuntu 18.04

    Есть еще одна особенность. При попытке подключиться с одного клиента на другой клиент виндовым RDP, сертификат запрашивает, проходит подключение и при этом перманентно висит синий экран и фраза "Подождите", больше ни чего не происходит.

    Сервер стоит на арендованном виртуальном сервере.

    Кто подскажет в какую сторону копать, буду благодарен!

    Ответить
  20. Добрый день!
    Все прекрасно подключается только если на клиенте указать путь к файлам ключей. Если же упаковать ключи в сам файл конфигурации, то не работает.

    Ответить
  21. Приветствую, поднял OpenVPN, внедряю все ключи в конфиг, дополняю даже эту опцию key-direction 1, не запускается. выдает ошибку TLS Error: cannot locate HMAC in incoming packet from [AF_INET]. Можете показать рабочий конфиг?

    Ответить
  22. В server.conf добавил/заменил:
    duplicate-cn
    cipher AES-256-GCM
    auth SHA512
    tls-server
    tls-version-min 1.2

    В клиентские конфиги добавил/заменил:
    cipher AES-256-GCM
    auth SHA512
    tls-client
    tls-version-min 1.2
    key-direction 1

    Что конкретно сработало - не проверял.

    Ответить
  23. При попытке запуска сервиса командой sudo openvpn /etc/openvpn/server.conf выдается следующая ошибка:

    OpenSSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch
    Cannot load private key file server.key
    Error: private key password verification failed

    Как решить?

    Ответить
  24. если подключение работает, а трафик не идёт, то проверяем форвардинг:
    cat /etc/sysctl.conf | grep ip_forward

    есть впереди строки решётка, то опция закомментирована:
    #net.ipv4.ip_forward=1

    включаем форвардинг:
    sysctl -w net.ipv4.ip_forward=1

    проверяем iptables:
    iptables -L -n

    если всё пустое, то повторно заполняем правила:
    sudo iptables -I FORWARD -i tun0 -o enp2s0 -j ACCEPT
    sudo iptables -I FORWARD -i enp2s0 -o tun0 -j ACCEPT
    sudo iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE

    Ответить
  25. Ошибка начинается при работе с файлом ta.key, а после уже не всё валидно в статье.
    Статья устарела и сейчас уже не имеет никакой ценности.
    Я выполнял последовательно наги и на команде
    sudo openvpn --genkey --secret /etc/easy-rsa/pki/ta.key
    уже всё пошло не так.
    Спасибо за статью, но она не рабочая уже!

    Ответить

Оставьте комментарий