Содержание страницы
Заметки в процессе установки
Запрет авторизации по 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
}
}
Дополнительные настройки
- Как установить и настроить OpenConnect VPN Server с поддержкой Let’s Encrypt
- Аутентификация пользователей в OpenConnect VPN Server – AD, Kerberos
- Безопасность OpenConnect VPN Server
- Мониторинг пользовательской активности OpenConnect VPN Server
Дополнительная информация