Връзката OpenVPN на Windows Server и Mikrotik с миграция на това в Linux

Добро утро!

На всяка фирма рано или късно, внезапно, става необходим отдалечен достъп.
С необходимостта да организира отдалечен достъп до своите мрежи в предприятието се сблъсква практически всеки ИТ специалист.

На мен, както и на много други, тази необходимост дойде с детайлите "вчера". След като анализирах всички "за" и "против", а също и прегледах тонове информация и се покопах малко в теорията, реших да започна инсталацията.

С цел безопасност, избрах OpenVPN в следната реализация: на сървър с операционна система Windows Server 2012 беше инсталирана виртуална машина, на която също имаше Windows Server 2012, а на него, от своя страна, сървър OpenVPN, който издаваше и подписваше сертификати.

За удобство, нека го наречем "сервер за сертификация". След това взех сертификата на сървъра, натъпках го в Mikrotik и на самия маршрутизатор Mikrotik стартирах OpenVPN с акаунти и профили. За издаването на клиента сертификат също използвах сертификационния сървър.

Реализацията, разбира се, беше ужасна и, макар че по онова време опитът ми в подобни неща не беше достатъчен, по въпросите на осигуряването на безопасността, това не беше най-лошото решение.

Тази комбинация работи известно време и ми беше дадена нова задача: да преместя сървъра за сертификация на Linux, при което връзката с Mikrotik да бъде запазена — клиентите не трябва да пострадат.

Знанията ми по Linux по онова време свършваха на Ubuntu 16.04LTS с графичен интерфейс, който се използваше като терминал за свързване по RDP към Windows сървъра. Тоест, sudo apt-get -f install -y и ни сантиметър повече.

Изследвайки въпроса, коя операционна система от семейството на Linux е по-устойчива и перспективна за моята организация, реших да избера CentOS 7 Minimal.

Първо реших да поразгледам малко теория, за да разбера как е устроено и работи. Гледах видео уроци на канала www.youtube.com/channel/UCKdRgZWgy42YxoFcTJ30LTA (Изобщо не е реклама, просто ми попаднаха първи). Момичето с приятен глас ме запозна с основите на работата в избраната операционна система.

Първо стартирах Hyper-V на компютъра си, инсталирах там CentOS 7 Minimal, по време на инсталацията създадох потребител Admin и изцяло затворих ssh за root. След като се сбогувах с красивия разноцветен екран, се потопих в черно-бялата реалност на терминала.

Мисля, че няма смисъл да описвам процеса на инсталиране на софтуера, по-добре е да акцентирам на проблемите, които възникнаха в процеса, и за решаването на които ми се наложи да напиша малък скрипт (той е по-долу. Описание на всяка от утилитите можете да намерите в интернет, но в момента, в който правех това, този скрипт все още не съществуваше, всичко ставаше за първи път, на сляпо и случаен принцип).

В скрипта се опитах да автоматизирам инсталацията на минимално необходимите утилити за сървъра, да деактивирам Selinux, да свържа хранилището Epel, да инсталирам OpenVPN и т.н. По-долу е самият скрипт, той е прост, но може да се използва. Няма да го разглеждам подробно, но ако някому е нужен, пишете, ще отговоря.

След използването на скрипта ще получите вече настроен OpenVPN сървър, мигащ с зеленото око.

#!/bin/bash
cd /etc/sysconfig/
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' selinux
sudo setenforce 0
cd /home/Admin
sudo yum update -y
sudo yum install epel-release -y
sudo yum install mc -y
sudo yum install nano -y
sudo cp /usr/share/mc/syntax/sh.syntax /usr/share/mc/syntax/unknown.syntax
sudo yum install chrony -y
sudo systemctl start chronyd
sudo systemctl enable chronyd
sudo yum install net-tools -y
sudo yum install iftop -y
sudo yum install htop -y
sudo yum install lsof -y
sudo yum install dos2unix -y
sudo yum install wget -y
sudo yum install tcpdump -y
sudo yum install openvpn -y
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.3/EasyRSA-3.0.3.tgz
sudo tar -xvzf EasyRSA-3.0.3.tgz
sudo chown -R Admin:Admin /var/log
sudo chmod 755 /var/log
mkdir /var/log/openvpn
mkdir /etc/openvpn/ccd	
sudo chown -R Admin:Admin /etc/openvpn/ccd
sudo chown -R Admin:Admin /var/log/openvpn
chmod 755 /etc/openvpn/ccd
chmod 755 /var/log/openvpn
echo >/var/log/openvpn/openvpn-status.log
echo >/var/log/openvpn/openvpn.log
sudo chown -R Admin:Admin /etc/resolv.conf
chmod 755 /etc/resolv.conf
echo  nameserver 8.8.8.8 >>/etc/resolv.conf
cd /etc/openvpn/ 
sudo /home/Admin/EasyRSA-3.0.3/easyrsa init-pki
sudo chown -R Admin:Admin /etc/openvpn
chmod 755 /etc/openvpn
 echo  set_var EASYRSA_DN "org" >/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_REQ_COUNTRY "RU" >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_KEY_SIZE 4096 >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_REQ_PROVINCE "LIP" >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_REQ_CITY "Lipetsk" >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_REQ_ORG "Cool-Admin" >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_REQ_EMAIL "xxx.ru" >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_REQ_OU "Our_ORG" >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_REQ_CN "changeme" >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_CERT_EXPIRE 3650 >>/home/Admin/EasyRSA-3.0.3/test
 echo	set_var EASYRSA_DH_KEY_SIZE=2048 >>/home/Admin/EasyRSA-3.0.3/test
sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-ca nopass
sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-server-full Serv nopass
sudo /home/Admin/EasyRSA-3.0.3/easyrsa build-client-full Client1 nopass
sudo /home/Admin/EasyRSA-3.0.3/easyrsa --vars=vars gen-dh
sudo /home/Admin/EasyRSA-3.0.3/easyrsa --vars=vars gen-crl
 mkdir keys
sudo chown -R Admin:Admin /etc/openvpn/keys
chmod 755 /etc/openvpn/keys
sudo cp /etc/openvpn/pki/ca.crt /etc/openvpn/keys
sudo cp /etc/openvpn/pki/dh.pem /etc/openvpn/keys
sudo cp /etc/openvpn/pki/crl.pem /etc/openvpn/keys
sudo cp /etc/openvpn/pki/issued/Serv.crt /etc/openvpn/keys
sudo cp /etc/openvpn/pki/private/Serv.key /etc/openvpn/keys
echo port 443 						>/etc/openvpn/server.conf
echo proto udp					>>/etc/openvpn/server.conf
echo dev tun						>>/etc/openvpn/server.conf
echo ca /etc/openvpn/keys/ca.crt			>>/etc/openvpn/server.conf		
echo cert /etc/openvpn/keys/Serv.crt			>>/etc/openvpn/server.conf
echo key /etc/openvpn/keys/Serv.key		>>/etc/openvpn/server.conf
echo dh /etc/openvpn/keys/dh.pem			>>/etc/openvpn/server.conf
echo crl-verify /etc/openvpn/keys/crl.pem		>>/etc/openvpn/server.conf
echo client-config-dir /etc/openvpn/ccd		>>/etc/openvpn/server.conf
echo topology subnet					>>/etc/openvpn/server.conf
echo server 172.21.0.0 255.255.255.0		>>/etc/openvpn/server.conf
echo route 172.21.0.0 255.255.255.0			>>/etc/openvpn/server.conf
echo push "dhcp-option DNS 8.8.8.8"		>>/etc/openvpn/server.conf
echo push "dhcp-option DNS 8.8.4.4"		>>/etc/openvpn/server.conf
echo keepalive 10 120				>>/etc/openvpn/server.conf
echo persist-key					>>/etc/openvpn/server.conf
echo persist-tun					>>/etc/openvpn/server.conf
echo status /var/log/openvpn/openvpn-status.log	>>/etc/openvpn/server.conf
echo log-append /var/log/openvpn/openvpn.log	>>/etc/openvpn/server.conf
echo verb 2						>>/etc/openvpn/server.conf
echo mute 20						>>/etc/openvpn/server.conf
echo daemon						>>/etc/openvpn/server.conf
echo mode server					>>/etc/openvpn/server.conf
echo user nobody					>>/etc/openvpn/server.conf
echo group nobody					>>/etc/openvpn/server.conf
sudo chown -R Admin:Admin /etc/sysctl.conf
chmod 755 /etc/sysctl.conf
echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
sudo systemctl enable openvpn@server
sudo systemctl start openvpn@server
sudo systemctl status openvpn@server

Инсталацията на OpenVPN не премина много успешно.

Не знаейки за особеностите на политиката за права в Linux системите, прекарах много време в изучаване на логовете и задаване на необходимите права на всички файлове.

Когато бутонът за OpenVPN стана зелен, много се зарадвах, но се оказа, че това беше само началото. Заради чиста душевност, се надявах да подменя кореновите сертификати и файла crl.pem, с надеждата, че всичко ще заработи. В крайна сметка, ми се наложи да прехвърля следните файлове от сървъра на Windows:

Serv.crt — Сертификат на сървъра
Serv.key — Ключ на сървъра
Ca.crt — Коренов сертификат
Ca.key — Коренов ключ
Crl.pem — Файл с отзовани сертификати
Dh.pem — ключ на Диффи-Хелмана
Index.txt — Файл с информация за актуалните сертификати
Serial — той също отговаря за актуалността на сертификатите

Също така бяха необходими папка certs_by_serial, файл vars и всички клиентски ключове и сертификати.
На Mikrotik сертификатите остават на място, затова всичко проработи.

Проблемите се появиха, когато се опитах да отзова сертификат, това не работеше изобщо — файлът index.txt трябваше да бъде преобразуван в unix формат, а аз не го направих веднага. Използвах утилитата dos2unix.

Сега сертификатите се отзоваваха, но продължаваха да работят без никакви проблеми, защото Mikrotik не знаеше, че са отзовани и трябваше по някакъв начин да му съобщя за това.

Прочитайки инструкциите и след като се консултирах с Александър ЕРИ (голямо благодаря!), настроих прост http сървър Apache на сървъра за сертификация и публикувах файла с оттеглени сертификати на него. Напълно затворих достъпа до него, освен до публикувания файл от един ip.

В терминала Mikrotik, в раздела /System/Certificates/CRL указах пътя към публикувания crl.pem. Тук следва да уточня, че Mikrotik приема само http и абсолютен адрес за раздела CRL, т.е. той трябваше да изглежда приблизително така: 127.0.0.1/crl/1.crl
Всичко проработи, поне за версии 6.4.2.x RouterOS, но клиентските конфигурации трябваше да се създават ръчно, което ми беше неприятно и причиняваше много неудобства. Когато след седмица ми се наложи да създам конфигурации за около 50 клиенти, реших да ускоря този процес и за това използвах парче чужд скрипт, намерен в интернет.

Скриптът работи така: след стартиране посочваме „името на клиента“, отговаряме на въпроса „да установим ли парола или не“, след това взимаме готовия конфигурационен файл „клиент.ovpn“, с интегрирани в него сертификати и настройки. За да го използваме, трябва да се намираме в /etc/openvpn. Аз ще коментирам редовете, в които пътят трябва да бъде сменен с вашия. Също така е необходимо да се създаде файл с настройките на клиента, за да може скриптът да ги вмъква в процеса на създаване на конфигурацията.

#!/bin/bash
function newClient () {
	echo ""
	echo "Tell me a name for the client."
	echo "Use one word only, no special characters."

	until [[ "$CLIENT" =~ ^[a-zA-Z0-9_]+$ ]]; do
		read -rp "Client name: " -e CLIENT
	done

	echo ""
	echo "Do you want to protect the configuration file with a password?"
	echo "(e.g. encrypt the private key with a password)"
	echo "   1) Add a passwordless client"
	echo "   2) Use a password for the client"

	until [[ "$PASS" =~ ^[1-2]$ ]]; do
		read -rp "Select an option [1-2]: " -e -i 1 PASS
	done

	#cd /etc/openvpn/easy-rsa/ || return
	case $PASS in
		1)
		sudo /home/admin/EasyRSA-3.0.3/easyrsa build-client-full "$CLIENT" nopass
		;;
		2)
		echo "You will be asked for the client password below"
			./easyrsa build-client-full "$CLIENT"
		;;
	esac
# Generates the custom client.ovpn
	cp /etc/openvpn/client-template.txt "$home/home/admin/IT/Temp/$CLIENT.ovpn" 
#Директория в которой хранится файл с настройками клиента.
#Директория, в которой сформируется файл конфигурации
	{
		echo "<ca>"
		cat "/etc/openvpn/pki/ca.crt" #Директория хранения корневого сертификата
		echo "</ca>"

		echo "<cert>"
		awk '/BEGIN/,/END/' "/etc/openvpn/pki/issued/$CLIENT.crt" #Директория с созданным #сертификатом клиента
		echo "</cert>"

		echo "<key>"
		cat "/etc/openvpn/pki/private/$CLIENT.key" #Директория с созданным ключом клиента
		echo "</key>"

} >> "$home/home/admin/IT/Temp/$CLIENT.ovpn" #Директория, в которой сформируется файл #конфигурации

	echo ""
	echo "Client $CLIENT added, the configuration file is available at $home/admin/IT/OVPN/Temp/$CLIENT.ovpn."
	echo "Download the .ovpn file and import it in your OpenVPN client."
exit 0;
}
newClient

След известно време новото разрешение за забрана на отдалечен достъп принуди да се закрие и този сървър, и работещата конфигурация с Mikrotik. Беше създаден нов сървър OpenVPN за служителите в ИТ-отдела, който сега работи изцяло на CentOS. Но това е съвсем друга история.

Изразявам огромната си благодарност на Иван и Павел за помощта при редакцията на статията.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster