Netfilter jako Ściana Ognia
Łukasz Klimek <
casa@szluug.org
>
Szczecińska Grupa Użytkowników Linuksa/Uniksa
www.SzLUUG.org
Plan wykładu
—
Wstęp
—
Rozwinięcie
—
Zakończenie
Podstawowe pojęcia
—
reguła (ang. rule) – zasada postępowania z
pakietami składająca się z:
–
testów (ang. match), które określają, których pakietów
dotyczy dana reguła
–
akcji (ang. action) która ma zostać wykonana
—
łańcuch (ang. chain) – zbiór reguł ułożonych w
określonej kolejności
—
tablica (ang. table) - zbiór łańcuchów
Przykładowa reguła
—
iptables
-I INPUT
-s 192.168.1.1
-j DROP
-t filter
–
INPUT
– łańcuch
–
-s 192.168.1.1
– test – adres źródłowy
–
-j DROP
– akcja – porzucenie pakietu
–
-t filter
– tablica filter
–
Składnia polecenia iptables
—
iptables [-t tablica] komenda [testy] [cel]
–
tablica: filter | nat | mangle
–
komenda: -I n | -A | -D | -R | -L | -F | -Z | -N |
-X | -P | -E
–
testy: -p | -s | -d | -i | -o | ...
–
cel: -j ACCEPT | -j DENY | -j REJECT | -j DROP
| -j inny_lancuch
Tablica filter
—
domyślna tablica, jeśli nie podamy opcji -t
—
używana do filtrowania pakietów
—
główne cele:
–
LOG, DROP, ACCEPT
–
REJECT
--reject-with icmp-net-unreachable | icmp-host-unreachable
| icmp-port-unreachable | icmp-proto-unreachable
| icmp-net-prohibited | icmp-host-prohibited
| icmp-admin-prohibited
Tablica nat
—
służy do definiowania zasad działania NAT
—
trafiają do niej tylko pakiety otwierające nowe
połączenie
—
specjalne cele:
–
SNAT – Source NAT – zmiana adresu źródłowego
–
DNAT – Destanation NAT – zmiana adresu celu
–
MASQUERADE – wolniejszy SNAT; sprawdza za
każdym razem adres IP, wspiera dynamiczne IP
—
Tablica mangle
—
służy głównie do modyfikowania pakietów
—
specjalne cele:
–
TOS – zmiana flag Type Of Service
–
TTL – zmiana Time To Live – czasu życia pakietu
–
MARK – znakowanie pakietów
Droga przez mękę ;)
dest=localhost
mangle:
PREROUTING
nat:
PREROUTING
routing
mangle:
INPUT
filter:
INPUT
Proces
lokalny
Sieć
Droga przez mękę ;)
src=localhost
routing
mangle:
OUTPUT
filter:
OUTPUT
Sieć
Proces
lokalny
nat:
OUTPUT
mangle:
POSTROUTING
nat:
POSTROUTING
Droga przez mękę ;)
forwarding
mangle:
PREROUTING
nat:
PREROUTING
routing
mangle:
FORWARD
filter:
FORWARD
Sieć 2
Sieć 1
mangle:
POSTROUTING
nat:
POSTROUTING
Dodawanie i usuwanie reguł
–
iptables
-I INPUT
-s 192.168.1.1 -j DROP -t filter
wstawienie reguły na początku łańcucha
INPUT
–
iptables
-A INPUT
-s 192.168.1.1 -j DROP -t filter
wstawienie reguły na końcu łańcucha
INPUT
–
iptables
-I INPUT 5
-s 192.168.1.1 -j DROP -t filter
wstawienie reguły na pozycji piątej łańcucha
INPUT
–
iptables
-D INPUT 3
usunięcie reguły z pozycji 3 łańcucha
INPUT
–
iptables
-D INPUT
-s 192.168.1.1 -j DROP -t filter
usunięcie pierwszej reguły identycznej z podaną
Wyświetlanie listy reguł
–
iptables
-L INPUT
-t filter
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 1.2.3.3 anywhere
DROP all -- 1.2.3.7 anywhere
DROP all -- 1.2.3.4 anywhere
DROP all -- 1.2.3.3 anywhere
–
Nie podanie nazwy łańcucha spowoduje wyświetlenie
reguł dla wszystkich łańcuchów w danej tabeli
Zastępowanie reguł
–
iptables
-R INPUT 3
-s 127.0.0.1 -j ACCEPT -t filter
–
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 1.2.3.3 anywhere
DROP all -- 1.2.3.7 anywhere
ACCEPT all -- localhost anywhere
DROP all -- 1.2.3.3 anywhere
Zarządzanie łańcuchami
—
iptables
-N nazwałańcucha
-t filter
–
dodanie nowego łańcucha o nazwie nazwałańcucha
—
iptables
-F nazwałańcucha
-t filter
–
usunięcie wszystkich reguł z łańcucha nazwałańcucha
—
iptables
-X nazwałańcucha
-t filter
–
usunięcie łańcucha nazwałańcucha; nie może on
zawierać żadnych reguł
—
iptables
-Z nazwałańcucha
-t filter
wyzerowanie liczników dla danego łańcucha
Liczniki
—
każda reguła posiada licznik trafień
–
ilość pakietów
–
ilość bajtów
—
przykład:
iptables -I OUTPUT -d 81.210.40.2 -p icmp
zauważmy brak celu! dzięki temu zliczamy pakiety
–
iptables -v -L ...
—
Chain OUTPUT (policy ACCEPT 130 packets, 9161 bytes)
pkts bytes target prot opt in out source destination
26 2184 icmp -- * * 0.0.0.0/0 81.210.40.2
Zarządzanie łańcuchami - c.d.
—
iptables
-P nazwałańcucha cel
-t filter
–
ustalenie domyślnego celu dla łańcucha; łańcuch musi
być jednym z łańcuchów wbudowanych (
INPUT,
FORWARD, OUTPUT, PREROUTING,
POSTROUTING), a cel to DROP lub ACCEPT
—
iptables
-E staranazwa nowanazwa
-t filter
–
zmiana nazwy łańcucha
Inne przydatne opcje
—
iptables
–
-n
– nie zamieniaj adresów IP na nazwy hostów
–
-v
– bądź głośny – podawaj więcej informacji
wartości liczbowe będą podawane z przyrostkami krotności
(M,G,...) chyba, że podamy argument
-x
–
--line-numbers
– pokazuj numery reguł
–
-c
– użyte przy wstawianiu ustawia liczniki na podane
wartości, np. -c 20 4000
Podstawowe testy
—
iptables -I łańcuch -t tablica
-p protokół
–
wybór protokołu, którego ma dotyczyć reguła;
najczęściej używane to
tcp, udp i icmp oraz ALL;
pełna lista protokołów dostępna jest w pliku
/etc/protocols
—
iptables -I łańcuch -t tablica
-s 192.168.1.234
–
źródłowy adres ip pakietu którego dotyczy reguła
—
iptables -I łańcuch -t tablica
-d 192.168.1.234
–
docelowy adres ip pakietu którego dotyczy reguła
Podstawowe testy(2)
—
iptables -I łańcuch -t tablica
-i eth0
–
wybór interfejsu (karty sieciowej) przez który wchodzą
pakiety
—
iptables -I łańcuch -t tablica
-o eth0
–
wybór interfejsu (karty sieciowej) przez który
wychodzą pakiety
Protokół TCP
—
--sport NNN
– port źródłowy pakietu
—
--dport NNN
– port docelowy pakietu
—
--tcp-flags
SYN, ACK, FIN, RST, URG, PSH |
ALL | NONE
–
flagi nagłówka TCP
—
--syn
= --tcp-flags SYN,RST,ACK SYN
–
oznacza pakiet nawiązujący połączenie
—
--tcp-option
N – sprawdza czy w nagłówku
ustawiona jest dana opcja
UDP i ICMP
—
UDP:
–
--sport, --dport
—
ICMP:
–
--icmp-type (patrz: iptables -p icmp -h)
—
—
modyfikator
!
–
zanegowanie wartości znajdującej się za znakiem !
–
dotyczy większości testów
Przykłady
—
Zablokowanie wychodzących pakietów tcp
otwierających połączenie ze stroną www.wp.pl
iptables -A OUTPUT -d www.wp.pl -p tcp --dport 80 \
--syn -j DROP
–
wersja 2:
iptables -A OUTPUT -d www.wp.pl -p tcp --dport 80 \
--syn -j REJECT --reject-with icmp-admin-prohibited
–
Na czym (w praktyce) polega różnica?
Przykłady(2).
—
Wyłączenie odpowiadania na ping:
–
iptables -I INPUT -p icmp --icmp-type echo-request -j DROP
—
Reguły zabezpieczające sieć lokalną
–
Załóżmy, że mamy 2 karty sieciowe: eth0 – wyjście do
Internetu, eth1 – sieć lokalna 1.2.3.0/24....
iptables -I FORWARD -s 1.2.3.0/24 -i eth1 -j ACCEPT
iptables -I FORWARD -d 1.2.3.0/24 -o eth1 -j ACCEPT
iptables -P FORWARD DROP
Przykłady - c.d.
—
Firewall na serwerze DNS
–
iptables -A INPUT -p tcp --dport ! 53 -j DROP
iptables -A INPUT -p udp --dport ! 53 -j DROP
—
wersja 2:
–
iptables -P INPUT DROP
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
Bardziej skomplikowane zadanie
—
Stwórzmy 3 łańcuchy:
–
lancuch_tcp i lancuch_udp, zawierający dozwolone
porty odpowiednio dla protokołu TCP i UDP
–
łańcuch loguj_odrzuc, który zapisze informacje z
przechodzących przez niego pakietów do logów, a
następnie odrzuci je
—
Będziemy akceptować pakiety wychodzące na port
80 (tcp) i 53 (udp).
Bardziej skomplikowane zadanie(2)
—
iptables -N lancuch_tcp
iptables -N lancuch_udp
iptables -N loguj_odrzuc
iptables -A OUTPUT -p tcp -j lancuch_tcp
iptables -A OUTPUT -p udp -j lancuch_udp
iptables -A OUTPUT -j loguj_odrzuc
loguj_odrzuc
—
Logowanie pakietu:
–
iptables -A loguj_odrzuc -j LOG
—
Odrzucanie pakietu:
–
iptables -A loguj_odrzuc -j REJECT
lancuch_tcp, podejście 1
—
iptables -I lancuch_tcp -p tcp --dport ! 80 -j DROP
Efekt: pakiety wysyłane na port 80 także są odrzucane.
DLACZEGO ???
Przepływ danych przez nasze tabele
Pakiet na port 80 (tcp)
INPUT:
1. -p tcp -j lancuch_tcp
lancuch_tcp:
1. --dport ! 80 -j DROP
TAK
lancuch_tcp:
2. koniec łańcucha
NIE
INPUT:
2. -p udp -j lancuch_udp
Powrót
INPUT:
3. -j loguj_odrzuc
loguj_odrzuc:
1. -j LOG
loguj_odrzuc:
2. -j REJECT
Pakiet
odrzucony
SNAT i DNAT
—
SNAT – Source Network Address Translation –
technika pozwalająca na dynamiczną zamianę
adresu
źródłowego w przechodzących przez daną
maszynę pakietach
—
DNAT – Destanation Network Address
Translation – technika pozwalająca na dynamiczną
zamianę adresu
docelowego w przechodzących
przez daną maszynę pakietach
Prosty SNAT
—
SNAT może być używany do korzystania z Internetu
przez wiele maszyn z użyciem tylko 1 rzeczywistego
adresu IP.
—
Załóżmy, że posiadamy sieć lokalną 10.0.0.0/8 i
rzeczywisty (zewnętrzny) adres IP 1.2.3.4.
—
Najprostsza forma SNAT:
–
iptables -A POSTROUTING -t nat -s 10.0.0.0/8 \
-j SNAT --to 1.2.3.4
—
Pytanie: jaki teraz będzie efekt regułki:
–
iptables -I FORWARD -s 1.2.3.4 -j DROP
DNAT
—
NAT może być m.in. wykorzystane do prostego
load balancingu.
—
Załóżmy, że mamy klaster 2 serwerów www:
1.2.3.2 i 1.2.3.3. Z Internetem łączy je router
1.2.3.1 operujący na Linuksie. Niech
www.serwer.com
wskazuje na host 1.2.3.1.
–
iptables -I PREROUTING -d 1.2.3.1 -p tcp \
--dport 80 -j DNAT --to 1.2.3.2 --to 1.2.3.3 -t nat
—
Regułka ta powoduje, że połowa żądań będzie
wysłana do serwera 1.2.3.2 a reszta do 1.2.3.3
Adres MAC
—
Czasem chcemy, aby użytkownicy mogli uzyskać
dostęp do Sieci tylko z określonych adresów mac
—
Służy to tego polecenie
–
iptables ....
-m mac --mac
12:34:56:78:90:ab
—
Opcja
-m
pozwala skorzystać z dodatkowych, nie
uwzględnianych domyślnie, testów.
Adres MAC - przykład
—
Chcemy zablokować możliwość wysyłania
pakietów do użytkownika o adresie MAC
12:34:56:78:90:ab
–
[root@Coth: casa]# iptables -I OUTPUT -m mac \
--mac 12:34:56:78:90:ab -j DROP
iptables: Target problem
—
Wniosek: dopasowanie match może być używane
tylko tablicach wejściowych (PREROUTING,
INPUT, FORWARD), gdzie znany jest mac
nadawcy pakietu.
Adres MAC – przykład 2
—
Nadajemy użytkownikom dostęp do Sieci tylko
wtedy gdy ich adres IP pasuje do adresu MAC
–
# iptables -A FORWARD -m mac \
--mac 12:34:56:78:90:ab -s 1.2.3.4 -j ACCEPT
...
# iptables -A FORWARD -d 1.2.3.4 -j ACCEPT
# iptables -P FORWARD DROP
Problem: dużo reguł
—
Jeśli mamy dużo reguł podanych na poprzedniej
stronie i duży ruch, będą one spowalniały
działanie naszej sieci. Każdy pakiet będzie
bowiem musiał przejść (w najgorszym
przypadku) przez wszystkie reguły.
—
Obejście – podział na łańcuchy
Podział na łańcuchy
—
Przykład: sieć 1.2.3.0/24 dzielimy na 2 łańcuchy
# iptables -N siec1; iptables -N siec2; iptables -P FORWARD DROP
# iptables -A FORWARD -s 1.2.3.0/25 -j siec1
# iptables -A FORWARD -s 1.2.3.128/25 -j siec2
# iptables -A FORWARD -d 1.2.3.0/24 -j ACCEPT
# iptables -A siec1 -s 1.2.3.1 -m mac .... -j ACCEPT
...
# iptables -A siec1 -s 1.2.3.127 -m mac .... -j ACCEPT
# iptables -A siec1 -s 1.2.3.128 -m mac .... -j ACCEPT
...
# iptables -A siec1 -s 1.2.3.254 -m mac .... -j ACCEPT
Efekt podziału – pakiet odrzucony
Oszacowanie ilości porównań
N reguł
Przed podziałem
3 reguły
Po podziale
pakiet
pakiet
pakiet
odrzucony
pakiet
odrzucony
Jaki jest inny sposób minimalizacji ilości porównań w tym przypadku?
Efekt podziału – pakiet przyjęty
Przypadek najgorszy
N-1 reguł
Przed podziałem
N-1 porównań
1-2 reguły
Po podziale – N/2 + ok. 1 reguły
pakiet
pakiet
pakiet
przyjęty
N/2 reguł
N/2 reguł
pakiet
przyjęty
Efekt podziału – pakiet przyjęty
Przypadek średni
N/2 reguł
Przed podziałem
N/2 porównań
1 reguła
Po podziale – N/4 + 1 porównań
pakiet
pakiet
pakiet
przyjęty
N/4 reguł
N/4 reguł
pakiet
przyjęty
Podział regułek - podsumowanie
—
Istnieje możliwość takiego skonstruowania reguł,
aby ilość porównań w najgorszym wypadku
wynosiła log
2
(N)
—
Jednak czy warto?
–
łańcuchy zajmują zasoby
–
przemieszczanie się między łańcuchami troszkę trwa
Patch-o-matic
—
Patch-o-matic to zbiór dodatkowych dopasowań i
celów dla iptables.
—
Przykład – test limit:
–
iptables -A INPUT -p tcp --dport 80 -m limit --limit
5/min -j LOG
—
Przykład – test multiport
–
iptables -A INPUT -p tcp -m multiport --dports
80,81,82 -m limit --limit 5/min -j LOG
Literatura
—
man 8 iptables
—
http://www.netfilter.org/documentation/
—
http://iptables-tutorial.frozentux.net/iptables-
tutorial.html
KONIEC
Dziękuję za uwagę