OpenVPN
Создание сертификата для удалённого подключения
- Создание сертификатов
- Сборка файла конфигурации для пользователя
- Настройка маршрутов пользователя
- Проверка работоспособности конфига
- Удаление правил и отзыв сертификата
- Список выданных и отозванных сертификатов
- Сохранение правил iptables
- Отправление файлов пользователю
Создание сертификатов
Рабочие директории
/etc/openvpn/ccd – директория с конфигурацией пользователей
/etc/openvpn/easy-rsa/pki/issued – директория для подписанных сертификатов пользователей
/etc/openvpn/easy-rsa/pki/private – директоря для приватных ключей пользователей
/etc/openvpn/easy-rsa/easyrsa – утилита для генераци сертфикатов
Генерация сертификатов
1. Запускаем утилиту easyrsa
cd /etc/openvpn/easy-rsa/
./easyrsa gen-req fursov.m nopass
В процессе работы команды, будет задан вопрос о Common Name (основного имени сертификата).
Можно просто оставить пустым и нажать Enter.
После чего будут сгенерированы два файла *.req – запрос и *.key – закрытый ключ. Так же будут выведены пути, куда положила их программа.
2. Подписание запроса центром сертификации
Когда запрос сформирован, его необходимо подписать командой
./easyrsa sign-req client fursov.m
У вас уточнят, действительно-ли вы уверены, что вы выпускаете сертификат для данного пользователя.
Необходимо напечатать слово yes и нажать Enter
После подтверждения, будет запрошен пароль от CA, для подписания закрытым ключом и выпуска сертификата
Вбиваем пароль получаем подписанный сертификат.
Сборка файла конфигурации для пользователя
У нас на руках есть закрытый и открытый ключи пользователя, теперь из них необходимо собрать файл, при помощи которого пользователь сможет подключаться к сети Центра.
- Открываем блокнот, и кладем в него этот шаблон:
client
dev tun
proto udp
remote 195.9.131.215 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
cipher AES-256-CBC
key-direction 1
<ca>
-----BEGIN CERTIFICATE-----
MIIDHjCCAgagAwIBAgIJAK/2Z5IR0hJ2MA0GCSqGSIb3DQEBCwUAMA8xDTALBgNV
BAMMBHBldHIwHhcNMTgxMTIwMDg0ODU3WhcNMjgxMTE3MDg0ODU3WjAPMQ0wCwYD
VQQDDARwZXRyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtAluFx9N
2x29m5scKiHZMc7aISZG2pplP1/HgsOcHF+Dynn7QX0om/0bVmXIsYhTM+69zpAz
E1+Cz05//WIgkptdsaDN/PZ3jnN3YO5/4pwXmNciBR0sqgxE8Te/1sLxZ3DfYcId
cwAARmYraX+1/eADfuBnIXckJT355ec1UCCq9rWOKx4Kcic8NY70dkRWW0YzvW0/
O+oSWi1lck3w7d8GY3doLcy1MmGp6JSceJhlpJ0uJY0h47hcra8lmw3BRsZ9P7Wp
3e0pOqdUs6EEF9eVw6dRlTz760O+BtsNk1VP03FxnBbhfobdj4VulG1/G2an73G7
d1OJyYkhzqu24QIDAQABo30wezAdBgNVHQ4EFgQUMHhGjjVpCKWVMTLaAX3+kXJK
h8EwPwYDVR0jBDgwNoAUMHhGjjVpCKWVMTLaAX3+kXJKh8GhE6QRMA8xDTALBgNV
BAMMBHBldHKCCQCv9meSEdISdjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjAN
BgkqhkiG9w0BAQsFAAOCAQEAO0ASfcJszUuqoMYMBl3BC3fBu0yXOZwbKX9hX6T1
7hdQAwEqv+VE8w0Ja8fOKm3pKueZtyxWHP7t4lNjk8/sODXxfErhDqI0w+mBBUMs
FvNBN2MQpscVpW0AvrbxtMYvywMaMRdmrF9aw6Hb1rrZ9AYxC3KsCOPXyHG7ZnrR
R4zt0gCNhOmewbCXcC2hEFbFNvQAfVpB1dcEl9xLd4r2M1vhVwRpGUmnqhnWxhsF
RnNl0KjwzPzMybGijP66Ya0EVv+IeiG4ZKQKQzPf0rYz79DDnZHT1zbRFcHCqz7x
6+rtSuz8PUxq3B6Ee0DeubJZvTw+jMYesPoywX3hMJo90w==
-----END CERTIFICATE-----
</ca>
<key>
-----BEGIN PRIVATE KEY-----
Закрытая часть ключа
-----END PRIVATE KEY-----
</key>
<cert>
-----BEGIN CERTIFICATE-----
Открытая часть ключа
-----END CERTIFICATE-----
</cert>
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
38a041d63962b26c49e7f8f8419e23a8
b99e62ef7a34001c1a65b4b986195c1b
b8ea61c23cf922628ec1d5020babedc1
c4390b327aeeba9f06df3a680a2bf3d3
f9dc41c83511442073097512c90c27ce
c2fbce1708e34fe2ee797d19da83bcfa
c1dfa76e89456c3c0a48543bcb27f5a2
515b02cc0ea8b994d803c8123f08c2b4
7a3aeade557b90b75ca5275d1570033b
277621b89581faeabc5e2f81668ada18
184dcff965e7fd101147063972ff5062
44dc19f5078e535a9aad747c8efc671c
73b88e1810f71ac9b1ac2cef1fbdca53
cf701498ffa8995a59209f05597f853f
c844ecce0bc8ade8d6763fcabfc15a99
da7937c25e63c53d13d2b480da3b521d
-----END OpenVPN Static key V1-----
</tls-auth>
2. Далее открываем на сервере по очереди сертификат пользователя и его закрытый ключ, и вставляем содержимое в шаблон, вместо полей «Закрытая часть ключа» и «Открытая часть ключа»
cat /etc/openvpn/easy-rsa/pki/private/fursov.m.key
3. Берем ту часть, которая находится между строками BEGIN PRIVATE KEY и END PRIVATE KEY и вставляем ее в конфиг
4. Тоже самое и с открытой частью
cat /etc/openvpn/easy-rsa/pki/issued/fursov.m.crt
И не смотря на длинный вывод, так же берем только часть, между BEGIN CERTIFICATE и END CERTIFICATE и вставляем в конфиг.
5. Конфиг готов, сохраняем его себе на компьютер с расширением *.ovpn
Настройка маршрутов пользователя
1. Нам необходимо определить какой адрес будет у пользователя при подключении и куда ему разрешается ходить.
2. Для начала найдем свободный ip-адрес
grep -rn 10.8.0. /etc/openvpn/ccd
Команда grep пройдет по всем файлам в директории и выведет в консоль все совпадения с 10.8.0. – адресация openvpn
3. Выбираем любой адрес, которого нет в списке от 2 до 254
Проверить что вы не просмотрели свободный адрес, можно той же командой grep, вбив адрес целиком. К примеру:
grep -rn 10.8.0.38 /etc/openvpn/ccd - найдет в конфиге такой адрес и выведет его в консоль
grep -rn 10.8.0.119 /etc/openvpn/ccd – такого адреса нет, и в консоль ничего не выведет
4. Создаем конфигурационный файл пользователя
touch /etc/openvpn/ccd/fursov.m
5. Прописываем в нем конфигурацию
nano /etc/openvpn/ccd/fursov.m
ifconfig-push 10.8.0.111 255.255.255.0
push "route 10.10.20.105 255.255.255.255"
Ifconfig-push – какой адрес и какую маску присваивать клиенту
push route – какой маршрут ему давать (до какого узла внутри сети можно будет ходить). В данном случае задан один адрес, но при желании можно указать несколько.
push "route 10.10.20.105 255.255.255.255"
push "route 10.10.20.106 255.255.255.255"
push "route 10.10.20.107 255.255.255.255"
и т.д.
6. Сохраняем данный конфиг и оставляем в этой директории.
Настройка фаервола
6.1. На данном шаге у нас уже имеются сертификаты пользователя, его конфиг и настройка. Осталось добавить разрешающие правила в фаервол, чтобы сервер пропустил клиента к его рабочему месту.
6.2. В качестве фаервола на сервере настроен iptables
6.3. Чтобы посмотреть текущие настройки iptables, можно ввести команду
iptables -vnL
где ключи
v – verbose т.е. подробный вывод
n – numeric, вывод адресов в цифровом формате. По умолчанию он пытается вместо адресов прописать имена хостов
L – list. Собственно, вывести все содержимое
В ответ мы получим достаточно большую табличку с правилами.
Основными полями являются source (откуда) destination (куда) ну и комментарий, чтобы каждый раз не искать по конфигам, чей это адрес.
4. Для того чтобы добавить новое правило, пишем
iptables -I FORWARD -i tun0 -o eth0 -s 10.8.0.122/32 -d 10.10.10.96/32 -m conntrack --ctstate NEW -j ACCEPT -m comment --comment "fursov.m– 1C"
Соответственно -s источник отправления (наш адрес клиента), -d адрес назначения, куда мы ему разрешаем ходить. Ну и комментарий.
5. Если необходимо прописать еще и порт
iptables -I FORWARD -i tun0 -o eth0 -s 10.8.0.119/32 -d 10.10.21.151/32 -p tcp --destination-port 3389 -m conntrack --ctstate NEW -j ACCEPT -m comment --comment "fursov.m – 1C"
6. Еще раз выведем iptables и удостоверимся, что правило появилось
7. (Опционально) Перезапуск openvpn. На случай если при подключении от пользователя, по какой-то причине не применились правила, или что-то работает не корректно. При данном действии, у других пользователей могут порваться сессии, и он отвалятся.
systemctl restart openvpn@server
8. ОБЯЗАТЕЛЬНО ЗАРЕЗЕРВИРОВАТЬ IP КОМПЬЮТЕРА, ИНАЧЕ ПОСЛЕ СМЕНЫ IP НЕОБХОДИМО БУДЕТ МЕНЯТЬ ПРАВИЛО
Проверка работоспособности конфига
Удаление правил и отзыв сертификата
- Если случайно добавили не, то правило в iptables или старое просто нужно удалить, то в выводе команды iptables необходимо добавить еще один ключик –-line-numbers, который добавит в вывод нумерацию строк.
iptables -vnL --line-numbers
Для удаления нужного правила, просто вводим
iptables -D FORWARD номер
номер – собственно номер правила.
iptables -D FORWARD 1 – удалит наше правило.
Отзыв сертификата
Для отзыва сертификата, мы используем ту же самую утилиту easyrsa
./easyrsa revoke fursov.m
В процессе отзыва будет задан вопрос «уверены-ли вы», на который отвечаем yes
А так же будет запрошен пароль CA для отзыва сертификата
После отзыва сертификата, утилита в консоли напомнит, что необходимо будет обновить файлик crl – файл, в котором содержится список всех отозванных сертификатов.
Делается это в пару команд:
1. Генерация нового файла CRL:
/etc/openvpn/easy-rsa/easyrsa gen-crl
(запросит пароль CA)
2. Копирование его в нужную директорию:
cp /etc/openvpn/easy-rsa/pki/crl/pem /etc/openvpn/keys/crl.pem
Система спросит, перезаписать-ли файл, вводим – y
3. Перезапускаем сервер openvpn, чтобы настройки применились.
systemctl restart openvpn@server
Список выданных и отозванных сертификатов
Можно посмотреть в файле
cat /etc/openvpn/easy-rsa/pki/index.txt
R – Revoke, отозванный сертификат
V – Valid, действующий сертификат
Сохранение правил iptables
1. Если после внесения изменений в iptables, сервер перезагрузится, то те правила, которые были добавлены последние, не сохранятся.
Для сохранения правил используется команда
iptables-save > /etc/sysconfig/iptables_04_02_2025
2. Последняя часть в сохраняемом файле, просто дата сохранения, чтобы потом можно было понять в какой момент, какие изменения были внесены
3. Для восстановления правил, используем
iptables-restore < /etc/sysconfig/ iptables_28_01_2025
Отправление файлов пользователю
Если пользователю необходим доступ до своего компьютера
1. Не забываем добавить в dhcp резервирование его ip адреса, чтобы он не менялся, и пользователь всегда мог подключиться к своему компьютеру.
2. Не забываем положить сам клиент openvpn в архив, иначе пользователь может самостоятельно скачать что-нибудь не то.
3. Если пользователь будет подключаться по RDP, желательно так же сохранить ему в архив уже настроенный RDP файлик с его логином и адресом подключения.
4. Архив очень желательно запаролить.
P.S. Как альтернатива резервированию в dhcp, можно указать имя компьютера KP-WS-0001 к примеру. ДНС имя всегда актуально и обновляется вместе с ip адресом.