#!/bin/sh # Opis: Skrypt Firewalla na iptables # Author: nShield Team # HomePage: http://nshield.neutrinus.com # Uzyteczne funkcje informuj () { # Kwestie informacyjne $ECHO "EXTDEV : ${EXTDEV} z ${EXTIP}" $ECHO "INTDEV : ${INTDEV} z ${INTIP}, podsiec ${INTNET}" $ECHO "INTBROADCAST : ${INTBROADCAST}" #jesli uzywamy statystuki to wyswietlamy.... if [ -z "${USERLIST}" ]; then $ECHO "STATYSTYKA :" for user in $USERLIST do $ECHO " $INTNETSHORT$user" done fi } # Adres do iptables # tu powinienes/as se zmienic... IPTABLES="/sbin/iptables" # Adres do echo # tu powinienes/as se zmienic... ECHO="/bin/echo" # Adres do rmmod # tu powinienes/as se zmienic... RMMOD="/sbin/rmmod" # Adres do modprobe # tu powinienes/as se zmienic... MODPROBE="/sbin/modprobe" $ECHO "nShield 0.94" #Sprawdzamy czy obsluga sieci jest wogle uruchomiona #jak nie to poco mam sie meczyc??? FIXME: nie dziala w slacku... ktos wie czemu? #[ ${NETWORKING} = "no" ] && exit 0 # Sprawdzamy czy czasem nie uzywamy ipchains zamiast iptables if [ -f /proc/net/ip_fwchains ] then $ECHO "Wyglada na to ze nie uzywasz iptables a ipchains. sprawdz to." exit 1 fi # Sprawdzany czy jestes rootem if [ "$UID" != "0" ]; then $ECHO "Musisz miec uprawnienia roota aby moc grzebac cos w firewallach" exit 1 fi # Sprawdzant czy masz iptables if [ ! -x $IPTABLES ]; then echo "Sprawdz sciezke do iptables i nadaj im +x" exit 1 fi # Wszystko z przedrostkim EXT oznacza wyjscie na swiat, z INT siec wewnetrzna # Zewnetrzny interfejs EXTDEV="ppp0" # Zewnetrzny adres IP # Dalem taka skaplikowana regulke poniewaz dziala ona tez przy sieciach DHCP EXTIP=`ifconfig $EXTDEV | grep "inet addr:" | \ cut -d':' -f2 | cut -d' ' -f1` if [ -z "${EXTIP}" ]; then exit 1 fi # Ale gdyby nie dzialala to zamiast niej uruchom ta: #EXTIP="x.x.x.x" # Wewnetrzny interfejs INTDEV="eth0" # Wewnetrzny adres IP # Dalem taka skaplikowana regulke poniewaz dziala ona tez przy sieciach DHCP INTIP=`ifconfig $INTDEV | grep "inet addr:" | \ cut -d':' -f2 | cut -d' ' -f1` if [ -z "${INTIP}" ]; then exit 1 fi # Ale gdyby nie dzialala to zamiast niej uruchom ta: #INTIP="y.y.y.y" # Maska sieci wewnetrznej - trzeba miec pakiet ip.... - nie wszesdzie jest #INTNET=`ip addr show $INTDEV | awk '/inet/{print$2}'` # Ale gdyby nie dzialala to zamiast niej uruchom ta: INTNET="192.168.1.0/24" # Broadcast INTBROADCAST=`ifconfig $INTDEV | grep inet | cut -d : -f 3 | cut -d" " -f 1` # Ale gdyby nie dzialalo to zamiast niej uruchom to: #INTBROADCAST="192.168.1.255" # Do statystyk # poczatek adresu uzytkownikow INTNETSHORT=`ifconfig $INTDEV | awk '/inet/{sub("addr:","");sub("[^.]*$","",$2);print$2}'` # Ale gdyby nie dzialalo to zamiast niej uruchom to: #INTNETSHORT="192.168.1." # Koncowki adresu uzytkownikow do statystyki #USERLIST="101 105" # MRTG - tu definiujejmy hosty ktorych adresy maskujemy #NATED_HOSTS="komp0 komp1 komp2 komp3 komp4 komp5 komp6" case "$1" in start) # Startuje firewall. #kwestie informacyjne informuj $ECHO -n "Odpalam firewall: " # Ladowanie Modolow # (jesli nie masz obsugi firewalli wkapilowanej na stale # do kernela to tutaj powinienes sobie podladowac # potrzebne moduly) #$MODPROBE ip_tables # ip_conntrack umozliwia sledzenie polaczen #$MODPROBE ip_conntrack #$MODPROBE ip_conntrack_ftp # Raczej wymagane dla passive ftp #$MODPROBE ip_conntrack_irc # wymagane przy przekierowaniu serwera ftp z LAN #$MODPROBE ip_nat_ftp # wymagane przy przekierowaniu serwara irca z LAN #$MODPROBE ip_nat_irc # Wlaczamy se maskarade # czyli: # pakiety z sieci wew. wychodza do internetu # tak jakby byly wyslane przez nasz gateway. # gdy masz numer statyczny to korzystaj z SNAT-a(np.SDI, DSL) $IPTABLES -t nat -A POSTROUTING -o $EXTDEV -j SNAT --to-source $EXTIP # gdy chcemy udostepnic numer statyczny poszczegulnym osoba z SNAT [mardok] #$IPTABLES -t nat -A POSTROUTING -s x.y.z.v -o $EXTDEV -j SNAT --to-source=$EXTIP # zmiana zrodla dla pakietow wychodzacych z sieci wewnetrznej (bez tego # nie dziala prawidlowo przekierowanie polaczen z sieci wewnetrznej) $IPTABLES -t nat -A POSTROUTING -s $INTNET -j SNAT --to-source=$INTIP # gdy nasz numer dynamiczny lub wdzwaniasz sie w siec # (modem, NEO+) to korzystaj z maskarady # $IPTABLES -t nat -A POSTROUTING -s $INTNET -o $EXTDEV -j MASQUERADE # lub gdy chcesz tylko niektorym ip dac net: # $IPTABLES -t nat -A POSTROUTING -s x.y.z.v -o $EXTDEV -j MASQUERADE # mozna tez liste userow z netem trzymac w pliku... #$NATED="$(/bin/grep -vE '^[[:space:]]*(#|$)' /etc/firewall_nated)" #for mac in NATED # do #Masq # $IPTABLES -t nat -A POSTROUTING -m mac --mac-source $(echo $mac | awk -F'-' {'print $1'}) -s $(echo $mac | awk -F'-' {'print $2'}) -o $EXTDEV -j MASQUERADE #Snat # $IPTABLES -t nat -A POSTROUTING -m mac --mac-source $(echo $mac | awk -F'-' {'print $1'}) -s $(echo $mac | awk -F'-' {'print $2'}) -o $EXTDEV -j SNAT --to-source=$EXTIP # done # Czyscimy lancuchy $IPTABLES -F $IPTABLES -X #$IPTABLES -Z #kasujemy liczniki # Polityki domyslne dla pakietow $IPTABLES -P INPUT DROP $IPTABLES -P OUTPUT DROP $IPTABLES -P FORWARD DROP #--==[ Opcje kernela ]==-- # # Zalaczenie forwardingu w kernelu $ECHO "1" > /proc/sys/net/ipv4/ip_forward # Wlaczamy odpowiedzi na pingi # (nasz komputer bedzie odpowiadal na pingowanie # nas przez kogos) $ECHO "0" > /proc/sys/net/ipv4/icmp_echo_ignore_all # Ochrona przed atakiem typu Smurf # -zapchanie lacza odpowiedziami na pakiety # wysylane na adresy broadcast $ECHO "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # Nie akceptujemy pakietow "Source route" # (nie pozwalamy zmiac naszej tablicy routingu specjalnymi pakietami) $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 [Artur Wladyczka] $ECHO "1" > /proc/sys/net/ipv4/conf/all/log_martians # Limitowanie sesji tcp [Artur Wladyczka, komentarze Berta Huberta, nadeslane przez DreameR] # Czas przez który utrzymywac gniazdo w stanie FIN-WAIT-2 jezli zostalo # zamkniete przez druga strone. $ECHO "30" > /proc/sys/net/ipv4/tcp_fin_timeout #Jak czesto TCP wysyla wiadomosci `keepalive', jesli wlaczono ta funkcje - #domyslnie co 2 godziny. $ECHO "2400" > /proc/sys/net/ipv4/tcp_keepalive_time #TCP/IP umozliwia normalnie obsluge okien do rozmiarów 65535 bajtów. Dla #bardzo szybkich sieci moze to nie byc wystarczajaca wartosc. Opcje #skalowania okien pozwalaja rozszerzyc je az do laczy gigabitowych, co jest #pozyteczne dla polaczen z duzymi przepustowosciami. $ECHO "0" > /proc/sys/net/ipv4/tcp_window_scaling #Uzyj selektywnego ACK, co moze pomoc stwierdzic, ze brakuje pewnych #pakietów - a w zwiazku z tym wspomoc proces odzyskiwania zasobow. $ECHO "0" > /proc/sys/net/ipv4/tcp_sack # ip_contrack # IMHO biega to o maxymalny rozmiar przeznaczony na tablice pakietow(FIXME) $ECHO "36000" > /proc/sys/net/ipv4/ip_conntrack_max #Czas w sekundach, przez który fragmenty IP sa przetrzymywane w pamieci. $ECHO "20" > /proc/sys/net/ipv4/ipfrag_time #Maksymalna ilosc pamietanych zadan poleczen, które nadal nie zostaly #potwierdzone przez klienta. Domyslna wartosc 1024 jest wlasciwa dla systemów #z pamiecia powyzej 128MB, a 128 jest dobre dla komputerów z mniejsza iloscia #pamieci. Jezli masz przeladowany serwer spróbuj zwiekszyc ta wartosc. Uwaga! #Jesli ustawisz ja na wiecej niz 1024, lepiej bedzie zmienic równiez #TCP_SYNQ_HSIZE w pliku include/net/tcp.h by utrzymać zaleznosc #TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog i przekompilowac kernel. $ECHO "1280" > /proc/sys/net/ipv4/tcp_max_syn_backlog # Pelny ruch na interfejsie lo # (potrzebne dla dzialania wielu lokalnych uslog) $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A OUTPUT -o lo -j ACCEPT #--==[ MRTG ]==-- # (statystyki pakietow i nie tylko) # reszte skryptow do mrtg znajdzesz na http://neutrinus.com/projekty/admin-script/mrtg # napiszcie jak to dziala....... #$IPTABLES -N in_counter #$IPTABLES -N out_counter #$IPTABLES -N proxy_in_counter #$IPTABLES -N proxy_out_counter # najpierw kierujemy caly liczony ruch przez nasze lancuchy # ruch wejsciowy ppp0 (inet > serwer) #$IPTABLES -A FORWARD -i $EXTDEV -d ! $EXTIP -j in_counter # ruch wyjsciowy ppp0 (serwer > inet) #$IPTABLES -A FORWARD -o $EXTDEV -d ! $EXTIP -j out_counter # Zapytania proxy (pc > proxy) #$IPTABLES -A INPUT -i $INTDEV -p tcp -d $INTIP --dport 8080 -j proxy_out_counter # Odpowiedzi proxy (proxy > pc) #$IPTABLES -A OUTPUT -o $INTDEV -p tcp -s $INTIP --sport 8080 -j proxy_in_counter #for HOST in $NATED_HOSTS; do # $IPTABLES -A proxy_in_counter -d $HOST # $IPTABLES -A proxy_out_counter -s $HOST # $IPTABLES -A in_counter -d $HOST # $IPTABLES -A out_counter -s $HOST #done #--==[ MAC_check ]==-- # W FAZIE TESTOW!!!!!!!!!!! # Tu mozemy blokowac wszystkich niechcianych _gosci_ w naszej sieci # -odcinamy wszystkie MAC oprocz "naszych" od forwardu # Zakladamy sobie nowy lancuch #$IPTABLES -N MAC_check # Caly forward z naszej sieci przechodzi przez MAC_check #$IPTABLES -A FORWARD -s $INTNET -j MAC_check # Pozwalamy znanym MACom wejsc a reszcie niet. # zamiast xx:xx:xx:xx:xx:xx daj adres MAC i tak dla kazdego hosta.. # oraz dla x.x.x.x adres IP dla tego MACa #$IPTABLES -A MAC_check -m mac --mac-source xx:xx:xx:xx:xx:xx -s x.x.x.x -j RETURN # Lub aby nam bylo wygodniej mozna w osobnym pliku # w formacie (MAC IP) [IKS] # # chcecie komentarzy w tych samych liniach, co wpisy? # w takim razie musimy zrobić pętlę po pojedynczych liniach a nie po całym pliku naraz --jx # cat /etc/firewall_mac | while read linia do MAC_ALLOW="`echo $linia | grep -vE '^[[:space:]]*(#|$)'`" if [ "$MAC_ALLOW" != "" ] then IP="`echo $MAC_ALLOW | cut -d' ' -f2`" MAC="`echo $MAC_ALLOW | cut -d' ' -f1`" $ECHO "IP: $IP z MAC: $MAC" $IPTABLES -A MAC_check -m mac --mac-source $MAC -s $IP -j RETURN fi done # wszystko co pozostalo DROP #$IPTABLES -A MAC_check -j DROP #--==[ TTL_check ]==-- # W FAZIE TESTOW!!!!!!!!!!! # Tu mozemy blokowac niechciane pod-udostepnienia netu w naszej sieci # -odcinamy wszystkie ttl oprocz normalnych # zobacz komentaz do TTL (nizej) #$IPTABLES -N TTL_check # Caly forward z naszej sieci przechodzi przez TTL_check # oprocz icmp - aby dzialalo traceroute... ale bedzie dzialac tez ping! #$IPTABLES -A FORWARD -p ! icmp -s $INTNET -j TTL_check #$IPTABLES -A TTL_check -m ttl --ttl-eq 255 -j RETURN #$IPTABLES -A TTL_check -m ttl --ttl-eq 127 -j RETURN #$IPTABLES -A TTL_check -m ttl --ttl-eq 63 -j RETURN #$IPTABLES -A TTL_check -j DROP #--=={ PRZEKIEROWANIA PORTOW }==-- # Odkomentuj ponizsze linie jedynie jesli # przekierowanie portow z serwera na inny komputer jest konieczne. # # # Teraz co jest co: # $SRCPRT -port na komputerze z ktorego przekierowujemy. # $SRCIP -IP komputera z ktorego przekierowujemy. # $DSTIP -IP komputera do ktorego przekierowujemy # $DSTPRT -port na ktory bedziemy przekierowywac. # $ALLOWFROM -ktore komputery maja prawo wysylac do nas... # # #$IPTABLES -I FORWARD -p tcp -d $DSTIP --dport $DSTPRT -j ACCEPT #$IPTABLES -I FORWARD -p udp -d $DSTIP --dport $DSTPRT -j ACCEPT #$IPTABLES -t nat -A PREROUTING -p tcp -i $EXTDEV -s $ALLOWFROM -d $SRCIP --dport $SRCPRT -j DNAT --to $DSTIP:$DSTPRT #$IPTABLES -t nat -A PREROUTING -p udp -i $EXTDEV -s $ALLOWFROM -d $SRCIP --dport $SRCPRT -j DNAT --to $DSTIP:$DSTPRT #--==[ TRANSPARENTNE PROXY ]==-- # Tutaj pokazuje jak zrobic przekierowanie portow na tym samym komputerze. # do tego musisz sobie jeszcze odhasowac usluge proxy! # SQUID wymaga aby go jeszcze skonfigurowac dodatkowo do tego. #$IPTABLES -t nat -A PREROUTING -s $INTNET -p tcp -d ! $INTNET --dport 80 -j DNAT --to-destination $INTIP:8080 #--==[ Flood ]==-- # W FAZIE TESTOW!!!!!!!!!!! # Zabezpieczenia przed atakami polegajacymi na bardzo szybkim nawiazywaniu polaczen z naszym serwerem, # kompami w lanie i przed atakowaniem w ten sposób z naszego lana serwerow w Internecie #Zabezpieczenie przed powodzia pakietow SYN (ang. Syn-flood) $IPTABLES -N syn-flood_check $IPTABLES -A FORWARD -p tcp --syn -j syn-flood_check $IPTABLES -A INPUT -p tcp --syn -j syn-flood_check $IPTABLES -A syn-flood_check -m limit --limit 1/s -j RETURN $IPTABLES -A syn-flood_check -j DROP # Obrona przed skanerami portow szybko przemiatajacymi siec $IPTABLES -N scan-flood_check $IPTABLES -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j scan-flood_check $IPTABLES -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j scan-flood_check $IPTABLES -A scan-flood_check -m limit --limit 1/s -j RETURN $IPTABLES -A scan-flood_check -j DROP #Ping of death $IPTABLES -N ping-flood_check $IPTABLES -A FORWARD -p icmp --icmp-type echo-request -j ping-flood_check $IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ping-flood_check $IPTABLES -A ping-flood_check -m limit --limit 1/s -j RETURN $IPTABLES -A ping-flood_check -j DROP #---==[ LANCUCH INPUT ]==--- # Musimy przepuscic niektore komunikaty ICMP z LAN i net #Source Quench -tlumienie zrodla $IPTABLES -A INPUT -i $EXTDEV -p icmp --icmp-type 4 -d $EXTIP -j ACCEPT $IPTABLES -A INPUT -i $INTDEV -p icmp --icmp-type 4 -d $INTIP -j ACCEPT #Parametr problem - problem z parametrem $IPTABLES -A INPUT -i $EXTDEV -p icmp --icmp-type 12 -d $EXTIP -j ACCEPT $IPTABLES -A INPUT -i $INTDEV -p icmp --icmp-type 12 -d $INTIP -j ACCEPT #Destination Unrechable - nieosiagniety cel $IPTABLES -A INPUT -i $EXTDEV -p icmp --icmp-type 3 -d $EXTIP -j ACCEPT $IPTABLES -A INPUT -i $INTDEV -p icmp --icmp-type 3 -d $INTIP -j ACCEPT #Time Exceeded - Przekroczony limit czasu $IPTABLES -A INPUT -i $EXTDEV -p icmp --icmp-type 11 -d $EXTIP -j ACCEPT $IPTABLES -A INPUT -i $INTDEV -p icmp --icmp-type 11 -d $INTIP -j ACCEPT #Echo request - zadanie echa # aby wylaczyc odpowiedzi na pingi nalezy to zakomentowac i wyzej # wylaczyc je w opcjach kernela $IPTABLES -A INPUT -i $EXTDEV -p icmp --icmp-type 8 -d $EXTIP -j ACCEPT $IPTABLES -A INPUT -i $INTDEV -p icmp --icmp-type 8 -d $INTIP -j ACCEPT #Echo reply - echo na zadanie # to uruchamiamy gdy kcemy muc odebrac echo z komputera ktory pingujemy $IPTABLES -A INPUT -i $EXTDEV -p icmp --icmp-type 0 -d $EXTIP -j ACCEPT $IPTABLES -A INPUT -i $INTDEV -p icmp --icmp-type 0 -d $INTIP -j ACCEPT # Przepuszcza pakiety z flaga ESTABLISHED i RELATED $IPTABLES -A INPUT -m state --state ESTABLISHED -j ACCEPT $IPTABLES -A INPUT -m state --state RELATED -j ACCEPT # Pozbywamy sie "smieci" z shitu micro$oftu -netbios.[david granac] # -Z tym nie dziala SAMBA!! #$IPTABLES -A INPUT -i $INTDEV -s 10.0.0.0/8 -j DROP #klasa A #$IPTABLES -A INPUT -i $INTDEV -s 172.16.0.0/12 -j DROP #klasa B #$IPTABLES -A INPUT -i $INTDEV -s 192.168.0.0/16 -j DROP #klasa C #$IPTABLES -A INPUT -i $INTDEV -s 224.0.0.0/4 -j DROP # multicast #$IPTABLES -A INPUT -i $INTDEV -d 224.0.0.0/4 -j DROP # multicast #$IPTABLES -A INPUT -i $INTDEV -s 240.0.0.0/5 -j DROP # reserved #$IPTABLES -A INPUT -i $INTDEV -d 127.0.0.0/8 -j DROP # ?? #$IPTABLES -A INPUT -i $INTDEV -d 111.222.333.255 -j DROP # broadcasty #$IPTABLES -A INPUT -i $INTDEV -p udp -d $INTBROADCAST --dport 137:138 -j DROP #$IPTABLES -A INPUT -i $EXTDEV -s 10.0.0.0/8 -j DROP #klasa A #$IPTABLES -A INPUT -i $EXTDEV -s 172.16.0.0/12 -j DROP #klasa B #$IPTABLES -A INPUT -i $EXTDEV -s 192.168.0.0/16 -j DROP #klasa C #$IPTABLES -A INPUT -i $EXTDEV -s 224.0.0.0/4 -j DROP # multicast #$IPTABLES -A INPUT -i $EXTDEV -d 224.0.0.0/4 -j DROP # multicast #$IPTABLES -A INPUT -i $EXTDEV -s 240.0.0.0/5 -j DROP # reserved #$IPTABLES -A INPUT -i $EXTDEV -d 127.0.0.0/8 -j DROP # ?? #$IPTABLES -A INPUT -i $EXTDEV -d 111.222.333.255 -j DROP # broadcasty #$IPTABLES -A INPUT -i $EXTDEV -p udp -d $INTBROADCAST --dport 137:138 -j DROP # Sekcja wywalania _dziur_ w firewallu dla roznych demonow czy serwerow: # jesli chcesz aby ten komputer byl serwerem czegos(www, ftp czy poczta) # musisz zrobic 'dziure' w firewallu dla danego deamona. # # opcja '-i DEV' pozwala odblokowac port tylko na danym interfejsie # -np samba nie powinna byc widoczna z internetu a w LAN powinna :) # '-s IP' pozwala odblokowac tylko dla danego IP # '-m mac --mac-source MAC' odblokowuje tylko dla danego maca #** FTP ** # Akceptujemy pakiety NEW na naszym porcie 21(ftp) tcp. # Oraz dla otworzenia kanalu danych w aktiv port 20 tcp. #$IPTABLES -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT #$IPTABLES -A INPUT -p tcp --dport 20 -m state --state NEW -j ACCEPT #** SSH ** # Akceptujemy pakiety NEW na naszym porcie 22(ssh). # fajnie by bylo dodac "-s a.b.c.d" aby moc sie logowac tylko z jednego IP. #$IPTABLES -A INPUT -p tcp --sport 1024: --dport 22 -m state --state NEW -j ACCEPT #Tylko okreslony komputer moze sie zajac naszym komputerem :] #$IPTABLES -A INPUT -i $EXTDEV -s a.b.c.d -p tcp --sport 1024: --dport 22 -m state+--state NEW -j ACCEPT #** DNS ** # Akceptujemy pakiety NEW na naszym porcie 53(DNS) tcp i udp z sieci lokalnej. # Transakcje serwer-klient #$IPTABLES -A INPUT -i $INTDEV -p tcp --sport 1024: --dport 53 -m state --state NEW -j ACCEPT #$IPTABLES -A INPUT -i $INTDEV -p udp --sport 1024: --dport 53 -m state --state NEW -j ACCEPT # Transakcje serwer-serwer #$IPTABLES -A INPUT -i $INTDEV -p tcp --sport 53 --dport 53 -m state --state NEW -j ACCEPT #$IPTABLES -A INPUT -i $INTDEV -p udp --sport 53 --dport 53 -m state --state NEW -j ACCEPT #** DHCPD ** # Akceptujemy pakiety NEW na naszym portach 67 i 68(dhcpd) tcp i udp. #$IPTABLES -A INPUT -i $INTDEV -p tcp --dport 67 -m state --state NEW -j ACCEPT #$IPTABLES -A INPUT -i $INTDEV -p udp --dport 67 -m state --state NEW -j ACCEPT #$IPTABLES -A INPUT -i $INTDEV -p tcp --dport 68 -m state --state NEW -j ACCEPT #$IPTABLES -A INPUT -i $INTDEV -p udp --dport 68 -m state --state NEW -j ACCEPT #** HTTP ** # Akceptujemy pakiety NEW na naszym porcie 80(www). #$IPTABLES -A INPUT -p tcp --sport 1024: --dport 80 -m state --state NEW -j ACCEPT #** HTTPs ** # Akceptujemy pakiety NEW na naszym porcie 443(www). #$IPTABLES -A INPUT -p tcp --sport 1024: --dport 443 -m state --state NEW -j ACCEPT #$IPTABLES -A INPUT -p udp --sport 1024: --dport 443 -m state --state NEW -j ACCEPT #** PROXY ** # Akceptujemy pakiety NEW na naszym porcie 8080(proxy). #$IPTABLES -A INPUT -i $INTDEV -p tcp --sport 1024: --dport 8080 -m state --state NEW -j ACCEPT #** RPC ** # Akceptujemy pakiety NEW na naszym porcie 111(Portmap) tcp i udp z sieci lokalnej. #$IPTABLES -A INPUT -i $INTDEV -p tcp --dport 111 -m state --state NEW -j ACCEPT #$IPTABLES -A INPUT -i $INTDEV -p udp --dport 111 -m state --state NEW -j ACCEPT # Akceptujemy pakiety NEW na naszym porcie 2049(NFS) udp z sieci lokalnej. #$IPTABLES -A INPUT -i $INTDEV -p udp --dport 2049 -m state --state NEW -j ACCEPT # Akceptujemy pakiety NEW na naszym niestandartowym porcie 1026(mountd) tcp i udp z sieci lokalnej. #$IPTABLES -A INPUT -i $INTDEV -p udp --dport $(rpcinfo -p localhost | grep "mountd" | grep "udp" | head -n 1 | awk -F' ' {'print $4'} ) -m state --state NEW -j ACCEPT #$IPTABLES -A INPUT -i $INTDEV -p tcp --dport $(rpcinfo -p localhost | grep "mountd" | grep "tcp" | head -n 1 | awk -F' ' {'print $4'} ) -m state --state NEW -j ACCEPT #** SMTP ** # Akceptujemy pakiety NEW na naszym porcie 25(smtp) tcp i udp. #$IPTABLES -A INPUT -p tcp --dport 25 -m state --state NEW -j ACCEPT #** POP-3 ** # Akceptujemy pakiety NEW na naszym porcie 110(pop) tcp i udp z sieci lokalnej. #$IPTABLES -A INPUT -i $INTDEV -p tcp --dport 110 -m state --state NEW -j ACCEPT #** POP-3 over SSL ** # Akceptujemy pakiety NEW na naszym porcie 995(pop over SSL) tcp i udp z sieci lokalnej. #$IPTABLES -A INPUT -i $INTDEV -p tcp --dport 995 -m state --state NEW -j ACCEPT #** SAMBA ** # nie mozesz pozbywac sie smieci netbios wyzej! # Akceptujemy pakiety NEW na naszym porcie 139(smbd) tcp z sieci lokalnej. #$IPTABLES -A INPUT -i $INTDEV -p tcp --dport 139 -m state --state NEW -j ACCEPT # Akceptujemy pakiety NEW na naszym porcie 137 i 138(nmbd) udp z sieci lokalnej. #$IPTABLES -A INPUT -i $INTDEV -p udp --dport 137 -m state --state NEW -j ACCEPT #$IPTABLES -A INPUT -i $INTDEV -p udp --dport 138 -m state --state NEW -j ACCEPT # Tak tez mozna, ale jeszcze nie wspierane przez sambe... #$IPTABLES -A INPUT -i $INTDEV -p tcp --dport 445 -m state --state NEW -j ACCEPT #** SWAT ** # Akceptujemy pakiety NEW na naszym porcie 901(SWAT) tcp i udp z sieci lokalnej. #$IPTABLES -A INPUT -i $INTDEV -p tcp --dport 901 -m state --state NEW -j ACCEPT #$IPTABLES -A INPUT -i $INTDEV -p udp --dport 901 -m state --state NEW -j ACCEPT #** MYSQL ** # Akceptujemy pakiety NEW na naszym porcie 3360 tcp z sieci lokalnej. #$IPTABLES -A INPUT -i $INTDEV -p tcp --sport 1024: --dport 3306 -m state --state NEW -j ACCEPT #** SYSLOGD ** # Akceptujemy pakiety NEW na naszym porcie 514(syslogd) udp z danych adresow. # pozala nam to na odbieranie wiadomosci z serwerow syslogd. #$IPTABLES -A INPUT -s x.x.x.x -p udp --dport 514 -m state --state NEW -j ACCEPT #** INNE ** # Wiesz co na jakim porcie siedzi i skad ma przyjmowac polaczenia... # np. $IPTABLES -A INPUT -p tcp -s z.z.z.z --dport 6666 -m state --state NEW -j ACCEPT # wywala dziure dla uslugi na porcie 6666 tylko dla klienta z.z.z.z # Koniec sekcji konfiguracji demonow. # Odrzuca te pakiety-bez tego ftp by dluzej czekal na polaczenie $IPTABLES -A INPUT -p tcp --sport 1024: --dport 113 -m state --state NEW -j REJECT --reject-with icmp-port-unreachable #---==[ LANCUCH OUTPUT ]==--- #Przypominam: do OUTPUT wpada rowniez FORWARD. Wiec filtrujac OUTPUT filtrujemy rowniez FORWARD # Akceptacja wszystkiego co jest prawidlowe :-) # Gdybys chcial blokady na OUTPUT to to masz zahashowac $IPTABLES -A OUTPUT -m state --state ! INVALID -j ACCEPT #**FILTRY NA RUCH WYCHODZACY # Przepuszczamy podtrzymywanie polaczen przez nas na EXTDEV i INTDEV #$IPTABLES -A OUTPUT -o $INTDEV -m state --state ESTABLISHED,RELATED -j ACCEPT #$IPTABLES -A OUTPUT -o $EXTDEV -m state --state ESTABLISHED,RELATED -j ACCEPT # Tytaj ma byc rozszcegulnienie z jakich portow na jakie porty i z jakich komputerow # wypuszczamy pakiety. Powinienes zdecydowac sie z jakoch uslog moga kozystac twoi userzy... #**DNS #$IPTABLES -A OUTPUT -o $EXTDEV -p tcp -s $EXTIP --sport 1024: --dport 53 -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $EXTDEV -p udp -s $EXTIP --sport 1024: --dport 53 -m state --state NEW -j ACCEPT #jesli mamy w LAN taki serwer -czemu niet? #$IPTABLES -A OUTPUT -o $INTDEV -p tcp -s $INTIP --sport 1024: --dport 53 -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $INTDEV -p udp -s $INTIP --sport 1024: --dport 53 -m state --state NEW -j ACCEPT #**AUTH #$IPTABLES -A OUTPUT -o $EXTDEV -p tcp -s $EXTIP --sport 1024: --dport 113 -m state --state NEW -j ACCEPT #jesli mamy w LAN taki serwer to czemu niet? #$IPTABLES -A OUTPUT -o $INTDEV -p tcp -s $INTIP --sport 1024: --dport 113 -m state --state NEW -j ACCEPT #**SMTP #$IPTABLES -A OUTPUT -o $EXTDEV -p tcp -s $EXTIP --sport 1024: --dport 25 -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $INTDEV -p tcp -s $INTIP --sport 1024: --dport 25 -m state --state NEW -j ACCEPT #**POP #$IPTABLES -A OUTPUT -o $EXTDEV -p tcp -s $EXTIP --sport 1024: --dport 110 -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $INTDEV -p tcp -s $INTIP --sport 1024: --dport 110 -m state --state NEW -j ACCEPT #**IMAP #$IPTABLES -A OUTPUT -o $EXTDEV -p tcp -s $EXTIP --sport 1024: --dport 143 -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $INTDEV -p tcp -s $INTIP --sport 1024: --dport 143 -m state --state NEW -j ACCEPT #**NNTP #$IPTABLES -A OUTPUT -o $EXTDEV -p tcp -s $EXTIP --sport 1024: --dport 119 -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $INTDEV -p tcp -s $INTIP --sport 1024: --dport 119 -m state --state NEW -j ACCEPT #**TELNET #$IPTABLES -A OUTPUT -o $EXTDEV -p tcp -s $EXTIP --sport 1024: --dport 23 -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $INTDEV -p tcp -s $INTIP --sport 1024: --dport 23 -m state --state NEW -j ACCEPT #**SSH #$IPTABLES -A OUTPUT -o $EXTDEV -p tcp -s $EXTIP --sport 1024: --dport 22 -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $INTDEV -p tcp -s $INTIP --sport 1024: --dport 22 -m state --state NEW -j ACCEPT #Tylko okreslony komputer moze sie zajac naszym komputerem :] #$IPTABLES -A OUTPUT -i $EXTDEV -s a.b.c.d -p tcp --sport 1024: --dport 22 -m state --state NEW -j ACCEPT #**FTP #$IPTABLES -A OUTPUT -o $EXTDEV -p tcp -s $EXTIP --sport 1024: --dport 21 -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $INTDEV -p tcp -s $INTIP --sport 1024: --dport 21 -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $EXTDEV -p tcp -s $EXTIP --sport 1024: --dport 20 -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $INTDEV -p tcp -s $INTIP --sport 1024: --dport 20 -m state --state NEW -j ACCEPT #**HTTP #$IPTABLES -A OUTPUT -o $EXTDEV -p tcp -s $EXTIP --sport 1024: --dport 80 -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $INTDEV -p tcp -s $INTIP --sport 1024: --dport 80 -m state --state NEW -j ACCEPT #**HTTPS #$IPTABLES -A OUTPUT -o $EXTDEV -p tcp -s $EXTIP --sport 1024: --dport 443 -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $INTDEV -p tcp -s $INTIP --sport 1024: --dport 443 -m state --state NEW -j ACCEPT #**WHOIS #$IPTABLES -A OUTPUT -o $EXTDEV -p tcp -s $EXTIP --sport 1024: --dport 43 -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $INTDEV -p tcp -s $INTIP --sport 1024: --dport 43 -m state --state NEW -j ACCEPT # pozwalamy na wychodzenie komunikatow ICMP # FIXME -zrobic rozszczegulnienie jakie ICMP moga wyjsc a jakie nie #$IPTABLES -A OUTPUT -o $INTDEV -p icmp -m state --state NEW -j ACCEPT #$IPTABLES -A OUTPUT -o $EXTDEV -p icmp -m state --state NEW -j ACCEPT #---==[ LANCUCH FORWARD ]==--- # BLOKOWANIE USERA # szybkie odciecie komus netu :) # oczywiscie jesli masz proxy to musisz: # $IPTABLES -I INPUT -p tcp -i $INTDEV -s x.x.x.x -d any/0 --dport portproxy -j DROP # $IPTABLES -I INPUT -p udp -i $INTDEV -s x.x.x.x -d any/0 --dport portproxy -j DROP #$IPTABLES -I FORWARD -i $INTDEV -s x.x.x.x -j DROP #blokowanie stron www lub serwerow dla usera lub dla calej sieci lokalnej[mardok] # gdzue S.S.S.S nr ip strony a u.u.u.u ip uzytkownika w sieci #$IPTABLES -I FORWARD -d S.S.S.S -s u.u.u.u -j REJECT # dla calej sieci #$IPTABLES -I FORWARD -d S.S.S.S -j REJECT # Pozwalamy na nawiazywanie i utrzymanie polaczenia z sieci lokalnej $IPTABLES -A FORWARD -i $INTDEV -p tcp -s $INTNET -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A FORWARD -i $INTDEV -p udp -s $INTNET -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # Przepuszczamy pakiety do sieci lokalnej $IPTABLES -A FORWARD -o $INTDEV -p tcp -d $INTNET -m state --state ESTABLISHED,RELATED -j ACCEPT $IPTABLES -A FORWARD -o $INTDEV -p udp -d $INTNET -m state --state ESTABLISHED,RELATED -j ACCEPT # Przepuszczamy caly poprawny ruch ICMP $IPTABLES -A FORWARD -p icmp -m state --state ! INVALID -j ACCEPT #---==[ TOS ]==--- # TOS(type of service) -pozwala nadac rozny piorytet pakietom. # niestety nie wszystkie routery obslugoja ta funkcje wiec # nie spodziewajcie sie cudow, ale nie zaszkodzi sprobowac. # # Czy ktos przeprowadzil jekiekolwiek testy wydajnosci # sla roznych TOS????????????? # # Parametry zgodne z RFC 1060/1349 # # typ dec hex # Minimalize-delay 16 0x10 # Maximalize-throughput 8 0x08 # Maxymalize-Reliability 4 0x04 # Minimalize-cost 2 0x02 # Normal-service 0 0x00 # #UWAGA: POSTROUTING w tabeli 'mangle' dostepny jest od kernela 2.4.18, wiec jezeli macie starsze jadra, # musicie zrobic osobno dla OUTPUT i PREROUTING #$IPTABLES -t mangle -A POSTROUTING -p tcp -o $EXTDEV --dport 20 -j TOS --set-tos 0x04 #ftp #$IPTABLES -t mangle -A POSTROUTING -p tcp -o $EXTDEV --dport 21 -j TOS --set-tos 0x04 #ftp #$IPTABLES -t mangle -A POSTROUTING -p tcp -o $EXTDEV --dport 22 -j TOS --set-tos 0x10 #ssh #$IPTABLES -t mangle -A POSTROUTING -p tcp -o $EXTDEV --dport 23 -j TOS --set-tos 0x10 #telnet #$IPTABLES -t mangle -A POSTROUTING -p tcp -o $EXTDEV --dport 25 -j TOS --set-tos 0x08 #smtp #$IPTABLES -t mangle -A POSTROUTING -p tcp -o $EXTDEV --dport 53 -j TOS --set-tos 0x10 #dns #$IPTABLES -t mangle -A POSTROUTING -p udp -o $EXTDEV --dport 53 -j TOS --set-tos 0x10 #dns #$IPTABLES -t mangle -A POSTROUTING -p tcp -o $EXTDEV --dport 80 -j TOS --set-tos 0x08 #http #---==[ Statystyka1 - DOMYSLNA ]==--- # potrzebujesz w jadro wkompilowac MARK # do lstat (http://lstat.sourceforge.net, http://wesola.3.pl/lstat/doc/main.html) # nalezy wpisac w konkretnych statystykach m{$user} czyli np. m101 m103 itp. # kazda statystyka m{$user} zlicza ruch in i out z danego kompa # Zaleca sie wylaczenie TOS ... wiecej szczegolow na stronie # http://www.netfilter.org/documentation/tutorials/blueflux/iptables-tutorial.html#AEN2411 # dziala dobrze z proxy lub/i transparent proxy ! # petla wlasciwa dla userow # linia1 = ruch wychodzacy z kompa danego usera # linia2 = ruch przychodzace do kompa danego usera (ale tylko z proxy/squid) # linia3 = ruch przychodzacy do kompa danego usera i przechodzaca przez serwer # (czyli normalnie http, ftp, ....) # linia4 = ruch wychodzacy z kompa danego usera # for user in $USERLIST # do # # $IPTABLES -t mangle -A PREROUTING -s $INTNETSHORT$user -j MARK --set-mark $user # $IPTABLES -t mangle -A OUTPUT -d $INTNETSHORT$user -j MARK --set-mark $user # $IPTABLES -t mangle -A FORWARD -d $INTNETSHORT$user -j MARK --set-mark $user # $IPTABLES -t mangle -A FORWARD -s $INTNETSHORT$user -j MARK --set-mark $user # done #---==[ Statystyka2 ]==--- # do lstat (http://lstat.sourceforge.net, http://wesola.3.pl/lstat/doc/main.html) # nalezy wpisac w konkretnych statystykach mx{numer_kolejny} czyli np. mx1, mx2 itp. # (dla kazdego użytkownika dwa kolejne numery np. mx1 i mx2, mx3 i mx4, itp) # kazda statystyka mx{$user} zlicza ruch in i out z danego kompa # dziala dobrze gdy niem ma ani proxy ani transparent proxy ! # Dodanie nowego lancucha mx #$IPTABLES -N mx # Najpierw forward przechodzi przez mx #$IPTABLES -I FORWARD -j mx # petla wlasciwa dla userow #for user in $USERLIST # do # $IPTABLES -A mx -s $INTNETSHORT$user -j RETURN # $IPTABLES -A mx -d $INTNETSHORT$user -j RETURN # done #---==[ TTL ]==--- # TTL - czas zycia pakietu. # # do -j TTL potrzebny jest do dzialania patch-0-matic www.netfilter.org wkapliowany w jadro. # # Gdy pakietom wychodzacym od nas w siec lokalna ustawimy TTL=2 to # naszym klientom bedzie trodniej ustawic masquerade. # Zas gdy otrzymamy pakiet z LAN z TTL=126 to mozemy miec sporo pewnosci ze # ktos dzieli net za naszymi plecami... # # Jesli kcesz dzielic lacze i twoj ISP daje Ci TTL=1 to znaczy ze ma jakis powod... # Ta z koleji ustawia wszystkie wychodzace na LAN ttl=2 :) #$IPTABLES -t mangle -A PREROUTING -i $EXTDEV -j TTL --ttl-set 2 # Ta z koleji zwieksza ttl o jeden. #$IPTABLES -t mangle -A PREROUTING -s $INTNET -j TTL --ttl-inc 1 #---==[ QoS ]==--- # potrzebujesz je wkaplikowac w jadro, # nie uzywam wiec nie wiem jak dziala... - czekam na 2.4.21 # to tez na prosbe usera spisalem w gShield. # jesli potrzebujesz odkomentuj ## mark "mail/news" traffic to "1" #MAIL="25 110 119 143 993 995" #for marked in $MAIL # do # $IPTABLES -A PREROUTING -i $EXTDEV -t mangle -p tcp --dport $marked -j MARK --set-mark 1 # $IPTABLES -A PREROUTING -i $EXTDEV -t mangle -p udp --dport $marked -j MARK --set-mark 1 # done ## mark "interactive" traffic to "2" #LOGIN="22 23 6667" #for interactive in $LOGIN # do # $IPTABLES -A PREROUTING -i $EXTDEV -t mangle -p tcp --dport $interactive -j MARK --set-mark 2 # $IPTABLES -A PREROUTING -i $EXTDEV -t mangle -p udp --dport $interactive -j MARK --set-mark 2 # done ## mark "web" traffic to "3" #WEB="80 443" #for web in $WEB # do # $IPTABLES -A PREROUTING -i $EXTDEV -t mangle -p tcp --dport $web -j MARK --set-mark 3 # $IPTABLES -A PREROUTING -i $EXTDEV -t mangle -p udp --dport $web -j MARK --set-mark 3 # done ## mark "game" traffic to "4" #GAMES="27910:27980 7777 22450 26000 26950 27015 27020 27500 27999 28000:28008 28910" #for games in $GAMES # do # $IPTABLES -A PREROUTING -i $EXTDEV -t mangle -p tcp --dport $games -j MARK --set-mark 4 # $IPTABLES -A PREROUTING -i $EXTDEV -t mangle -p udp --dport $games -j MARK --set-mark 4 # done #--==[ NEO+ ]==-- # Na wypadek gdybys chcial dzielic neo+ 'wewnatrz lokalu' - dodatki specjalnie dla neo+ # Zmieniamy MTU - Maximum Transfer Unit [opis i regolka -VIC] # TYLKO W PRZYPADKU ADSL , pppoe - ppp over ethernet # -standardowo jest to ustawione na 1500 w sieci Ethernet # ale w połączeniach adsl 8 bitów jest doklejane z naglowka ppp # stad MTU na interfejsie 'internetowym' (karcie sieciowej do której przypięty jest modem) # powinno być 1492. #$IPTABLES -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu #--==[ Co robimy z reszta pakietow ]==-- # Reszte pakietow logujemy i usuwamy (lancuc INPUT) #$IPTABLES -A INPUT -j LOG --log-prefix "IPT INPUT: " $IPTABLES -A INPUT -j DROP # Logujemy i kasujemy reszte (lancuch FORWARD) #$IPTABLES -A FORWARD -j LOG --log-prefix "IPT FORWARD: " $IPTABLES -A FORWARD -j DROP # "Reszte" logujemy i wyrzucamy (lancuch OUTPUT) #$IPTABLES -A OUTPUT -j LOG --log-prefix "IPT OUTPUT: " $IPTABLES -A OUTPUT -j DROP $ECHO "zrobione!" ;; stop) # Wylaczamy firewalla. # (komputer moze wysylac oraz odbierac WSZYSTKO!) # (ale nie dziala masqrada...) $ECHO -n "Wylaczamy firewall: " # Czyscimy lancuchy $IPTABLES -F $IPTABLES -t nat -F $IPTABLES -t mangle -F $IPTABLES -X #$IPTABLES -Z # Polityki domyslne $IPTABLES -P INPUT ACCEPT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -P FORWARD ACCEPT # Wylaczanie forwardingu w kernelu. # -to wylaczy internet w LAN $ECHO 0 > /proc/sys/net/ipv4/ip_forward # Usuwamy moduly # Tutaj musisz te moduly co zaladowales - wyladowac :) #$RMMOD ip_tables #$RMMOD ip_conntrack #$RMMOD ip_conntrack_ftp #$RMMOD ip_nat_ftp $ECHO "zrobione!" ;; status) #kwestie informacyjne informuj $ECHO $"Table: filter" $IPTABLES --list -v $ECHO $"Table: nat" $IPTABLES -t nat --list -v $ECHO $"Table: mangle" $IPTABLES -t mangle --list -v ;; restart) $0 stop $0 start ;; *) $ECHO "Uzycie: nshield [start|stop|restart|status]" exit 2 esac exit 0