Limitowanie połączeń w packet filter i iptables

Udostępniając pewne usługi dla świata trzeba przewidzieć sytuację w której ktoś zechce zaatakować nasz serwer. Wszechobecne boty skanują znane porty, zbierają informację o naszym systemie, czy też próbują się do niego włamać. Dobrym pomysłem jest limitowanie połączeń dla każdej usługi na firewall’u. Na przykład jeżeli dany host (adres IP) będzie próbował nawiązać 20 połączeń na sekundę na porcie 80, możemy być pewni że nie jest to „normalny” ruch. Co najgorsze taki atak może uniemożliwić innym dostęp do usługi.

Zabezpieczenie portów 25 i 110 w Packet Filter

Załóżmy, że chcemy zabezpieczyć nasz serwer poczty przed atakami DoS. Jeżeli jakiś host próbuje nawiązać więcej niż 15 połączeń na minutę, zostanie od automatycznie dodany do tablicy blocked_ips:

$WAN_IF="vr0"
$MAILSERVER_IP="x.x.x.x"

block drop in log quick on $WAN_IF proto {tcp, udp} from <blocked_ips> to $MAILSERVER_IP
pass in log quick on $WAN_IF proto tcp from any to $MAILSERVER_IP port {25,110} keep state \
        (max-src-conn 25, max-src-conn-rate 15/60, overload <blocked_ips> flush 

Reguła blokująca powinna być na początku firewall’a. Listę zablokowanych adresów IP można zobaczyć używając polecenia pfctl:

root@fw-m:/>pfctl -t blocked_ips -T show
   1.2.3.4

Chcemy też, aby hosty, które są zablokowane dłużej niż 10 minut, zostały automatycznie usunięte z tablicy:

/sbin/pfctl -t blocked_ips -T expire 600

Ponieważ polecenie te musielibyśmy wpisywać za każdym razem sami, dodamy je do cron'a:

*/2 * * * *    /sbin/pfctl -t blocked_ips -T expire 600 > /dev/null 2>&1

Zabezpieczenie portów 25 i 110 w iptables

Taki sam efekt można osiągnąć używając iptables z modułem recent.

#MAILSERVER_IP="x.x.x.x"
#port 25
iptables -A INPUT -i eth0 -p tcp -d x.x.x.x --dport 25 -m state --state NEW -m recent --set --name PORT_25
iptables -A INPUT -i eth0 -p tcp -d x.x.x.x --dport 25 -m state --state NEW -m recent --update --seconds 60 --hitcount 15 --rttl --name PORT_25 -j DROP
#port 110
iptables -A INPUT -i eth0 -p tcp -d x.x.x.x --dport 110 -m state --state NEW -m recent --set --name PORT_110
iptables -A INPUT -i eth0 -p tcp -d x.x.x.x --dport 110 -m state --state NEW -m recent --update --seconds 60 --hitcount 15 --rttl --name PORT_110 -j DROP

Dodatkowo moduł ten tworzy pliki w katalogu /proc/net/ipt_recent, w których możemy zobaczyć listę śledzonych adresów IP:

cat /proc/net/ipt_recent/PORT_25
src=1.1.1.1 ttl: 118 last_seen: 15208768 oldest_pkt: 1 15208768
src=2.2.2.2 ttl: 58 last_seen: 15409111 oldest_pkt: 1 15409111
src=3.3.3.3 ttl: 54 last_seen: 15376952 oldest_pkt: 6 15374675, 15375305, 15375684, 15376048, 15376514, 15376952
  1. Witam

    Mam takie pytanie jak skonfigurować ossec i PF aby PF mógł korzystać z jego rejestru logów ??

Zostaw komentarz


Podpowiedź - możesz użyć tych HTML tagów i atrybutów:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Obraz CAPTCHY

*