skrypt firewalla - iptables co poprawi

Konfiguracja serwerów, usług, itp.
Andros
Posty: 48
Rejestracja: 11 marca 2009, 17:27
Lokalizacja: Lublin

skrypt firewalla - iptables co poprawić?

Post autor: Andros »

Witam.
Chciałbym sobie sam napisać prostego firewalla pod mojego laptopa bo coś nie ufam firestarterowi.
Czy mógłby ktoś rzucić okiem co mógłbym poprawić?

Kod: Zaznacz cały

#!/bin/sh 
#########################################		
#sudo chmod 700 firewall.sh		#
#sudo cp firewall.sh /etc/init.d/	#
#sudo update-rc.d firewall.sh default 	#
#########################################

#czyszczenie firewalla
iptables -F
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT


echo "Konfiguracja firewalla rozpoczeta"

# ustawiamy zmienne potrzebne firewallowi
MOJEIP=`/sbin/ifconfig | grep 'inet addr' | grep Bcast | awk '{print $2}' | awk -F: '{print $2}'`
echo "moje IP: $MOJEIP"
#DNS1=194.204.159.1
#DNS2=194.204.152.34

# czyscimy wszystko
iptables -F -t nat
iptables -X -t nat
iptables -F -t filter
iptables -X -t filter

################
# blokujemy #
################
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

######################
# ustawienia wstepne #
######################

# ochrona przed atakiem typu Smurf
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# nie akceptujemy pakietow "source route" (zmieniaja tablice routingu)
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

# nie przyjmujemy pakietow ICMP redirect, ktore moga zmienic nasza tablice routingu
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

# wlaczamy ochrone przed blednymi pakietami ICMP error
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

# ochrona przed spoofingiem -kazdy interfejs sieciowy bedzie przyjmowal
# tylko te pakiety ktore znajduja sie w tablicy routingu
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

# wlacza logowanie dziwnych (spoofed, source routed, redirects) pakietow
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

#Blokada przed atakami typu SYN FLOODING
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

#Moduł unclean 6 ma za zadanie wyłapywanie pakietów, które są niepoprawne
#w różny i trudny do sprecyzowania za pomocą standardowych regułek spo-
#sób. Moduł ten przeprowadza przetwarzanym pakiecie szereg testów, badając
#jego zgodność ze standardami, wewnętrzną spójność, poprawność flag i sze-
#reg innych cech. Moduł ten należy umiecśić na początku listy, na przykład
#w postaci poniższych regułek. Pozwoli on wychwycić i zablokować szereg do-
#tychczas znanych ataków związanych z błędną fragmentacją pakietów i fał-
#szywymi flagami, a także nowe ataki lub pakiety uszkodzone na łączach.
iptables -A INPUT -j DROP -m unclean


#### wlaczenie loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A FORWARD -o lo -j ACCEPT

# Dodanie do tablicy INPUT reguł wpuszczających pakiety należące do
#już nawiązanych (ESTABLISHED) połączeń.
iptables -A INPUT -p tcp -j ACCEPT -m state --state ESTABLISHED
iptables -A INPUT -p udp -j ACCEPT -m state --state ESTABLISHED
iptables -A INPUT -p icmp -j ACCEPT -m state --state ESTABLISHED
iptables -A INPUT -p icmp -j ACCEPT -m state --state RELATED

####### strony www i dns   	
 iptables -A INPUT -p tcp  --sport 80  -j ACCEPT   	
 iptables -A INPUT -p udp  --sport 53 -j ACCEPT 	
 #iptables -A OUTPUT -p tcp  --dport 80 -j ACCEPT 
 #iptables -A OUTPUT -p udp  --dport 53 -j ACCEPT 


######## wysokie porty, nikłe zagrożenie
iptables -A INPUT -p tcp --dport 1024:65535 -j ACCEPT
iptables -A INPUT -p udp --dport 1024:65535 -j ACCEPT
iptables -A FORWARD -p tcp --dport 1024:65535 -j ACCEPT
iptables -A FORWARD -p udp --dport 1024:65535 -j ACCEPT

# ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p udp --dport 22 -j ACCEPT


# http i https
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p udp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p udp --dport 443 -j ACCEPT

# ftp
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p udp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p udp --dport 21 -j ACCEPT

# smtp oraz pop3 - oba z ssl
#iptables -A INPUT -p tcp --dport 25 -j ACCEPT
#iptables -A INPUT -p udp --dport 25 -j ACCEPT
#iptables -A INPUT -p tcp --dport 110 -j ACCEPT
#iptables -A INPUT -p udp --dport 110 -j ACCEPT
#iptables -A INPUT -p tcp --dport 465 -j ACCEPT
#iptables -A INPUT -p udp --dport 465 -j ACCEPT
#iptables -A INPUT -p tcp --dport 995 -j ACCEPT
#iptables -A INPUT -p udp --dport 995 -j ACCEPT



#zapisywanie do logow pakietow nie wpuszczonych
iptables -A INPUT -j LOG -m limit --limit 10/hour



echo "Konfiguracja firewalla zakonczona"
cassius7
Posty: 20
Rejestracja: 05 kwietnia 2009, 22:07
Lokalizacja: ¦l±sk

Post autor: cassius7 »

Witam, generalnie bardzo fajny firewall jak na notebooka. Odnośnie spostrzeżeń to:
  • czasami dodajesz reguły, które są niepotrzebne bo masz ustawione ,,policy output'' na ,,accept'' i dajesz ,,accept'' dla ruchu wychodzącego http, https, dns itd.,
  • nie wiem czy reguła:

    Kod: Zaznacz cały

    iptables -A INPUT -p udp --dport 80 -j ACCEPT
    ma sens gdyż http korzysta z tcp,
  • NAT Ci chyba nie jest potrzebny jeżeli ten komputer nie jest ruterem i ma prywatny adres IP,
  • z tym limitem logów bym nie przesadzał bo czasami się bardzo przydają powiedzmy 10 na minutę,
  • i odnośnie ssh to uważaj bo ludzie bardzo lubią się pchać na port 22 i próbują zrobić atak ,,man in the middle'', zmień go na port jakiś wyższy i do inicjalizacji połączeń polecam techniki ,,port knocking'' (knockd),
  • odnośnie połączeń nawiązanych to musisz mieć załadowany moduł ,,ip_conntrack'' i stan ,,related'' też chyba wchodzi w grę podczas komunikacji tcp/udp ale nie jestem pewien bo zawsze mam problemy z ftp na iptables.
Awatar użytkownika
szmergiell
Beginner
Posty: 195
Rejestracja: 20 maja 2008, 00:16
Lokalizacja: Poznań

Post autor: szmergiell »

Ja mam inne pytanie. Zastanawiam się, dlaczego większość skryptów, które ustawiają firewalla są wykonywane przy każdorazowym starcie systemu. Na samym początku uwzględnione jest czyszczenie, a później ponowne ustawianie.
Z tego co zauważyłem, to jeżeli raz ustawiłem iptables, to obecnie mam je cały czas w tym samym stanie. W takim razie, po co każdorazowo je resetować i ponownie ustawiać? To raczej mija się z celem.
Czy dobrze myślę?
Rad
Member
Posty: 1208
Rejestracja: 28 czerwca 2006, 15:05

Post autor: Rad »

szmergiell pisze:Z tego co zauważyłem, to jeżeli raz ustawiłem iptables, to obecnie mam je cały czas w tym samym stanie.
Na pewno po restarcie zachowuje ci się cała konfiguracja iptables bez żadnych dodatkowych programów czy skryptów? Sprawdź w iptables -L -v.
Andros
Posty: 48
Rejestracja: 11 marca 2009, 17:27
Lokalizacja: Lublin

Post autor: Andros »

Dziękuję za rady cassius7 muszę troszkę poprawić, ale co do portu 80 na UDP to metoda prób i błędów wyszło mi że ma być otwarty, chociaż też mnie dziwiło. Jeśli go zamknąłem to www nie chodziło. Jak załadować te moduły?

A co do Twojego pytania szmergielI to jest tak. W prawie każdym Linuksie (jak nie w każdym) skrypty, które mają ładować się wraz z jądrem automatycznie, znajdują się w katalogu /etc/init.d/. Przy każdym starcie systemu jadro ładuje się wraz z tymi skryptami, a musimy wyczyścić firewalla ponieważ filozofia iptables jest następująca:
  • Jeśli jakiś pakiet dociera do Twojego komputera to skrypt firewalla sprawdza go stosując reguły po kolei patrząc "od góry" i jeśli jakaś reguła pasuje do tego pakietu czyli odrzuca go lub wpuszcza do systemu wtedy ta akcja zostaje automatycznie wykonana bez sprawdzenia dalszych reguł np. jeśli mamy regułę:

    Kod: Zaznacz cały

    iptables -A INPUT -p udp --dport 80 -j ACCEPT
    #a następnie pod nią  regułę 
    iptables -A INPUT -p udp --dport 80 -j DROP
    to ten pakiet i tak zostanie wpuszczony do systemu ponieważ reguła z ,,ACCEPT'' jest wyżej i po natrafieniu na nią pakietu UDP na port 80 dalsze reguły już nie są sprawdzane ponieważ została znaleziona pierwsza pasująca (reguły z flagą -P czyli iptables -P INPUT DROP, iptables -P OUTPUT ACCEPT, iptables -P FORWARD DROP rządzą się troszeczkę innymi zasadami) i dlatego właśnie musimy wyczyścić tablicę iptables bo gdyby jakimś cudem przed startem naszego skryptu były w niej jakieś reguły to pakiety stosowałyby się do tych reguł, a nie do naszego skryptu.
To tak po części mam nadzieję że troszkę Ci wytłumaczyłem.
cassius7
Posty: 20
Rejestracja: 05 kwietnia 2009, 22:07
Lokalizacja: ¦l±sk

Post autor: cassius7 »

Z mojego doswiadczenia ilekroc resetowalem kompa to iptables sie czyscilo na dystrybucjach rzedu: slackware, debian. Sa dwie szkoly jazdy jedna z nich to wlasnie utworzenie takiego skryptu jak kolega Andros i potem ustawienie jego autouruchamiania w runlevelu a druga to skorzystanie z iptables-save i iptables-restore.

Andros: Hmm nie wiem czemu tak jest z tym udp ale kiedys tez slyszalem o tym, ze dns w rzeczy samej nie korzysta tylko z udp ale rowniez z tcp dla jakis bardziej skomplikowanych zapytan. Odnosnie tych modulow to musisz sobie przejrzec zrodla kernelika pod networking/netfilter_costam/itd i wkompilowac na stale cos albo

Kod: Zaznacz cały

ls /lib/modules/2.6.xx/kernel/net/ipv4/netfilter/
poogladac i poczytac co dane moduly robia. Z tych najwazniejszych to polecam ip_conntrack i wszystkie jego odmiany dla ftp,irc itp. Odpowiada on za sledzenie polaczenia gdyz tak naprawde wiekszosc polaczen zachowuje tylko standardowe porty przy inicjalizacji a potem juz to wszystko jest wywalane na porty wyzsze 1024:65536 i jak nasz firewall nie bedzie tego sledzil to nie bardzo to bedzie dzialac. Ladujemy modul normalnie modprobem albo w /etc/modules na stale.
Awatar użytkownika
szmergiell
Beginner
Posty: 195
Rejestracja: 20 maja 2008, 00:16
Lokalizacja: Poznań

Post autor: szmergiell »

Rad, Andros, cassius7, rzeczywiście jest pusto ;) Wydawało mi się jednak, że po restarcie nadal działa. W szczególności, że testowanie portów z wykorzystaniem różnych serwisów WWW przeznaczonych do tego, informowało mnie o pełnym zabezpieczeniu. Czyżby tak było, gdyż dostawca netu (PLAY) ładnie mnie osłania?

W takim razie muszę zabrać się za ustawienie jakichś ładnych regułek.
Pzdr.

PS A czy w ogóle w takiej sytuacji muszę cokolwiek ustawiać? Czy prewencyjnie lepiej to zrobić?
Andros
Posty: 48
Rejestracja: 11 marca 2009, 17:27
Lokalizacja: Lublin

Post autor: Andros »

modul ip_conntrack jest juz zaladowany automatycznie w Debianie, chcialem sie bawic "port knockingiem", samo zalozenie jest proste ale wykonanie troszke zamotane. Natrafilem na taki fajny programik fail2ban, ktory blokuje dane IP np. po 3 nieudanych probach logwania przez ssh na okreslony przeze mnie czas. Mysle ze to jest wystarczajaca obrona.

szmergieII mozliwe ze PLAY w jakims stopniu Cie broni swoim firewallem ale radze napisac swoje reguly bo domyslnie wszystkie porty masz otwarte i nie zapomnij dodac swojego skryptu do inita.

Kod: Zaznacz cały

sudo chmod 700 firewall.sh        
sudo cp firewall.sh /etc/init.d/    
sudo update-rc.d firewall.sh defaults
Awatar użytkownika
grzesiek
Junior Member
Posty: 932
Rejestracja: 06 stycznia 2008, 10:41
Lokalizacja: Białystok

Post autor: grzesiek »

Andros pisze:Dziękuję za rady cassius7 muszę troszkę poprawić, ale co do portu 80 na UDP to metoda prób i błędów wyszło mi że ma być otwarty, chociaż też mnie dziwiło. Jeśli go zamknąłem to www nie chodziło.
Metoda strawdzania ]grzesiek@home:~$ cat /etc/services | grep www
# Updated from http://www.iana.org/assignments/port-numbers and other
# sources like http://www.freebsd.org/cgi/cvsweb.cgi/src/etc/services .
www 80/tcp http # WorldWideWeb HTTP
www 80/udp # HyperText Transfer Protocol
[/code]
I to działa? Nie, a nawet tak! :-)
cassius7
Posty: 20
Rejestracja: 05 kwietnia 2009, 22:07
Lokalizacja: ¦l±sk

Post autor: cassius7 »

Temat sie zrobil bardzo dyskusyjny widze, ale z mojej wiedzy wiadomo, ze http generalnie jest traktowany jako protokol zapewniajacy niezawodny przeplyw danych z potwierdzeniem tego i musi korzystac tylko i wylacznie z tcp bo taka jest jego natura dzialania, udp jest protokolem calkowicie bezpolaczeniowym co powoduje, ze jest znacznie szybszy i zwala odpowiedzialnosc kontroli przeplywu na warstawy aplikacyjne (L7). Ktos moze zarzucic mi, ze gdy powiedzmy oglada filmiki na youtube to faktycznie w tym momencie dane do filmiku sa przesylane po udp ale w gre wchodzi inny protokol warstwy aplikacji (jakis RTP, RTCP, czy cos innego do strumieniowania), wiec generalnie dalej http jest http. Przeszukalem troche internet i nie znalazlem jakis konkretnych dowodow, ze do dzialania http jest wykorzystywany udp w jakimkolwiek znaczeniu. Prosze o dowod :)

PS: A moze to jest specyficzna dystrybucja?
ODPOWIEDZ