четверг, 6 февраля 2020 г.

Установка OpenVPN на CentOS

Самым простым способом доступа во внутреннюю сеть предприятия для удалённых сотрудников и сотрудников филиалов является использование vpn.
В этой заметке будет описана настройка сервера OpenVPN с возможностью разграничения доступа подключенных клиентов к определённым сегментам сети. В качестве ОС сервера будет использоваться CentOS 7/8, различия при настройке заключаются только в имени службы и пути, по которому она будет искать конфигурационный файл. Это различие будет отражено при описании соответствующих шагов.
Стоит оговориться, что для vpn-клиентов будет использоваться статическая адресация, это необходимо для разграничения доступа.
Начнём с подключения EPEL-репозитория и установки необходимых пакетов (все команды в заметке выполняются с повышенными полномочиями)
sudo -s
yum -y install epel-release
yum -y install openvpn unzip wget nano
Аутентификация пользователей будет происходить по соответствующему сертификату. Для их создания развернём инфраструктуру открытых ключей (PKI) с использованием Easy-RSA.
mkdir /etc/openvpn/keys && cd /etc/openvpn/keys
wget https://github.com/OpenVPN/easy-rsa/archive/master.zip
unzip master.zip && cd /etc/openvpn/keys/easy-rsa-master/easyrsa3
mv vars.example vars
В файле vars можно, но не обязательно, указать необходимые параметры инфраструктуры, такие как расположение организации, срок действия сертификатов и прочее. Если это не будет сделано, то будут использованы параметры по умолчанию. После чего можно непосредственно создавать инфраструктуру.
./easyrsa init-pki
Создадим удостоверяющий центр, от имени которого мы будем выпускать сертификаты для аутентификации клиентов.
./easyrsa build-ca
В процессе создания удостоверяющего центра будет предложено указать некоторые параметры, среди которых пароль сертификата CA. Этот пароль необходимо запомнить, т.к. он будет использоватсья для подписи сертификатов сервера и клиентов при их создании.
После завершения мы получим 2 файла
  • /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/private/ca.key
  • /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/ca.crt
Первый - секретный ключ, который останется на сервере, а второй - открытый ключ, который будет передаваться клиентам, для подтверждения сертификата сервера.
После того, как создан центр сертификации, можно переходить к созданию сертификата сервера. Все сертификаты будем создавать с параметром nopass, чтобы пароль не запрашивался каждый раз при старте сервиса.
./easyrsa gen-req server nopass
Теперь подпишем сертификат, тут как-раз понадобится ключ, который был указан не предыдущем шаге. В данной команде указывается последним параметром имя сертификата сервера.
./easyrsa sign-req server server
Кроме сертификатов ещё понадобится ключ Диффи-Хеллмана. Этот процесс занимает некоторое количество времени, нужно просто подождать.
./easyrsa gen-dh
После завершения всех манипуляций скопируем полученные файлы в каталог сервиса.
cp pki/ca.crt /etc/openvpn/ca.crt
cp pki/dh.pem /etc/openvpn/dh.pem
cp pki/issued/server.crt /etc/openvpn/server.crt
cp pki/private/server.key /etc/openvpn/server.key
Теперь нужно создать необходимые каталоги и файл конфигурации сервера OpenVPN
mkdir /etc/openvpn/ccd && mkdir /var/log/openvpn

# файл конфигурации сервера для CentOS 7
touch /etc/openvpn/server.conf

# файл конфигурации сервера для CentOS 8
touch /etc/openvpn/server/server.conf
Файл конфигурации сервера на CentOS 8 так же можно поместить в /etc/openvpn, но для того, чтобы его корректно восприняла служба сервера нужно в файле службы /lib/systemd/system/openvpn-server@.service указать этот каталог в параметре WorkingDirectory.
Файл конфигурации должен выглядеть примерно следующий образом:
# порт для подключение клиентов
port 1194
# используемый протокол, можно так же использовать tcp
proto udp
# тип интерфейса (tun - L3 тоннель, tap - L2)
dev tun
# расположение файлов ключей
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
# подсеть внутри тоннеля
server 192.168.240.0 255.255.252.0
# подсети за тоннелем
route 10.0.0.0 255.0.0.0
# возможные dhcp-опции, отправляемые клиентам (работает даже при статической адресации)
push "dhcp-option DNS 192.168.240.1"
# каталог с конфигурационными файлами клиентов
client-config-dir /etc/openvpn/ccd
# параметры повторного подключения в случае разрыва связи
keepalive 10 120
persist-key
persist-tun
# использование сжатия
comp-lzo
# опции ведения журнала событий
status /var/log/openvpn/status.log
log /var/log/openvpn/log.log
verb 3
После создания файла конфигурации можно добавить в автозапуск службу сервера OpenVPN и запустить его. После символа @ указывается имя конфигурационного файла.
# для CentOS 7
systemctl enable openvpn@server
systemctl start openvpn@server

# для CentOS 8
systemctl enable openvpn-server@server
systemctl start openvpn-server@server
Если при запуске службы не выявлено ошибок, и интерфейс tun0 присутствует в списке сетевых интерфейсов, то можно приступить к созданию конфигурационного файла для первого клиента. Для начала выпустим и подпишем сертификат для его аутентификации:
cd /etc/openvpn/keys/easy-rsa-master/easyrsa3/
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
Аналогично серверному сертификату получим 2 файла:
  • /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/issued/client1.crt
  • /etc/openvpn/keys/easy-rsa-master/easyrsa3/pki/private/client1.key
которые нужно будет вместе с файлом ca.crt передать клиенту.
Теперь создадим конфигурационный файл для клиента, его имя должно совпадать с именем которое было указано при создании сертификата, если конкретное имя не указывалось, то оно совпадает с именем сертификата, в приведённом примере - client1.
touch /etc/openvpn/ccd/client1
Файл конфигурации клиента на сервере должен выглядеть примерно следующим образом:
# ip-адрес назначенный этому клиенту внутри тоннеля    
ifconfig-push 192.168.240.5 192.168.240.6
# подсеть, которая находится за данным клиентом (указывается, если клиент является маршрутизатором, для отдельного пользователя эта строка не нужна)
iroute 10.30.61.0 255.255.255.0
# маршрут в другие подсети, находящиеся за тоннелем
push "route 10.7.66.0 255.255.255.248"
push "route 172.16.0.0 255.240.0.0"
Можно заметить, что в конфигурации пользователя указана подсеть гораздо меньше, чем в конфигурации сервера. Это сделано для того, чтобы в случае появления нового филиала не нужно было перезапускать сервер OpenVPN после добавления новой меньшей подсети в конфигурацию сервера.
ip-адреса в нашем случае выдаются вручную, при этом адреса выдаются не просто по порядку, а строго определёнными парами [адрес клиента, адрес шлюза]. Первая пара отдаётся серверу.

[ 1, 2][ 5, 6][ 9, 10][ 13, 14][ 17, 18]
[ 21, 22][ 25, 26][ 29, 30][ 33, 34][ 37, 38]
[ 41, 42][ 45, 46][ 49, 50][ 53, 54][ 57, 58]
[ 61, 62][ 65, 66][ 69, 70][ 73, 74][ 77, 78]
[ 81, 82][ 85, 86][ 89, 90][ 93, 94][ 97, 98]
[101,102][105,106][109,110][113,114][117,118]
[121,122][125,126][129,130][133,134][137,138]
[141,142][145,146][149,150][153,154][157,158]
[161,162][165,166][169,170][173,174][177,178]
[181,182][185,186][189,190][193,194][197,198]
[201,202][205,206][209,210][213,214][217,218]
[221,222][225,226][229,230][233,234][237,238]
[241,242][245,246][249,250][253,254]

Все настройки на стороне сервера завершены, теперь нужно создать файл конфигурации на компьютере клиента.
В самом базовом случае конфигурация OpenVPN на компьютере клиента должна выглядеть примерно следующим образом:
# тип интерфейса        
dev tun
# протокол    
proto udp
# ip-адрес сервера    
remote 111.111.111.111
# порт для подключения    
port 1194
# роль клиента    
client
# параметры повторного подключения    
resolv-retry infinite
persist-key
persist-tun
# пути к файлам ключей    
ca ca.crt
cert client1.crt
key client1.key
# параметры сжатия  
comp-lzo

auth-nocache
remote-cert-tls server
float
Далее настроим маршрутизацию. В файле конфигурации сервера отсутствует строка client-to-client, это означает, что маршрутизация пакетов будет происходить в ядре операционной системы, а не внутри сервера OpenVPN. В используемом примере сеть центрального офиса имеет адресацию 172.16.0.0/12, клиентам внутри тоннеля выдаются адреса из подсети 192.168.240.0/24, а сети филиалов имеют боле мелкие подсети из общего диапазона 10.0.0.0/8.
Сервер OpenVPN запущен на компьютере, который не является шлюзом по умолчанию в сети центрального офиса и имеет 2 сетевых интерфейса, один из которых (ens3) смотрит в DMZ, а второй (ens4) в локальную сеть.
Компьютеры локальной сети client1 и центрального офиса должны иметь доступ друг к другу.
Для начала включим возможность пересылки трафика между интерфейсами добавив строку
net.ipv4.ip_forward = 1
в файл /etc/sysctl.conf и применим ей выполнив команду
sysctl -p
Теперь перейдём непосредственно к настройке маршрутизации. В CentOS 7/8 вместо iptables используется firewalld, его мы и будем далее настраивать.
Создадим новую зону openvpn для интерфейса tun0, а так же определим для неё доступные службы:
firewall-cmd --permanent --add-service=openvpn
firewall-cmd --permanent --new-zone=openvpn
firewall-cmd --permanent --zone=openvpn --add-service=openvpn
firewall-cmd --permanent --zone=openvpn --add-interface=tun0
распределим внутренний и внешний интерфейсы по соответствующим зонам, назначим на внешнем интерфейсе службу openvpn и отключим masquerade, чтобы исключить его использование в качестве шлюза другими компьютерами локальной сети:
firewall-cmd --permanent --zone=internal --change-interface=ens4
firewall-cmd --permanent --zone=external --change-interface=ens3
firewall-cmd --permanent --zone=external --add-service=openvpn
firewall-cmd --permanent --zone=external --remove-masquerade
укажем в каком направлении можно использовать masquerade с использованием rich-rule.
По умолчанию разрешены все пакеты в рамках уже установленных соединений, поэтому создадим правила:
для доступа из сети центрального офиса в сеть филиала client1
firewall-cmd --permanent --zone=openvpn --add-rich-rule='rule family=ipv4 source address=172.16.0.0/12 destination address=10.30.61.0/24 masquerade'
и для доступа из сети филиала client1 в сеть центрального офиса
firewall-cmd --permanent --zone=internal --add-rich-rule='rule family=ipv4 source address=192.168.240.5 destination address=172.16.0.0/12 masquerade'
Перезагрузим правила:
firewall-cmd --reload
На этом настройка закончена. Для создания настройки нового клиента нужно создать для него сертификат, файл конфигурации и настроить необходимую маршрутизацию.

Комментариев нет:

Отправить комментарий