Debian 7 + IPset + iptables
11.02.2013 | aktual.: 10.05.2013 18:41
Aktualizacja 08.05.2013
Debian + IPset + iptables, czyli jak zablokować dużo adresów ip jednym poleceniem w iptables.
W poprzednim wpisie opisałem jak blokować wiele zakresów adresów ip jednym poleceniem w filtrze pakietów pf OpenBSD. IP sets jest ciekawym rozszerzeniem linuksowego firewalla umożliwiającym dodanie do iptables wielu adresów ip, adresów mac, numerów portów, sieci i kombinacji tego wszystkiego za pomocą jednej reguły. Za pomocą ipset możemy stworzyć następujące “sety”: ipmap - wykorzystuje adresy ip i może przechowywać do 65535 pozycji (sieć klasy B). macipmap - wykorzystuje adresy ip i mac. Zestaw macipmap może przechowywać do 65535 adresów (sieć klasy B) IP z MAC. portmap - zwykorzystuje numery portów. Zestaw portmap zestawu może przechowywać do 65535 portów. iphash - zestaw iphash korzysta z adresów IP przechowywanej w tablicy haszowanej nethash - zestaw nethash również używa haszy do przechowywania danych, w tym przypadku sieci w formacie CIDR ipporthash - ipporthash jest podobny do iphash ale może przechowywać adresy IP w parze z portami. ipportiphash – przechowuje hasz adresu IP, portu i dodatkowy adres IP ipportnethash – przechowuje hasz adresu IP, portu i maski sieci CIDR iptree – drzewo adresów IP (opcjonalnie możemy podać czas przechowywania wpisu w drzewie) iptreemap – podobnie do iptree ,używa drzew do przechowywania, jednak ostatni oktet adresu zapisany jest za pomocą mapy bitowej setlist – lista w której trzymamy inne zestawy Nowy zestaw tworzymy poleceniem:
[code=]ipset create nazwa_setu typ_setu[/code]
przykładowo:
[code=]ipset create nazwa_setu nethash[/code]
Aby dodać sieć do zestawu wydajemy polecenie:
[code=]ipset add nazwa_setu 208.67.222.0/24[/code]
Taka metoda dobra jest kilku, kilkunastu adresów ale żeby dodać kilkaset lub kilka tysięcy wpisów, proces warto zautomatyzować. Jeśli mamy spis sieci w pliku tekstowym, wydajemy polecenie:
[code=]for i in $( cat /var/iprange.txt ) ; do ipset add nazwa_setu $i ; done[/code]
Podobnie do iptables, zestaw zapiszemy komendą:
[code=]ipset save > /root/ipset.save[/code]
Po ewentualnym reboocie maszyny, możemy wczytać set:
[code=]ipset restore < /root/ipset.save[/code]
OK, zestaw sieci mamy gotowy. Jak go wykorzystać? Należy “”wkleić” go do reguły firewalla iptables. W tym celu korzystamy z opcji “m”. Reguła iptables wygląda np. tak:
[code=]iptables -A INPUT -p tcp -i eth0 -‑dport 80 -p tcp -m set -‑match-set rdp src -m state -‑state NEW -j ACCEPT[/code]
W regule iptables korzystającej z setu należy zadeklarować czy adresy z zestawu mają być traktowane jako źródłowe (src) czy docelowe (dst). Warto przygotować skrypt ładujący zestaw przy starcie systemu. Najlepiej dodać wpis
[code=]ipset restore < /root/ipset.save[/code]
w skrypcie naszego firewalla. W Debianie skrypty firewalla umieszcza się w katalogu:
[code=]/etc/network/if-pre-up.d/[/code]
W tym katalogu umieszcza się skrypty, które mają zostać wykonane przed uruchomieniem sieci, a filtr pakietów ze względów bezpieczeństwa zdecydowanie powinien zostać uruchomiony przed włączeniem sieci. Samo umieszczenie skryptu w tym katalogu nie wystarczy. Plikowi ze skryptem należy jeszcze dać prawa wykonywania:
[code=]chmod u+x /etc/network/if-pre-up.d/nazwa_pliku[/code]
Teraz po każdym restarcie komputera, skrypt zostanie wykonany automatycznie. Przykładowy skrypt firewalla może wyglądać tak:
[code=]#!/bin/sh[/code]
[code=]IPTABLES=/sbin/iptables[/code]
[code=]### kasowanie starych zasad i ustawianie domyślnych reguł w łańcuchach jako DROP[/code]
[code=]echo "[+] Kasowanie starych reguł IPTABLES"[/code]
[code=]$IPTABLES -F[/code]
[code=]$IPTABLES -F -t nat[/code]
[code=]$IPTABLES -X[/code]
[code=]$IPTABLES -P INPUT DROP[/code]
[code=]$IPTABLES -P OUTPUT DROP[/code]
[code=]$IPTABLES -P FORWARD DROP[/code]
[code=]### IPSET[/code]
[code=]echo "[+] Kasowanie starych reguł IPSET"[/code]
[code=]ipset -F[/code]
[code=]ipset -X[/code]
[code=]echo "[+] Wczytywanie zestawu IPSET"[/code]
[code=]ipset -R < /root/ipset.save[/code]
[code=]echo "[+] Wczytywanie łańcucha INPUT"[/code]
[code=]$IPTABLES -A INPUT -p tcp -i eth0 -‑dport 80 -‑syn -m set -‑set nazwa_setu src -m state -‑state NEW -j ACCEPT[/code]
[code=]exit[/code]
Uzyskanie takiego samego efektu jest znacznie łatwiejsze w OpenBSD co opisałem w poprzednim poście ale niestety z pewnych powodów nie zawsze można można wykorzystać OpenBSD i trzeba wspomóc się Linuksem ;‑)