|
skrypt firewalla - iptables co poprawić?
Andros - 10-04-2009 17:06
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ć? #!/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 - 10-04-2009 22:43
Witam, generalnie bardzo fajny firewall jak na notebooka. Odnośnie spostrzeżeń to:lczasami 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.,l
lnie wiem czy reguła:
iptables -A INPUT -p udp --dport 80 -j ACCEPT
ma sens gdyż http korzysta z tcp,l
lNAT Ci chyba nie jest potrzebny jeżeli ten komputer nie jest ruterem i ma prywatny adres IP,l
lz tym limitem logów bym nie przesadzał bo czasami się bardzo przydają powiedzmy 10 na minutę,l
li 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),l
lodnoś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.l
szmergiell - 10-04-2009 23:28
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 - 11-04-2009 11:55
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 - 11-04-2009 12:06
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:lJeś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łę:
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.l
To tak po części mam nadzieję że troszkę Ci wytłumaczyłem.
cassius7 - 11-04-2009 12:10
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 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.
szmergiell - 11-04-2009 14:50
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 - 11-04-2009 15:30
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.
sudo chmod 700 firewall.sh sudo cp firewall.sh /etc/init.d/ sudo update-rc.d firewall.sh defaults
grzesiek - 12-04-2009 09:04
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
I to działa? Nie, a nawet tak! :-)
cassius7 - 12-04-2009 12:39
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?
grzesiek - 12-04-2009 13:06
UDP jest potrzebne dla serwera, jeżeli jesteś tylko klientem wystarczy tylko TCP.
Andros - 14-04-2009 13:36
Jeżeli UDP jest tylko potrzebne dla serwera to zablokuj sobie w iptables UDP i spróbuj otworzyć jakąś stronę www.
cassius7 - 14-04-2009 15:17
Nie, no nie ma opcji sprawdzałem i jako zwykły klient tylko tcp potrzebne. Pytałem jeszcze kolegi po fachu i mnie wyśmiał...
grzesiek - 14-04-2009 16:51
Działa, działa, poza tym strona stronie nie równa, ale jeżeli chodzi o czysty protokół http to TCP 80 (docelowy) jako klient.
szmergiell - 23-04-2009 21:43
Odświeżając temat: Zmodyfikowałem powyższy skrypt do ogniomurka. Wygląda następująco: #!/bin/sh ######################################### #sudo chmod 700 firewall.sh # #sudo cp firewall.sh /etc/init.d/ # #sudo update-rc.d firewall.sh defaults # #########################################
#czyszczenie firewalla iptables -F
echo "Konfiguracja firewalla rozpoczeta" MOJEIP=`/sbin/ifconfig | grep 'inet addr' | grep Bcast | awk '{print $2}' | awk -F: '{print $2}'` echo "moje IP: $MOJEIP"
# 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
#### 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
# ssh #iptables -A INPUT -p tcp --dport 22 -j ACCEPT #iptables -A INPUT -p udp --dport 22 -j ACCEPT
echo "Konfiguracja firewalla zakonczona"
Z powyższego usunąłem wszelkie INPUT-y ponieważ komputer jest tylko "odbiorcą" Internetu i nie posiada żadnego serwera FTP, WWW itp. Pozostawiłem jedynie SSH, ponieważ będę kombinował z łączeniem się przez niego. To, co zostało to wszelkie ESTABLISHED, gdyż połączenia wywołane z komputera mogą do niego wracać.
Powyższy skrypt działa dobrze. Z początku był jakiś problem z BitTorrentem (wolne pobieranie pliku, ale już działa OK). Mam również problem z pobieraniem aktualizacji poprzez apt, gdyż bardzo wolno to działa (chociaż niekoniecznie jest to problem z firewallem, gdyż bez niego jest podobnie).
Czy powyższy skrypt może być, drodzy koledzy?
z3d - 23-04-2009 22:35
Cześć Myślę że spokojnie może być. Jedno co bym zmienił to port dla ssh i ewentualnie logowanie na port z przydzielonego IP (dla bezpieczeństwa - paranoja :) ) Gdzieś ostatnio wkleiłem swojego firewalla, siedziałem nad nim trochę czasu, możesz spróbować coś z nim zrobić. Tylko jedna rzecz, mój firewall pisany był pod serwer, delikatne zmiany i wszystko będzie cacy :)
pure_linux - 24-05-2009 00:07
Hej dziewczyny i chłopaki! Wszystko fajnie ale niestety to nie jest dynamiczny firewall:
################################################### ################################################### ################################################### ########### ########### ########### ########### ########### rc.firewall ########### ########### ########### ################################################### ################################################### ################################################### ###################################################
ip=123.123.123.123 ################################################ ############################## iptables -F ################################################# #### polityka DROP dla INPUT iptables -P INPUT DROP ################################################# #### polityka DROP dla OUTPUT iptables -P OUTPUT DROP ################################################### #### polityka ACCEPT dla FORWARD iptables -P FORWARD ACCEPT
#### wlaczenie loopback iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT iptables -A FORWARD -o lo -j ACCEPT
##################################################################### ####### WWW & DNS ##################################################
iptables -A OUTPUT -p tcp --syn -s $ip --dport 80 -j ACCEPT -m state --state NEW iptables -A OUTPUT -p udp -s $ip --dport 53 -j ACCEPT -m state --state NEW
##################################################################### ####### kadu ########################################################
iptables -A OUTPUT -p tcp -s 0/0 --dport 8074 -j ACCEPT -m state --state NEW
#################################################################### ###### ssh -1/min- #################################
iptables -A INPUT -p tcp --dport 22 -m hashlimit --hashlimit 1/min --hashlimit-mode srcip --hashlimit-name ssh -m state --state NEW -j ACCEPT iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT -m state --state NEW
#################################################################### ##### auth #########################################################
iptables -A INPUT -p tcp --source-port 113 -j ACCEPT
##################################################################### #### ftp ###########################################################
#iptables -A INPUT -p tcp ! --syn --sport 20:21 -d $ip --dport 1024:65535 -j ACCEPT iptables -A OUTPUT -p tcp -s $ip --sport 1024:65535 --dport 20:21 -j ACCEPT -m state --state NEW
###################################################################### #### Zabezpieczenie przed powodzia SYN (Syn-flood):###################
iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
###################################################################### #### Ping of death: ##################################################
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
##################################################################### #### Wlaczenie przekazywania IP######################################
#echo 1 > /proc/sys/net/ipv4/ip_forward echo 0 > /proc/sys/net/ipv4/ip_forward ##################################################################### #### Wlaczenie blokady komunikatow echo (ping) jesli : 0 --true , 1 --false
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
##################################################################### #### Blokada przed atakami typu SYN FLOODING
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
##################################################################### # Weryfikacja adresu zrodlowego na poziomie kernela # zeby zdalne hosty nie mogly sie podszyc pod moj komputer #####################################################################
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
################################################ #PING iptables -A INPUT -p icmp -s 0/0 -d 0/0 -j DROP
#################################################################### #### poĂ
‚Ă…czenia https, skype ######################################
iptables -A OUTPUT -p tcp -s $ip --sport 1024:65535 --dport 443 -j ACCEPT -m state --state NEW
#############################################################################
iptables -A OUTPUT -p tcp -s $ip -d 0/0 --dport 1024:65535 -j ACCEPT -m state --state NEW
############################################################################# #############################################################################
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
I teraz porównajcie sobie, polecam sprawdzić. Ile rzeczy mam na ,,INPUT ='' ile mam zagrożeń.
zanotowane.pldoc.pisz.plpdf.pisz.plminister.pev.pl
|