Статья Свой OpenVPN сервер на VPS Ubuntu

Привет Codeby !

1643734830936.png


В этой статье хотелось поделиться опытом настройки VPS и установки/настройки OVPN на Linux Ubuntu 20.04. Начал работать с линукс недавно и в процессе возникали подводные камни, которые вроде бы удалось побороть. В сети достаточно много мануалов по данной теме, но проблема в том, что та или иная инструкция не сработала для меня полностью, пришлось покурить несколько доков и в итоге собрать из них один. Плюс сразу добавить некоторые рекомендации по безопасности сервера. По идее все должно работать с данной ОС без проблем. Клиент подключаю из под WINды, но можно использовать любые другие клиенты, планирую подключать к сети свой смартфон. В итоге получаем свой VPN канал и левый ip-адрес, но пинги увеличатся и скорость передачи данных соответственно упадет (полностью побороть проблему со скорость пока не удалось), что в принципе не сильно заметно при серфинге, просмотре и тд. (зависит от ваших нужд)
Но обо всем по-порядку.


План такой :

1. Начальная (стандартная) настройка VPS сервера на Linux (покупку/админку и тд. рассматривать не буду, там все более-менее понятно)
2. Настройка SSH и подключение по сертификату.

3. Настройка сертификатов/конфигураций сервера и клиента OVPN


Начальная настройка VPS сервера на Linux :

Подключаться буду из под клиента на винде. Для подключения по SSH использую и вполне себе доволен этой утилитой. После того как узнали свой айпишник и права от рута, подключаемся к серверу, можно запустить в cmd (если putty была установлена в систему или добавлена в окружение) :

Код:
putty.exe user@server -pw password

Создаем нового пользователя и добавляем в группу sudo :
Код:
adduser codeby
usermod -aG sudo codeby
su - codeby

Проверяем статус брандмауэра и если надо, ключаем :
Код:
ufw status
ufw enable


И вот тут у меня появилась первая проблемка. В общем я отошел по делам, а вернувшись, понял, что коннект из лост и я вообще не могу достучаться до сервера по shh и отваливаюсь по тайм ауту. При условии что ни RDP ни VNC пакеты не установлены, на этом можно было бы и заканчивать настройку и звонить "местным" админам :D потому как я просто не знал, как же я могу еще попасть на сервак. Благо в админ панели есть браузерная VNC консоль и подключившись, я решил проблему с SSH.


Настройка SSH и подключение по сертификату :


Код:
sudo apt update
sudo apt install openssh-server
sudo systemctl status ssh
sudo ufw allow openssh

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

Далее создаем директорию и файл где будут храниться ключи и назначаем им права :
Код:
cd /home/codeby
mkdir .ssh
chmod 700 .ssh
cd .ssh
touch authorized_keys
chmod 600 authorized_keys

Создаем ключи в puttygen и записываем в файл authorized_keys :

1643735414983.png


Код:
cat >> authorized_keys << EOF сюда копируем публичный ключ из puttygen EOF

Сохраняем приватный ключ и добавляем в сессию putty в настройках SSH - Auth. После этого можем коннектится без ввода пароля под пользователем codeby@server
При подключении, вместо проверки по паролю, получим проверку криптографическую, соответствия публичного ключа, который добавили на сервер и нашего приватного.

Для безопасности отключаем вход под root по ssh и использование пароля в файле /etc/ssh/sshd_config а также повесим сервис ssh на нестандартный порт :
Код:
sudo nano /etc/ssh/sshd_config

PermitRootLogin no
PasswordAuthentication no
port xxxx

sudo ufw allow xxxx/tcp
sudo /sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport xxxx -j ACCEPT
sudo systemctl restart ssh

1643735834346.png


1643735845386.png



Настройка OpenVPN сервер/клиент :

Устанавливаем пакет, создаем директорию, копируем все скрипты в нашу новую директорию :
Код:
sudo apt install openvpn easy-rsa
mkdir etc/openvpn/easy-rsa
sudo cp –R /usr/share/easy-rsa /etc/openvpn/

Создаем pki директорию и файлы для генерации, генерируем ключи :
Код:
cd etc/openvpn/easy-rsa
sudo ./easy-rsa init-pki
sudo ./easy-rsa build-ca
sudo ./easy-rsa gen-dh
sudo ./easy-rsa gen-crl
openvpn --genkey --secret pki/ta.key

ca - серт центра сертификации (ставим пароль)
dh - ключ Диффи - Хелмана
crl - сертифкат отзыва
ta.key - ключ для TLS авторизации

Создаем сертификаты сервера и копируем все ключи в директорию openvpn (server - имя сервера) :
Код:
sudo ./easyrsa build-server-full server nopass
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

Копируем содержимое дефолтного серверного конфига в /etc/openvpn/server.conf :
Код:
zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf

Если убрать комментарии то дефолтный конфиг выглядит так (я добавил сжатие и указал вручную
обнулил буфер, для увеличения скорости) :
Код:
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
sndbuf 0
rcvbuf 0
comp-lzo

Стартуем сервер (если есть ошибки, проверяем конфиг и запускаем второй командой) :
Код:
sudo openvpn /etc/openvpn/server.conf
sudo systemctl start openvpn@server

Если все хорошо - наблюдаем сообщение :

1643736154383.png


Включаем форвардинг пакетов, настраиваем правила iptables и разрешаем в фаирволе, ens3 - название интерфейса смотрящего во внешнюю сеть интернет :
Код:
sysctl -w net.ipv4.ip_forward=1
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
sudo ufw allow 1194

Проходим процедуру создание конфигурации клиента, генерим сертификат, создаем директорию, переносим туда ключи :
Код:
sudo ./easyrsa build-client-full client nopass
sudo mkdir /etc/openvpn/clients
sudo mkdir /etc/openvpn/clients/client
cd /etc/openvpn/clients/uvpn
cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/clients/client/
cp /etc/openvpn/easy-rsa/pki/ta.key /etc/openvpn/clients/client/
cp /etc/openvpn/easy-rsa/pki/issued/client.crt /etc/openvpn/clients/client/
cp /etc/openvpn/easy-rsa/pki/private/client.key /etc/openvpn/clients/client/

Конфиг клиента :
Код:
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ./client.conf

Конфиг должен быть идентичен серверу, то есть поддерживать те же опции. Добавлено сжатие и строки обнуления буфера, строка redirect-gateway def1 добавляет маршрут по умолчанию (в интернет) через VPN - туннель (без нее айпишник не поменяется)
Код:
client
dev tun
proto udp
remote server_ip_address 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
redirect-gateway def1
sndbuf 0
rcvbuf 0
comp-lzo
<ca>
-----BEGIN CERTIFICATE-----
Тело сертификата
-----END CERTIFICATE-----
</ca>

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

<key>
-----BEGIN CERTIFICATE-----
Тело сертификата
-----END CERTIFICATE-----
</key>

<tls-auth>
-----BEGIN CERTIFICATE-----
Тело сертификата
-----END CERTIFICATE-----
</tls-auth>

Все готово. Ставим приложение на клиента и переносим клиентский конфиг (с помощью например). Должен подняться интерфейс - по дефолту в 10.8.0.0/24 подсети. Весь трафик будет идти через ваш ВПН-сервер.

Вы можете добавить дополнительную защиту, создав пользователя впн в системе и включить дополнительный запрос логина/пароля. Для этого надо найти файл openvpn-plugin-auth-pam.so библиотеки авторизации plugin и добавить в server.conf две строки с указанием директории tmp :
Код:
find / -name "openvpn-*auth-pam*.so" -print
mkdir /etc/openvpn/tmp
chmod 777 /etc/openvpn/tmp
sudo nano /etc/openvpn/server.conf

# добавляем в конфиг сервера
plugin путь до файла/openvpn-plugin-auth-pam.so login
tmp-dir /etc/openvpn/tmp

sudo useradd codebyvpn -s /sbin/nologin
sudo passwd codebyvpn

Чтобы включить опцию на клиенте, добавляем в конец клиентского конфига :
Код:
auth-user-pass

Теперь при подключении дополнительно будет запрашиваться логин/пароль


Спасибо за внимание !
 
Последнее редактирование:
предваритеьная настройка ок, но "Настройка OpenVPN сервер/клиент :" слишком долго. Зачем изобретать велосипед, когда давно существует
wget -O openvpn-install.sh && bash openvpn-install.sh

 
предваритеьная настройка ок, но "Настройка OpenVPN сервер/клиент :" слишком долго. Зачем изобретать велосипед, когда давно существует
wget -O openvpn-install.sh && bash openvpn-install.sh

Ну как минимум чтобы разобраться как он работает и настраивается не из коробки)
 
  • Нравится
Реакции: BlackHundred и MLNK
предваритеьная настройка ок, но "Настройка OpenVPN сервер/клиент :" слишком долго. Зачем изобретать велосипед, когда давно существует
wget -O openvpn-install.sh && bash openvpn-install.sh

Я согласен с @zvepb если всё делать скриптами(не своими) то дальше скиди не продвинешься. Тем более не всегда готовое решение подходит.
 
  • Нравится
Реакции: BlackHundred и TR1X
Я согласен с @zvepb если всё делать скриптами(не своими) то дальше скиди не продвинешься. Тем более не всегда готовое решение подходит.
Иногда бывает быстрее написать свой баш скрипт, чем разбираться в том что кто-то написал до тебя
 
Иногда бывает быстрее написать свой баш скрипт, чем разбираться в том что кто-то написал
Иногда бывает быстрее написать свой баш скрипт, чем разбираться в том что кто-то написал до тебя
Иногда лучше вообще не запускать чужие скрипты
 
Добрый день.
Подскажите, если у меня на впс стоит Wireguard, могу я поставить еще рядом OpenVPN что бы они не конфликтовали?
 
Здравствуйте. Никого не хочу обидеть, но как техническая статья, то она слабовата, не отличается какой-то оргинальностью, как настроить OpenVPN с минимальными настройками можно найти кучу мануалов в сети, тот же DigitalOcean имеет статью по настройке OpenVPN. Другое дело, если бы были расписаны более тонкие настройки, продвинутые. Что касается скриптов, я тоже когда-то делал, чтобы 2 скриптами все все скачалось, настроилось, запустилось и созадался конфиг файл для клиента. Только затрат на написании скрипта много, через год, возможно даный скртипт уже не будет работать, когда выпустят обновления, новые зависимости и прочее. Есть более быстрый способ установки VPN - Pritunl, например.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!