24.11.2024

Безопасность OpenConnect VPN Server

Заметки в процессе установки

Запрет авторизации по SSH на VPN сервер

Необходимо ограничить возможность авторизовываться на OpenConnect VPN сервере. Обычные пользователи не должны иметь такой возможности. Для этого добавьте в секцию с вашим типом аутентификации [domain/NOTDEV.LOCAL].

Отредактируйте nano /etc/sssd/sssd.conf

# Disable login to VPN server
default_shell = /usr/sbin/nologin
override_shell = /usr/sbin/nologin

Блокировка доступа по стране

При предоставлении услуг VPN ожидается, что клиенты будут подключаться из огромного количества различных подсетей по всему Интернету. Из-за этого не совсем возможно использовать пакетный фильтр для внесения в белый список подсетей, из которых клиенты могут подключаться к VPN-серверу.

Однако можно предположить, что клиенты будут подключаться только из определенного набора стран. Это дает нам критерий, который мы, в свою очередь, можем использовать для внесения в белый список клиентских подключений. Например, если кто-то предполагает, что его клиенты будут подключаться только из России, можно выполнить поиск GeoIP по исходному IP-адресу клиентов, чтобы определить местоположение клиента.

apt install -y curl ipcalc-ng libgeoip-dev

Требования: cURL, версия OCServ 0.11.5 или выше, ipcalc-ng и libgeoip-dev

Отредактируйте nano /etc/ocserv/ocserv.conf

connect-script = /usr/bin/ocserv-country-blocker

Необходимо создать и установить необходимые права для выполнения скрипта

touch /usr/bin/ocserv-country-blocker
chmod 700 /usr/bin/ocserv-country-blocker

Отредактируйте nano /usr/bin/ocserv-country-blocker

#!/bin/sh

#ALLOW_COUNTRY_CODES="RU --"
ALLOW_COUNTRY_CODES="RU"

# Make sure OCServ passes IP_REAL
if [ "x${IP_REAL}" = "x" ]; then
exit 1
fi

# The following provides the country code variable using the local GeoIP database:
COUNTRY_CODE=$(ipcalc-ng -g ${IP_REAL} | grep CODE | cut -d'=' -f2)

# Handle instances where COUNTRY_CODE is empty (e.g. RFC 1918 addresses)
if [ "x${COUNTRY_CODE}" = "x" ]; then
# Fail open
exit 0
# Fail closed
# exit 1
fi

for c in $ALLOW_COUNTRY_CODES; do
if [ "${c}" = "${COUNTRY_CODE}" ]; then
exit 0
fi
done

# If we made it here, then COUNTRY_CODE was not found in ALLOW_COUNTRY_CODES
exit 1

Обязательно укажите ALLOW_COUNTRY_CODES список стран, из которых вы хотите разрешить доступ к VPN. Если указать , то это может создать некоторые проблемы, например можно будет авторизоваться из локальной сети, а так же используя IP адреса которые не привязаны к стране, например CloudFlare

Настройка Firewall

Ввиду того что, довольно давно использую nftables, то приложу готовый конфиг с blacklist и некоторыми ограничениями

#!/usr/sbin/nft -f

flush ruleset

# `inet` applies to both IPv4 and IPv6.
table inet filter {

set blacklist-v4 {
type ipv4_addr
flags interval
auto-merge
elements = { 185.176.221.0/24, 81.30.158.0/24, 93.177.75.0/24,
213.137.128.0/19 }
}

chain input {
type filter hook input priority 0;

# accept any localhost traffic
iif lo accept

# drop ip form blacklist
ip saddr @blacklist-v4 drop

# no ping floods:
ip protocol icmp icmp type echo-request limit rate over 10/second burst 4 packets drop
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop

# accept traffic originated from us
ct state established,related accept

# accept ICMP & IGMP
ip protocol icmp icmp type { echo-request, destination-unreachable, router-solicitation, router-advertisement, time-exceeded, parameter-problem } accept
ip6 nexthdr icmpv6 icmpv6 type { echo-request, destination-unreachable, packet-too-big, time-exceeded, parameter-problem, mld-listener-query, mld-listener-report, mld-listener-reduction, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, ind-neighbor-solicit, ind-neighbor-advert, mld2-listener-report } accept
ip protocol igmp accept

# ssh
tcp dport 22 ip saddr { 10.0.0.0/8, 192.168.0.0/16} accept

# http, https
tcp dport 80 accept
tcp dport 443 accept
udp dport 443 accept

# zabbix-agent (only local)
tcp dport 10050 ip saddr { 10.0.0.0/8, 192.168.0.0/16} accept

# count and drop any other traffic
counter drop
}

chain output {
type filter hook output priority 0;
policy accept;
}

chain forward {
type filter hook forward priority 0;

# Основные сети для vhost по умолчанию
ip saddr 192.168.100.0/24 ip daddr 192.168.0.0/16 counter accept
ip saddr 192.168.0.0/16 ip daddr 192.168.100.0/24 counter accept

# Изолированная сеть в vhost
ip saddr 192.168.99.0/24 ip daddr 192.168.99.0/24 counter accept
ip saddr 192.168.99.0/24 ip daddr 192.168.0.0/16 counter drop
counter drop
}

chain postrouting {
type nat hook postrouting priority srcnat;
policy accept;
oifname "eth0" masquerade
}
}

Дополнительные настройки


Дополнительная информация

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *