Копирали сте OpenVPN jail из објаве у заједници, поново покренули fail2ban и ниједна адреса никада није блокирана. Узрок је скоро увек формат дневника: Access Server не пише редове о неуспешној аутентификацији које очекује стандардни филтер. Пре него што додирнете филтер, проверите да ли записи уопште постоје, јер шаблон не може да се поклопи са оним што услуга никада није забележила.

Ово је поступак којег се држим на хосту са Access Server-ом: потврди облик записа, напиши један усидрен израз, тестирај га на стварном дневнику, затим подели jail-ове по површини која се напада и провери да блокирање стиже до заштитног зида.

Потврдите да запис о грешци постоји

Access Server пише своје структуриране редове у /var/log/openvpnas.log, а адреса клијента се налази у пољу real_ip под наводницима, а не на почетку syslog реда. Пре него што напишете било какав шаблон, потражите неуспешну пријаву за коју знате да се догодила:

grep -i 'LOG ERR' /var/log/openvpnas.log | tail -20

Ако се ништа не појави, следећи сумњивац је ниво дневника. Access Server има прекидач за отклањање грешака у бази дневника у /usr/local/openvpn_as/etc/as.conf (DEBUG_LOGDB=1), и услуга мора поново да се покрене након што га промените. Третирајте тај прекидач као дијагностичко подешавање које треба поново спустити када имате свој шаблон, а не као трајну конфигурацију.

Док сте у датотеци, приметите које површине у њу пишу. Грешке клијентског портала, административног интерфејса и аутентификације тунела завршавају у истој датотеци са различитим маркерима, а тај детаљ касније одређује распоред jail-ова.

Усидрите један филтер на real_ip

Држите израз уским. Филтер који присваја сваки ред са IP адресом блокираће људе због обичних прекида везе, а на оптерећеном серверу једини симптом је да се корисници жале да су закључани јер су затворили лаптоп. Присвојите запис о грешци и ухватите адресу под наводницима:

# /etc/fail2ban/filter.d/openvpnaccess.local
[Definition]
failregex = ^ .*LOG ERR.*"real_ip": "<HOST>".*
ignoreregex =

Водећи размак није козметика. Access Server увлачи своје записе, и усидрење на њега спречава шаблон да присвоји и редове које у исту датотеку пишу неповезане услуге. Ако ваши записи уместо тога имају водећу временску ознаку, ускладите тај префикс, али усидрите се на нешто што је заиста присутно у сваком запису који намеравате да присвојите.

Када вам треба прецизност по површини, сузите још више захтевајући маркер површине (WEB_CLIENT, WEB_ADMIN или VPN) у истом реду. Један филтер са три шаблона лакше је ревидирати од три филтера који се разликују у једној речи.

Тестирајте израз пре него што укључите jail

Никада не укључујте филтер који нисте покренули на продукционом дневнику. Документовани тест пропушта филтер двапут, једном за учитавање и једном за примену, а извештај о пропуштеним редовима је део који вреди прочитати:

fail2ban-regex --print-all-missed /var/log/openvpnas.log \
  /etc/fail2ban/filter.d/openvpnaccess.local \
  /etc/fail2ban/filter.d/openvpnaccess.local > missed.txt

Упоредите број поклапања са грешкама које сте потврдили у првом кораку. Нула поклапања значи да је шаблон погрешан; поклапања на редовима који нису грешке аутентификације значе да је преширок. Читајте missed.txt док не будете могли да објасните сваки ред који сте одлучили да не присвојите.

Урадите овај тест на копији ако је дневник велики, и поновите га после сваке надоградње Access Server-а. Формат дневника је интерфејс са којим се поклапате, и он није стабилан API.

Поделите jail-ове по површини, а не по демону

Један Access Server нуди неколико површина за аутентификацију: клијентски и административни веб интерфејси на 943/tcp, и тунел на 1194/udp или 443/tcp у већини распоређивања. Један jail који их све покрива омогућава покушајима погађања на тунелу да блокирају адресу која је и ваша административна путања, и скрива која је површина заправо нападнута. Дајте свакој површини сопствени jail са сопственим портом и праговима:

# /etc/fail2ban/jail.d/openvpnaccess.local
[openvpnas-web-client]
enabled  = true
port     = 943
protocol = tcp
filter   = openvpnaccess
logpath  = /var/log/openvpnas.log
maxretry = 3
findtime = 10m
bantime  = 1h
[openvpnas-tunnel]
enabled  = true
port     = 443
protocol = udp
filter   = openvpnaccess
logpath  = /var/log/openvpnas.log
maxretry = 5
findtime = 10m
bantime  = 1h

Почните са малим бројачима и кратким блокирањем, па их подигните када будете посматрали недељу дана стварног саобраћаја. Дарежљив праг на заједничкој канцеларијској адреси кажњава сваког корисника иза једног NAT-а, а агресивно блокирање на површини тунела искључује легитимне клијенте чији су сачувани акредитиви истекли током ноћи.

Проверите блокирање, backend и колатералну штету

После поновног покретања, излаз статуса је најбржа потврда да jail постоји и да броји:

fail2ban-client status
fail2ban-client status openvpnas-tunnel

Затим потврдите да блокирање стиже до заштитног зида који заиста водите, јер jail конфигурисан за backend који нико не спроводи не штити ништа. Са дејством iptables адресе се појављују у ланцу названом по jail-у (f2b-openvpnas-tunnel); са дејством nftables оне падају у скуп у сопственој табели fail2ban-а. Проверите онај који користи ваш хост уместо да претпостављате.

Две колатералне провере важније су од самог блокирања. Прво, проверите да је real_ip адреса клијента, а не балансер оптерећења или обрнути прокси; иза проксија свако блокирање пада на прокси и вуче целу услугу са собом. Друго, запишите поступак за одблокирање, јер адреса која у 02:00 пређе праг обично припада дежурном инжењеру: fail2ban-client set openvpnas-tunnel unbanip 203.0.113.24.

Имајте границу на уму док подешавате. Fail2ban је ограничивач брзине на једној површини аутентификације, а не слој контроле приступа. Он не замењује MFA, ограничења по налогу или држање административног интерфејса изван јавног интернета, и Access Server има своја autoban подешавања која вреди проверити пре него што наслажете два ограничивача брзине на исти порт.

Повезани чланци