OpenVPN сервер на Ubuntu 22.04
|
Где взять VPS(виртуальную машину) и как к ней подключится?
Я лично использовал justhost или Айхор и брал самую дешёвую виртуалку в Нидерландах.
Далее будет инструкция по подключению:
-
Зарегистрироваться, оплатить VPS
-
Пока Вы ждёте её включение, скачайте PuTTy (скачать)
-
Когда VPS запустилась, Вам на почту по которой вы регистрировались приходит письмо, в котором есть пароль от пользователя root, и IPv4 адрес, запоминаем их
-
Открываем PuTTy и в поле Host Name (or IP address) вводим ip (IPv4) адрес который мы запомнили из письма и нажимаем Open
-
Соглашаемся (Accept) с предупреждением о безопасности (оно появляется 1 раз)
-
Если вы увидели надпись login as: , то Вы подключились
-
Вводим root и при запросе пароля вводим пароль из письма
Создание нового пользователя и вход под ним (по соображениям безопасности)
-
useradd -m <любое имя пользователя>
-
passwd <имя созданного ранее пользователя>
-
usermod -aG sudo <имя созданного ранее пользователя>
-
sudo chsh -s /bin/bash <имя созданного ранее пользователя>
Подключаемся заново и входим под ранее созданным пользователем
Предварительная подготовка
Установка пакетов
-
sudo apt install easy-rsa
-
sudo apt install openvpn
-
sudo apt install iptables-persistent
Настройка FireWall
-
sudo iptables -I INPUT -p udp --dport 1194 -j ACCEPT
-
sudo netfilter-persistent save
Настройка директорий VPN
-
sudo mkdir -p /etc/openvpn/keys
-
sudo mkdir /etc/openvpn/easy-rsa
-
cd /etc/openvpn/easy-rsa
-
sudo cp -r /usr/share/easy-rsa/* .
-
Создадим директорию для конфигураций клиентов
sudo mkdir /etc/openvpn/ccd
Настройка VPN
Конфигурируем конфиги
Настройка vars
-
sudo nano /etc/openvpn/easy-rsa/vars
-
В открывшийся интерфейс вставляем:
export KEY_COUNTRY="RU" export KEY_PROVINCE="Moscow" export KEY_CITY="Moscow" export KEY_ORG="sten" export KEY_ORG="sten@example.com" export KEY_CN="sten" export KEY_OU="sten" export KEY_NAME="vpn.StenLi.com" export KEY_ALTNAMES="vpn2.StenLi.com"
KEY_ORG, KEY_ORG, KEY_CN, KEY_OU, KEY_NAME, KEY_ALTNAMES — можно указывать всё, что угодно
-
Для выхода с сохранением нажимаем по порядку: ctrl+x, y, enter
Настройка /etc/nat (FireWall)
-
sudo nano /etc/nat
-
В открывшийся интерфейс вставляем:
#!/bin/sh # Включаем форвардинг пакетов echo 1 > /proc/sys/net/ipv4/ip_forward # Сбрасываем настройки брандмауэра iptables -F iptables -X iptables -t nat -F iptables -t nat -X # Разрешаем инициированные нами подключения извне iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешаем подключения по SSH iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT # Разрешаем подключения к OpenVPN iptables -A INPUT -i eth0 -p udp --dport 1194 -j ACCEPT # Разрешает входящий трафик из tun0 iptables -A INPUT -i tun0 -j ACCEPT # Разрешает транзитный трафик между eth0 и tun0 (Название eth0 может отличаться): iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT iptables -A FORWARD -i tun0 -o eth0 -j ACCEP # Запрещаем входящие извне iptables -A INPUT -i eth0 -j DROP # Разрешаем инициированные нами транзитные подключения извне iptables -A FORWARD -i eth0 -o tun0 -m state --state ESTABLISHED,RELATED -j A # Запрещаем транзитный трафик извне iptables -A FORWARD -i eth0 -o tun0 -j DROP # Включаем маскарадинг для локальной сети iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -j MASQUERADE
Узнать имена сетевых интерфейсовip link show
-
Что бы сохранить и выйти нажимаем по порядку: ctrl+x, y, enter
-
sudo chmod 755 /etc/nat
Создание ключей сервера
-
sudo ./easyrsa init-pki -
Создаём каталог PKI -
sudo ./easyrsa build-ca -
Создаем корневой сертификатВводим пароль сертификата CA и запоминаем его "Enter New CA Key Passphrase"
Полученные файлы будут расположены в:
/etc/openvpn/easy-rsa/pki/ca.crt
/etc/openvpn/easy-rsa/pki/private/ca.key -
Создаем запрос на сертификат для сервера и генерируем сам сертификат
(вместо имени «vpn-server» указать своё имя сервера). Добавить опцию nopass.
Без этого файл запроса будет защищен паролем, что впоследствии может привести к проблемам с разрешениямиsudo ./easyrsa gen-req vpn-server nopass
sudo ./easyrsa sign-req server vpn-server
После ввода команды подтверждаем правильность данных, введя yes, и вводим пароль, который указывали при создании корневого сертификата.
Полученные файлы будут расположены в:
/etc/openvpn/easy-rsa/pki/issued/server.crt
/etc/openvpn/easy-rsa/pki/private/server.key -
Формируем ключ dh Диффи-Хеллмана:
sudo ./easyrsa gen-dh
Полученный файл будет расположен в:
/etc/openvpn/easy-rsa/pki/dh.pem -
Создадим ta ключ, чтобы использовать параметр tls-auth, добавив дополнительную проверку целостности. Это обеспечит дополнительный уровень безопасности протокола SSL/TLS:
sudo openvpn --genkey --secret pki/ta.key
Полученный файл будет расположен в:
/etc/openvpn/easy-rsa/pki/ta.key -
Далее копируем всё созданное в папку /etc/openvpn/keys/
sudo cp pki/ca.crt /etc/openvpn/keys/
sudo cp pki/issued/vpn-server.crt /etc/openvpn/keys/
sudo cp pki/private/vpn-server.key /etc/openvpn/keys/
sudo cp pki/dh.pem /etc/openvpn/keys/
sudo cp pki/ta.key /etc/openvpn/keys/
Настройка сервера
Создадим конфигурационный файл сервера:
sudo nano /etc/openvpn/server.conf
И приводим его к виду:
local 999.999.999.999
port 1194
proto udp
dev tun
ca keys/ca.crt
cert keys/vpn-server.crt
key keys/vpn-server.key
dh keys/dh.pem
tls-auth keys/ta.key 0
server 10.0.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-to-client
client-config-dir /etc/openvpn/ccd
keepalive 10 120
max-clients 32
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 4
mute 20
daemon
mode server
tls-server
comp-lzo
tun-mtu 1500
mssfix 1620
cipher AES-256-GCM
topology subnet
push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"
up /etc/nat
-
client-to-client
даёт возможность клиентам видеть и общаться друг с другом в локальной сети
-
client-config-dir /etc/openvpn/ccd
мы указываем директорию в которой задаём статические ip адреса клиентам. Об этом позже
local 999.999.999.999
на local <внешний ip VPS(IP по которому вы подключались через PuTTy)
Запуск сервера
-
sudo systemctl start openvpn@server
-
sudo systemctl status openvpn@server
-
Сервер запустился!!!! УРА!!!!
Генерация сертификатов
-
cd /<Любая удобная вам директория>
-
sudo nano gen_sert.sh
-
Вставляем в открывшееся окно:
#!/bin/bash if [ $# -ne 1 ]; then echo "Usage: $0 --client-name" exit 1 fi client_name=$1 password="" rm -r /tmp/keys mkdir /tmp/keys cd /etc/openvpn/easy-rsa export EASYRSA_CERT_EXPIRE=1460 echo "$password" | ./easyrsa build-client-full $client_name nopass cp pki/issued/$client_name.crt pki/private/$client_name.key pki/ca.crt pki/ta.key /tmp/keys/ chmod -R a+r /tmp/keys cat << EOF > /tmp/keys/$client_name.ovpn client resolv-retry infinite nobind remote 999.999.999.999 1194 proto udp dev tun comp-lzo ca ca.crt cert $client_name.crt key $client_name.key tls-client tls-auth ta.key 1 float keepalive 10 120 persist-key persist-tun tun-mtu 1500 mssfix 1620 cipher AES-256-GCM verb 0 EOF echo "OpenVPN client configuration file created: /tmp/keys/$client_name.ovpn"
Сгенерированный набор клиентских файлов скрипт будет складывать сюда: /tmp/keys/Забираем их при помощи WinSCP -
Заменяем
remote 999.999.999.999 1194
наremote <IP сервера> 1194
-
Перейти в директорию которую создали в первом пункте "cd /<Любая удобная вам директория>" (каждый раз при создании нового сертификата пользователя)
-
sudo bash ./gen_sert.sh <Имя сертификата>
например:
sudo bash ./gen_sert.sh user1
Система попросит ввести сначала пароль sudo а потом спросит пароль "ca" (который установили ранее)
/etc/openvpn/easy-rsa/pki/issued/user1.crt
/etc/openvpn/easy-rsa/pki/private/user1.key
Посмотрим что там:
cd /tmp/keys
С помощью winscp достаем из этих директорий файлы.
Вот такой список файлов должен получиться для передачи клиенту:
/etc/openvpn/easy-rsa/pki/ta.key
/etc/openvpn/easy-rsa/pki/ca.crt
/etc/openvpn/easy-rsa/pki/issued/user1.crt
/etc/openvpn/easy-rsa/pki/private/user1.key
С помощью winscp скачиваем всё в одну папку, архивируем и передаём клиенту.
Задание статических адресов клиентам
-
cd /etc/openvpn/ccd
-
sudo nano <Имя сертификата который вы указали при создании> Например: sudo nano user1
-
Вставляем в открывшееся окно:
ifconfig-push 10.0.0.<адрес который не будет меняться, адреса не должны повторяться> 255.255.255.0
Например:
ifconfig-push 10.0.0.3 255.255.255.0
и так далее... Готово !
Дополнительные материалы: