Openvpn
На разных версиях с Ubuntu OpenVPN ставится по-разному. Рассмотрим сборку на версии Ubuntu 20.0.4. Все будем производить на одном сервере, без установки CA-сервера на выделенную машину. Если есть свой CA-сервер, просто не выполняем соотвествующую главу данного руководства. И держим в уме, что именно сервер CA (Certificate Authority) нужен для подписания сертификатов клиентов. Клиент, сертификат которого не подписан CA, не подключится к нашему серверу.
Если делать совсем “по понятиям”, то CA сервер в то время, пока не передает ключи или crl (список отзыва сертификатов), должен быть отключен от сети или выключен. Ну или вообще сертификаты с него переность на флешке и никогда не подключать его в сеть.
Однако, распространять сертификат CA можно, т.к. для подписания сертификатов нужен (закрытый) ключ CA, который мы не отдаем и который, кроме того, обычно шифруется на пароль (и без пароля им воспользоваться не получится).
Создание сервера CA
Подготовка сервера
sudo apt update
sudo apt install easy-rsa
mkdir easyrsa
ln -s /usr/share/easy-rsa/* ~/easyrsa/
chmod 700 easyrsa
cd easyrsa
./easyrsa init-pki
Конфигурирование и создание CA
cat > ~/easyrsa/vars
set_var EASYRSA_REQ_COUNTRY "RUS"
set_var EASYRSA_REQ_PROVINCE "Moscow"
set_var EASYRSA_REQ_CITY "Moscow City"
set_var EASYRSA_REQ_ORG "Our Company Name"
set_var EASYRSA_REQ_EMAIL "sysadmin@company.ru"
set_var EASYRSA_REQ_OU "LLC"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
Энтер, контрол - D
cd ~/easyrsa
./easyrsa build-ca
Придумываем и вводим пароль, на который закрыт ключ вашего CA (и, соответствнно, весь CA)
Дальше по тексту предполагается, что на сервере с CA мы будем работать, находясь в каталоге easyrsa
Собственно OpenVPN
Подготовка
sudo apt update && sudo apt -y install openvpn easy-rsa
Если на этом сервере не конфигурировали EasyRSA
mkdir easyrsa
ln -s /usr/share/easy-rsa/* ~/easyrsa/
chmod 700 easyrsa
cd easyrsa
./easyrsa init-pki
cat > vars
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
Энтер, контрол-D
Сертификаты
Выполняем на сервере ВПН. Здесь наш ВПН-сервер именуется my_server. Но можно обзывать как угодно. Достаточно знать, что CN нашего сервера в нашем случае получится my_server
cd easyrsa
./easyrsa gen-req my_server nopass
Получившийся ключ копируем в каталог настроек:
sudo cp ~/easyrsa/pki/private/my_server.key /etc/openvpn/server/
Если CA сервер отделен, копируем запрос сертификата на него
cat ~/easyrsa/pki/reqs/my_server.req | ssh ca.server.domain.ru "cat > ~/easyrsa/pki/reqs/my_server.req"
На сервере, где CA:
cd ~/easyrsa; ./easyrsa import-req pki/reqs/my_server.req vpnserver
./easyrsa sign-req server vpnserver
HINT: Если мы свсе складываем по кучкам и сервера иаенуем по каким-то правилам, то можно без импорта, но по имени серта/req-файла:
cd ~/easyrsa; ./easyrsa sign-req server my_server
Для подтверждения надёжности источника запроса набираем Yes, после чего жмем Enter.
Даем ему пароль от ключа CA.
На выходе получаем наш серт от сервера vpnserver.crt
Если все делалось локально, копируем наши серт сервера и серт CA в каталог настроек
cp pki/issued/my_server.crt /etc/openvpn/server/my_server.crt
cp pki/ca.crt /etc/openvpn/server/
Или возвращаемся на наш сервер ВПН и с нашего сервера ВПН забираем эти серты с сервера CA себе в каталог настроек:
ssh ca.server.domain.ru "cat ~/easyrsa/pki/issued/vpnserver.crt" | sudo tee /etc/openvpn/server/my_server.crt
ssh ca.server.domain.ru "cat ~/easyrsa/pki/ca.crt" | sudo tee /etc/openvpn/server/ca.crt
Остальная криптография
Сервера
На ВПН сервере
cd ~/easyrsa
openvpn --genkey --secret ta.key
sudo cp ta.key /etc/openvpn/server/
Клиента
На сервере CA
cd ~/easyrsa
./easyrsa gen-req client-1 nopass
./easyrsa sign-req client client-1
Теперь едем на клиента и складываем все вместе.
На клиенте
mkdir client-1
cd client-1
ssh ca.server.domain.ru "cat easyrsa/client-1.key" | cat > client-1.key
ssh ca.server.domain.ru "cat easyrsa/client-1.crt" | cat > client-1.crt
ssh ca.server.domain.ru "cat easyrsa/ta.key" | cat > ta.key
ssh ca.server.domain.ru "cat easyrsa/pki/ca.crt" | cat > ca.crt
Конфиг файл
Первый способ:
zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | grep -Ev ^$\|^#\|^\; | sudo tee /etc/openvpn/server/my_server.conf
Вместо dh dh2048.pem ставим
dh none
Комментируем строку tls-auth и вставляем
tls-crypt /etc/openvpn/server/ta.key
Меняем AES-256-CBC на AES-256-GCM и добавляем строку auth SHA256. В результате получаем
cipher AES-256-GCM
auth SHA256
Добавляем
user nobody
group nogroup
Пути к сертам и ключам пишем полностью.
Второй способ
cat > /etc/openvpn/server/my_server.conf
port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/my_server.crt
key /etc/openvpn/server/my_server.key
dh none
server 10.18.192.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.4.4"
keepalive 10 120
tls-crypt /etc/openvpn/server/ta.key # This file is secret
cipher AES-256-GCM
auth SHA256
user nobody
group nogroup
persist-key
persist-tun
;status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 1
Энтер, контрол-D
Конфигурация сети на сервере OpenVPN
Разрешаем port forwarding
sudo tee -a /etc/sysctl.conf
net.ipv4.ip_forward = 1
Энтер, Контрол-D
sudo sysctl -p
Включаем port forwarding через firewall
Определяем основной сетевой интерфейс
ip route list default
Его можно увидеть после параметра dev, например здесь - ens3
default via 89.10.11.12 dev ens3 onlink
С учетом этого вписываем этот параметр в конфиг в строке POSTROUTING -o ens3 -j MASQUERADE
Это все вписыается в самый верх файла /etc/ufw/before.rules в составе блока:
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0] # Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)
-A POSTROUTING -o ens3 -j MASQUERADE
COMMIT
# END OPENVPN RULES
Кроме того, не отбрасываем, а принимаем пакеты форвардинга.
В файле /etc/default/ufw изменяется значение DEFAULT_FORWARD_POLICY с DROP на ACCEPT. Нужная строка будет выглядеть так:
DEFAULT_FORWARD_POLICY="ACCEPT"
Теперь конфгурим фаервол:
sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
sudo ufw disable
sudo ufw enable
Запуск OpenVPN
sudo systemctl -f enable openvpn-server@my_server.service
sudo systemctl start openvpn-server@my_server.service
Если оно ругается, то проверяем, чтобы конфиг показывал на существующие файлы криптографии.
Если даже не ругнулось, проверяем статуc VPN:
sudo systemctl start openvpn-server@my_server.service
Troubleshooting
Если при старте ругается, хотя все упомянутые в конфиге файлы существуют и указаны правильно, проверяем местоположение конфига, где он должен быть. Его можно узнать из юнит-файла. Юнит указан в ответе на
systemctl status openvpn-server@my_server.service | grep enabled
В нашем случае он тут:
/lib/systemd/system/openvpn-server@.service
Находим в нем строку WorkingDirectory:
grep WorkingDirectory /lib/systemd/system/openvpn-server@.service
Оно покажет каталог, в котором должен лежать конфиг. В нашем случае
WorkingDirectory=/etc/openvpn/server
Если ВПН не завелся, оно все равно будет пытаться его запустить, поэтому “останавливаем” наш openvpn.
systemctl stop openvpn-server@my_server.service
Конфиг должен называться так же, как слово между @ и .service в командах запуска, остановки или проверки статуса. В нашем случае конфиг должен находиться в файле
/etc/openvpn/server/my_server.conf
Убеждаемся, что он там есть и проверяем его содержимое. Оно должно соответствовать тому, о чем мы говорили в разделе про конфиг.
Конфиг клиента
Inline
Изменяемые значения помещены в угловые скобки. В реальном конфиге подчеркивания писать не надо, просто ставим туда значения.
По сути, понадобятся:
_ip_address_ - IP-адрес сервера
_CACERT_ - сертификат вашего CA
_client_cert_ - сертификат клиента
_client_key_ - ключ клиента
_ta-key_ - Shared ключ шифрования.
Все эти ключи и сертификаты мы создавали при выполнении этапов, описанных выше.
client
dev tun
proto udp
remote _ip_address_ 1194
resolv-retry infinite
nobind
persist-key
persist-tun
<ca>
-----BEGIN CERTIFICATE-----
_CACERT_
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
_client_cert_
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
_client_key_
-----END PRIVATE KEY-----
</key>
remote-cert-tls server
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
_ta-key_
-----END OpenVPN Static key V1-----
</tls-auth>
key-direction 1
cipher AES-256-CBC
verb 3
Кучкой файлов