Blog (22)
Komentarze (997)
Recenzje (0)
@parranoyaDebian 7 + IPset + iptables

Debian 7 + IPset + iptables

11.02.2013 11:13, aktualizacja: 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 ;‑)

Wybrane dla Ciebie
Komentarze (2)