Частная виртуальная сеть или 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 - порт и протокол, по которым будет работать программа;
Все созданные ключи нужно прописать в конфигурационном файле. Наши ключи хранятся по адресу /etc/openvpn, в самой папке с конфигурационным файлом, поэтому можно не прописывать к ним полный путь:
Настраиваем диапазон адресов для виртуальной сети, наш сервер будет доступен по первому из них - 10.8.0.1:
Следующая директива позволяет раздавать одним и тем же клиентам одни и те же IP адреса:
После завершения настройки сохраните изменения в файле, вы можете либо вставить всю эту конфигурацию себе или отредактировать файл с примером. Если убрать все комментарии получится такой конфигурационный файл:
Настройка сервера OpenVPN завершена. Дальше необходимо запустить OpenVPN сервер. Это можно сделать прямо из командной строки, просто укажите адрес конфигурационного файла:
sudo openvpn /etc/openvpn/server.conf
Если вы увидели сообщение Initialization Sequence Completed значит всё хорошо и можно двигаться дальше. Если возникли ошибки, исправьте их, скорее всего вы сделали что-то не то в конфигурационном файле. После этого остановите запущенный сервер и запустите его снова уже с помощью systemd:
sudo systemctl start openvpn@server
5. Настройка форвардинга пакетов
Для того чтобы OpenVPN сервер мог предоставить клиентам доступ к внешней сети сервера надо включить параметр ip_forwarding. Для этого откройте файл для этого выполните такую команду:
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 адрес сервера, который вы узнали ранее. Например:
Всё остальное можно оставить по умолчанию, сертификаты должны лежать в той же папке, в которой будет находится конфигурационный файл. В результате, если убрать все комментарии получится вот так:
Обратите внимание, что конфигурационные файлы должны максимально совпадать, отсутствие определенных опций в одном из файлов может привести к ошибкам. Это не значит, что файлы будут идентичны, но основные параметры openvpn должны быть одинаковыми. Например, если вы включили опцию comp-lzo для сервера, то она должна быть включена и для клиента.
Далее осталось всё это упаковать в архив и отправить клиенту. Но можно поступить по другому. Ключи для опций ca, cert, key и tls-auth можно упаковать в сам файл конфигурации. Например, для опции 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 для работы с аутентификацией по ключу. Организация частных виртуальных сетей может быть очень полезной не только в организациях, но и скажем для обмена данными между двумя вашими компьютерами или для повышения безопасности в сети.
спасибо за руководство, но есть ошибки а тексте - Настройка сертификатов клиента - команда
./clear-all, на скриншоте - ./clean-all
т. е. центра сертификации
"Настройка аутентификации сервера и клиента требует много работы, и поэтому коммерческие решения с минимумом настроек проигрывают в этом плане. " - Вообще не понял смысла фразы.
Я полагал что коммерческие решения - это недешёвый роутер, который работает круглосуточно, позволяя экономить на покупке полноценного сервера.
Может имелось ввиду "выигрывают в этом плане" - или вы думаете настроить опенвпн-сервер и организовать подключение клиентов через левый софт легче настройки другого сервера?
А какой смысл в этих правилах, когда после них не идут запрещающие?
iptables -I FORWARD -i tun0 -o eth0 -j ACCEPT
iptables -I FORWARD -i eth0 -o tun0 -j ACCEPT
Если политика по умолчанию запрещающая, а так обычно на производственных серверах, то в них есть смысл.
Здравствуйте!
Через sudo openvpn --config /etc/openvpn/server.conf
а автоматом никак не стартует.
Подсткажите, пожалуйсто, что можно сделать?
Используйте так:
sudo systemctl start openvpn@server (имя server от имени файла server.conf)
sudo systemctl status openvpn@server
sudo systemctl enable openvpn@server
Приветствую!
Настроил, клиент подключается, но есть проблема.
С клиента недоступна удаленная сеть (нет даже пинга), а из удаленной сети клиент вполне себе доступен.
Уже и так и сяк пробовал, ничего не выходит...
Настройка сервера:
[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]
Если нужны правила фаервола, выложу.
Ну могу понять в чем дело...
Cоздаем ключ для tls-аутификации
openvpn --genkey --secret keys/ta.key
Вот об этом вообще не нужно было написать в статье?
Не пользуйтесь данным руководством, оно не работает.
Созданием ключей занимается easy-rsa.
статья не рабочая. Ошибки такие
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#
Автору ставлю дизлайк, не советую использовать статью пока автор не исправит косяки
Дизлайк тебе. Это косяк easy-rsa https://github.com/OpenVPN/easy-rsa/issues/159
вообще да, иду по шагам, и у меня ошибки с которыми я не знаю что делать:
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.
Да, и установка Easy-rsa на клиенте тоже лишняя, генерим клиентские ключи на сервере, подписываем, и отсылаем на клиент
Под Ubuntu 20.04 уже не работает, там easy-rsa по другому настраивается
вот тут ошибка
sudo mkdir /etc/o e p nvpn/clients/losst
Спасибо, поправил.
В целом работает. В юзер.конф необязателен айпи адрес домен прекрасно схавал. Вопрос таков настроить настроил, но проблема такова что я интернетом, не могу пользоваться во время подключения и внутренние локальные адреса не доступны.
Не чего ты не поправил!
Прошелся по шагам - есть пару незначительных ошибок в путях в целом все исправно на серверной части - сервер стартанул, пингуется 10.8.0.1 , но клиенты вне локалки присоединится не могут,конфиг переписывал несколько раз ни-фи-га...Скачал рандом конфиг с freeopenvpn все работает, т.е с пк траблов нету, правила для сетевого адаптара на NAT прописал на сервере - не помогло.......Гайд не рабочий от 18:38 18.02.2021
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
Господа, может кто-нибудь сможет мне подсказать.
У меня имеются сервер, который подключен к локальной и внешней сети, на котором настроен файрволл, 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 - подключаться могу ко всем серверам локальной сети.
Скажите пожалуйста, как настроить файрволл так, чтобы был доступ к нужным серверам в удалённой локальной сети?
Спасибо. Инструкция рабочая. Роскомнадзор идет лесом.
Единственное вот здесь опечатка по-моему:
sudo openvpn --genkey --secret /etc/easy-rsa/pki/ta.key
забыли про папку openvpn: /etc/openvpn/easy-rsa/pki/ta.key
Сделал все по инструкции, вроде подключилось, ping 10.8.0.1 но страницы в браузере не открываются, либо открываются через раз, и очень медленно.
Настраиваем диапазон адресов для виртуальной сети, наш сервер будет доступен по первому из них - 10.8.0.1:
server 10.8.0.0 255.255.255.0
Это всё прекрасно, но почему берется такой упрощенный пример?
Если адрес VPN-сервера должен быть 10.8.0.100
то как должна выглядеть конфиг-строка?
Добрый день. Подскажите (надеюсь не совсем тупой вопрос, я новичек в линухах и сетевых технологиях). Здесь расписано как настроить VPN между 2 компьютерами. Мне же нужно выйти в интернет под VPN (из России некоторые нужные мне ресурсы недоступны). Это можно как то сделать? (в настройках сети в убунту 21.04 есть вкладка с настройкой VPN, только не решаюсь там что-то делать, не зная точно). Или все таки надо покупать подписку у сторонних VPN-серверов?
В любом случае нужен будет второй компьютер, которых находится в той сети, где нужные сервисы не заблокированные. На нём нужно настроить vpn сервер и к нему подключаться.
дичь какая-то. пользовался вашим гайдом, пользовался скриптом с github, мануалом от hetzner community, но нифига не работает. server poll timeout - говорит десктопный windows openvpn
Привествую. Все подключил по гайду 100% работае (автору + ) . Есть не большой момент : клиент1 пингует сервер, клиент 2 пингует сервер, клиент 1 не пингует клиент 2.
Вирт сервер ubantu 20.04 . Клиент 1 вин 10. Клиент2 вин сервер 2019
Сервер пингует оба клиента) забыл дописать..
Добрый вечер! Я настраивал openVPN без данного мануала, однако, после старта сервера и подключения к нему двух клиентов из разных локальных сетей, пинг между каждым из клиентов и сервером ходит, при попытке пинговать с одного клиента другой клиент пинг не ходит, сервер на Ubuntu 18.04
Есть еще одна особенность. При попытке подключиться с одного клиента на другой клиент виндовым RDP, сертификат запрашивает, проходит подключение и при этом перманентно висит синий экран и фраза "Подождите", больше ни чего не происходит.
Сервер стоит на арендованном виртуальном сервере.
Кто подскажет в какую сторону копать, буду благодарен!
Также и у меня... и RDP не цепляется до конца...
Добрый день!
Все прекрасно подключается только если на клиенте указать путь к файлам ключей. Если же упаковать ключи в сам файл конфигурации, то не работает.
При внедрении ключа tls-auth в сам файл конфигурации, необходимо еще добавить одну команду в конфиг:
key-direction 1
Спасибо тебе, добрый человек, я уж думал сервер с нуля переделывать.
Вместо
sudo openvpn --genkey --secret /etc/easy-rsa/pki/ta.key
Делайте
sudo openvpn --genkey secret /etc/openvpn/easy-rsa/pki/ta.key
Приветствую, поднял OpenVPN, внедряю все ключи в конфиг, дополняю даже эту опцию key-direction 1, не запускается. выдает ошибку TLS Error: cannot locate HMAC in incoming packet from [AF_INET]. Можете показать рабочий конфиг?
В 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
Что конкретно сработало - не проверял.
Это ответ Alex`у про TLS Error: cannot locate HMAC in incoming packet from [AF_INET]
Nachinaem chitat statiu. Napisano: "Na oboih mashinah dolzna bit' ustanovlena OpenVPN". Na kakih oboih?
При попытке запуска сервиса командой 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
Как решить?
если подключение работает, а трафик не идёт, то проверяем форвардинг:
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
Ошибка начинается при работе с файлом ta.key, а после уже не всё валидно в статье.
Статья устарела и сейчас уже не имеет никакой ценности.
Я выполнял последовательно наги и на команде
sudo openvpn --genkey --secret /etc/easy-rsa/pki/ta.key
уже всё пошло не так.
Спасибо за статью, но она не рабочая уже!
Здравствуйте! А я скажу СПАСИБО автору, у меня все взлетело. Разворачивал на Ubuntu 22.04, возникали мелкие проблемы , но они все гуглятся.
1. Вместо
sudo openvpn --genkey --secret /etc/easy-rsa/pki/ta.key
Будет
sudo openvpn --genkey secret /etc/openvpn/easy-rsa/pki/ta.key
Об этом нам сообщает сам терминал : WARNING: Using --genkey --secret filename is DEPRECATED. Use --genkey secret filename instead.
2. Не подключался с клиентской машины ругаясь на TLS, я не стал лесть в дебри и просто из конфига убрал текст всех сертификатов и ключей, раскомментировал пути:
ca ca.crt
cert clients.crt
key clients.key
tls-auth ta.key 1
Закинул их в папку с конфигом и все заработало.
Кстати, если использовать конфиг на виндовых машинах нужно поменять расширение с losst.conf на losst.ovpn
Что бы после перезагрузки vpn не ломался и не нужно было заново добавлять правила для форвардинга пакетов и разрешающие правила iptables проще сделать так:
1. вместо команды sysctl -w net.ipv4.ip_forward=1
прибить эту настройку гвозями в конфиг:
vim /etc/sysctl.conf
hаскомментировать\добавить строку:
net.ipv4.ip_forward=1
2. поставить пакет iptables-persistent
apt-get install iptables-persistent
в процессе настройки предложит сохранить текущие правила в файл.
по умолчанию сюда - /etc/iptables/rules.v4