background image

Netfilter jako Ściana Ognia

Łukasz Klimek <

casa@szluug.org

>

Szczecińska Grupa Użytkowników Linuksa/Uniksa

www.SzLUUG.org

background image

Plan wykładu

Wstęp

Rozwinięcie

Zakończenie

background image

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

background image

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

background image

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

background image

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 

background image

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

background image

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

background image

Droga przez mękę ;)

dest=localhost

mangle:

PREROUTING

nat:

PREROUTING

routing

mangle:

INPUT

filter:

INPUT

Proces

lokalny

Sieć

background image

Droga przez mękę ;)

src=localhost

routing

mangle:

OUTPUT

filter:

OUTPUT

Sieć

Proces

lokalny

nat:

OUTPUT

mangle:

POSTROUTING

nat:

POSTROUTING

background image

Droga przez mękę ;)

forwarding

mangle:

PREROUTING

nat:

PREROUTING

routing

mangle:

FORWARD

filter:

FORWARD

Sieć 2

Sieć 1

mangle:

POSTROUTING

nat:

POSTROUTING

background image

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ą

background image

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

background image

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  

background image

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

background image

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    

background image

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, 

FORWARDOUTPUTPREROUTING
POSTROUTING), a cel to DROP lub ACCEPT

iptables 

-E staranazwa nowanazwa

 -t filter

zmiana nazwy łańcucha

background image

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

background image

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 

tcpudp 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

background image

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

background image

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

background image

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

background image

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? 

background image

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

background image

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

background image

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). 

background image

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

background image

loguj_odrzuc

Logowanie pakietu:

iptables -A loguj_odrzuc -j LOG 

Odrzucanie pakietu:

iptables -A loguj_odrzuc -j REJECT

background image

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 ???

background image

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

background image

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

background image

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

background image

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

background image

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.

background image

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. 

background image

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

background image

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

background image

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

background image

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?

background image

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

background image

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

background image

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

background image

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

background image

Literatura

man 8 iptables

http://www.netfilter.org/documentation/

http://iptables-tutorial.frozentux.net/iptables-
tutorial.html

background image

KONIEC

Dziękuję za uwagę