Acest ghid explică modul de configurare a PF Firewall pe FreeBSD 13.2 pentru a bloca automat adresele IP suspecte (de exemplu, brute force SSH). În plus, include un script Perl care gestionează listele dinamice de IP-uri blocate.
Pasul 0: Instalarea Perl (dacă nu există)
Pe FreeBSD 13.2, Perl nu este instalat implicit. Îl putem instala astfel:
pkg install perl5
perl -v
Pasul 1: Activarea Firewall-ului PF
Editați fișierul /etc/rc.conf
și adăugați următoarele linii:
pf_enable="YES"
pf_rules="/etc/pf.conf"
pf_flags=""
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
Pasul 2: Configurarea regulilor PF
Creați sau editați fișierul /etc/pf.conf
și adăugați următoarele reguli:
block in all
pass in quick on lo0
pass out quick on lo0
table <blocaj> persist file "/var/db/lista"
block quick from <blocaj>
# Permit conexiuni esențiale, portul 227 este cel utilizat de HostRIX, se poate schimba in 22 sau cel utilizat de dvs.
pass in quick on vtnet0 proto tcp from any to any port 227 keep state
pass in quick on vtnet0 proto tcp from any to any port 80 keep state
pass in quick on vtnet0 proto tcp from any to any port 3690 keep state
pass out all keep state
vtnet0
cu interfața de rețea activă pe serverul dvs. (ex: em0
, re0
).Pasul 3: Crearea listei de IP-uri blocate
Executați următoarele comenzi pentru a crea fișierul listă și a-i seta permisiunile:
touch /var/db/lista
chmod 644 /var/db/lista
Pasul 4: Scriptul de blocaj (Blocaj)
Creați scriptul /sbin/Blocaj
:
nano /sbin/Blocaj
Introduceți conținutul următor:
#!/usr/bin/perl
use strict;
my @assholes = ();
open (IN, "/var/log/auth.log");
while (<IN>) {
if ($_ =~ /Invalid user.*from ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {
push(@assholes, $1);
}
if ($_ =~ /Did not receive identification string from ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {
push(@assholes, $1);
}
}
close (IN);
@assholes = sort {lc($a) cmp lc($b)} @assholes;
my @allowedIPs = ();
open (IN, "/var/db/allowed-ips");
while (<IN>) {
if ($_ =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) {
push(@allowedIPs, $_);
}
}
close (IN);
chop(@allowedIPs);
my $tmp = "";
foreach my $asshole (@assholes) {
if ($asshole eq $tmp) {
$asshole = "";
} else {
if ($asshole =~ /127\.0\.0\.1/) { $asshole = ""; }
if ($asshole =~ /192\.168\.[0-9]+\.[0-9]+/) { $asshole = ""; }
foreach my $allowedIP (@allowedIPs) {
if ($asshole =~ /$allowedIP/) {
$asshole = "";
}
}
$tmp = $asshole;
}
}
@assholes = sort {lc($b) cmp lc($a)} @assholes;
my $popCount = 0;
foreach my $asshole (reverse @assholes) {
if ($asshole eq "") {
$popCount++;
}
}
for (my $i = 0; $i < $popCount; $i++) {
pop (@assholes);
}
my $list = "";
foreach my $asshole (@assholes) {
$list = $list . $asshole . " ";
}
exec "/sbin/pfctl -t blocaj -T add $list";
Setați permisiunile corecte:
chmod 751 /sbin/Blocaj
Pasul 5: Integrarea cu syslog
Editați fișierul /etc/syslog.conf
și adăugați linia:
auth.info;authpriv.info | exec /usr/bin/perl /sbin/Blocaj
Rezultat
De acum, serverul dvs. FreeBSD 13.2 va bloca automat IP-urile externe suspecte detectate în loguri și le va adăuga în lista PF Firewall.
- Păstrați o listă de IP-uri permise în fișierul
/var/db/allowed-ips
. - Monitorizați logurile firewall-ului cu:
tcpdump -n -e -ttt -i pflog0