#!/bin/sh # # mpfw.sh - pravidla pro firewall # # http://www.root.cz/clanek.phtml?id=980 # http://www.root.cz/clanek.phtml?id=990 # http://www.root.cz/clanek.phtml?id=995 # # sestavil Miroslav Petricek - mirek@petricek.cz # http://www.petricek.cz # pripominky jsou vitany ! # # Poznamky: # # Tohle je funkcni (doufam) konfigurace firewallu nad iptables. # # Predpokladame nasazeni na routeru se dvema sitovymi kartami eth0 # a eth1. Router zajistuje konektivitu vnitrni siti pomoci SNATu # # Na routeru krome toho zaroven bezi tyto sluzby # ftp, http(s), smtp, ssh, pop3, imap, rsync a dns # # Pozadavky na HTTP jsou transparentne smerovany na proxy-cache # # Uvnitr site je pocitac, na kterem bezi ssh server a my jej # prostrednictvim naseho portu 2222, umoznujeme oslovit z internetu # # Onrej Jombik napsal skript, ktery vyresetuje vsechna # pravidla nastavena timto firewallem do zakladniho stavu. Muze se hodit # pri ladeni. Najdete jej tady - http://www.petricek.cz/mpfw/fwoff # # 18.12.2001 - prvni verze # 19.12.2001 - ochrana pred SYN floodingem, rp_filter, # casove podminene logovani. # 23.12.2001 - ICMP tcp-reset je pro AUTH lepsi nez prosty REJECT # 28.12.2001 - Vaclav Bartik: presnejsi prefixy u logovanych paketu # 02.01.2002 - nastavovani TOS flagu u odchozich paketu # 04.01.2002 - oprava TOS, opravy syntaxe # 10.01.2002 - pridan odkaz na skript fwoff # 08.03.2002 - odstranena diakritika :-), drobne upravy syntaxe # 29.03.2002 - pravidla pro --sport 53 a 112 nejsou potreba # povoleni DHCP broadcastu, odstraneni duplicitnich TOS mangles # nelogujeme NEW pakety bez SYNu, logujeme AUTH REJECTy, logujeme # casteji # 19.4.2002 - chyba v OUTPUT pravidle pro DHCP (thnx Milan Mlynarcik) # 22.4.2002 - v INPUT ICMP staci jenom echo-request (thnx Jaroslav Stefka) # 23.4.2002 - MS klienti nepracuji z broadcastem ale s 0/0 (thnx Milan Mlynarcik) # 09.12.2002 - pravidlo proti zahlceni icmp zpravami (Michael Kojdl) # 15.5.2003 - tcp-reset negeneruje ICMP (Jaroslav Stefka) # zavadime modul pro ip_nat_ftp, prejmenovani spoofing -> logdrop # Vase IP adresa a vnejsi rozhrani INET_IP="1.2.3.4" INET_IFACE="eth0" # IP a broadcast adresa a rozhrani vnitrni site LAN1_IP="192.168.0.1/32" LAN1_BCAST="192.168.0.255/32" LAN1_IFACE="eth1" # Lokalni loopback rozhrani LO_IFACE="lo" LO_IP="127.0.0.1/32" # Cesta k programu iptables IPTABLES="/sbin/iptables" # Inicializace databaze modulu /sbin/depmod -a # Zavedeme moduly pro nestandardni cile /sbin/modprobe ipt_LOG /sbin/modprobe ipt_REJECT /sbin/modprobe ipt_MASQUERADE # Modul pro FTP prenosy /sbin/modprobe ip_conntrack_ftp /sbin/modprobe ip_nat_ftp # Zapneme routovani paketu echo "1" > /proc/sys/net/ipv4/ip_forward # rp_filter na zamezeni IP spoofovani for interface in /proc/sys/net/ipv4/conf/*/rp_filter; do echo "1" > ${interface} done # Implicitni politikou je zahazovat nepovolene pakety $IPTABLES -P INPUT DROP $IPTABLES -P OUTPUT DROP $IPTABLES -P FORWARD DROP # # Retezec PREROUTING v NAT tabulce # # Odchozi HTTP pozadavky (na port 80 s vyjimkou lokalniho serveru) # budou presmerovany na lokalniho squida (na portu 3128) ve funkci #transparentni proxy cache. $IPTABLES -t nat -A PREROUTING -p tcp -i ! $INET_IFACE -d ! $INET_IP --dport 80 -j REDIRECT --to-port 3128 # Presmerujeme port 2222 na port 22 (ssh) stanice uvnitr site $IPTABLES -t nat -A PREROUTING -p tcp -d $INET_IP --dport 2222 -j DNAT --to 192.168.1.2:22 # # Retezec POSTROUTING v NAT tabulce # # IP maskarada - SNAT # NATujeme $IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to $INET_IP # # Pridavne retezce pro snazsi kontrolu na rezervovane adresy # # Zahazovat a logovat (max. 5 x 3 pakety za hod) $IPTABLES -N logdrop $IPTABLES -A logdrop -m limit --limit 5/h --limit-burst 3 -j LOG --log-prefix "Rezervovana adresa: " $IPTABLES -A logdrop -j DROP # V tomto retezci se kontroluje, zda prichozi pakety nemaji nesmyslnou IP adresu $IPTABLES -N IN_FW $IPTABLES -A IN_FW -s 192.168.0.0/16 -j logdrop # rezervovano podle RFC1918 $IPTABLES -A IN_FW -s 10.0.0.0/8 -j logdrop # ---- dtto ---- $IPTABLES -A IN_FW -s 172.16.0.0/12 -j logdrop # ---- dtto ---- $IPTABLES -A IN_FW -s 96.0.0.0/4 -j logdrop # rezervovano podle IANA # ... dalsi rezervovane adresy mozno doplnit podle # http://www.iana.com/assignments/ipv4-address-space # Retezec pro stanoveni limitu prichozich SYN konexi (ochrana pred SYN floods) # propusti pouze 4 SYN segmenty/sec $IPTABLES -N syn-flood $IPTABLES -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN $IPTABLES -A syn-flood -j DROP # TOS flagy slouzi k optimalizaci datovych cest. Pro ssh, ftp a telnet # pozadujeme minimalni zpozdeni. Pro ftp-data zase maximalni propostnost $IPTABLES -t mangle -A PREROUTING -p tcp --sport ssh -j TOS --set-tos Minimize-Delay $IPTABLES -t mangle -A PREROUTING -p tcp --dport ssh -j TOS --set-tos Minimize-Delay $IPTABLES -t mangle -A PREROUTING -p tcp --sport ftp -j TOS --set-tos Minimize-Delay $IPTABLES -t mangle -A PREROUTING -p tcp --dport telnet -j TOS --set-tos Minimize-Delay $IPTABLES -t mangle -A PREROUTING -p tcp --sport ftp-data -j TOS --set-tos Maximize-Throughput # # Retezec FORWARD # # Navazovani spojeni ala Microsoft - # Paket navazuje spojeni, ale nema nastaveny priznak SYN, pryc s nim $IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP # Nechceme rezervovane adresy na internetovem rozhrani $IPTABLES -A FORWARD -i $INET_IFACE -j IN_FW # Umoznit presmerovani portu na stanici dovnitr site $IPTABLES -A FORWARD -i $INET_IFACE -o $LAN1_IFACE -p tcp -d 192.168.1.2 --dport ssh -j ACCEPT # Routing zevnitr site ven neomezujeme $IPTABLES -A FORWARD -i $LAN1_IFACE -j ACCEPT # Routing zvenku dovnitr pouze pro navazana spojeni (stavovy firewall) $IPTABLES -A FORWARD -i $INET_IFACE -o $LAN1_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT # Ostatni pakety budou zahozeny, tak je budeme logovat (12 x 5 pkt/hod) $IPTABLES -A FORWARD -m limit --limit 12/h -j LOG --log-prefix "forward drop: " # # Retezec INPUT # # Navazovani spojeni ala Microsoft - # Paket navazuje spojeni, ale nema nastaveny priznak SYN, pryc s nim $IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP # Nejprve se zbavime nezadoucich adres $IPTABLES -A INPUT -i $INET_IFACE -j IN_FW # Odfiltrovat pokusy o syn-flooding $IPTABLES -A INPUT -i $INET_IFACE -p tcp --syn -j syn-flood # Odfiltrovat pokusy o zahlceni icmp $IPTABLES -A INPUT -i $INET_IFACE -p icmp -j syn-flood # Pravidla pro povolene sluzby $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 21 -j ACCEPT #FTP server $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 22 -j ACCEPT #SSH server $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 25 -j ACCEPT #SMTP server $IPTABLES -A INPUT -i $INET_IFACE -p UDP --dport 53 -j ACCEPT #DNS server UDP $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 53 -j ACCEPT #DNS server TCP $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 80 -j ACCEPT #WWW server $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 110 -j ACCEPT #POP3 server $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 143 -j ACCEPT #IMAP server $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 443 -j ACCEPT #HTTPS server $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 873 -j ACCEPT #rsync server # Sluzbu AUTH neni dobre filtrovat pomoci DROP, protoze to muze # vest k prodlevam pri navazovani nekterych spojeni. Proto jej # sice zamitneme, ale tak, aby nedoslo k nezadoucim prodlevam. $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 113 -m limit --limit 12/h -j LOG $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 113 -j REJECT --reject-with tcp-reset #AUTH server # Propoustime pouze ICMP ping $IPTABLES -A INPUT -i $INET_IFACE -p ICMP --icmp-type echo-request -j ACCEPT # Loopback neni radno omezovat $IPTABLES -A INPUT -i $LO_IFACE -j ACCEPT # Stejne jako pakety z lokalni site, jsou-li urceny pro nas $IPTABLES -A INPUT -i $LAN1_IFACE -d $LAN1_IP -j ACCEPT $IPTABLES -A INPUT -i $LAN1_IFACE -d $INET_IP -j ACCEPT # Broadcasty na lokalnim rozhrani jsou take nase $IPTABLES -A INPUT -i $LAN1_IFACE -d $LAN1_BCAST -j ACCEPT # MS klienti maji chybu v implementaci DHCP $IPTABLES -A INPUT -i $LAN1_IFACE -p udp --dport 67 -j ACCEPT # Pakety od navazanych spojeni jsou v poradku $IPTABLES -A INPUT -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT # Vsechno ostatni je zakazano - tedy logujeme, maxim. 12x5 pkt/hod $IPTABLES -A INPUT -m limit --limit 12/h -j LOG --log-prefix "INPUT drop: " # # Retezec OUTPUT # # TOS flagy slouzi k optimalizaci datovych cest. Pro ssh, ftp a telnet # pozadujeme minimalni zpozdeni. Pro ftp-data zase maximalni propostnost $IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p tcp --sport ssh -j TOS --set-tos Minimize-Delay $IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p tcp --dport ssh -j TOS --set-tos Minimize-Delay $IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p tcp --sport ftp -j TOS --set-tos Minimize-Delay $IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p tcp --dport ftp -j TOS --set-tos Minimize-Delay $IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p tcp --dport telnet -j TOS --set-tos Minimize-Delay $IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p tcp --sport ftp-data -j TOS --set-tos Maximize-Throughput # Povolime odchozi pakety, ktere maji nase IP adresy $IPTABLES -A OUTPUT -s $LO_IP -j ACCEPT $IPTABLES -A OUTPUT -s $LAN1_IP -j ACCEPT $IPTABLES -A OUTPUT -s $INET_IP -j ACCEPT # Povolime DHCP broadcasty na LAN rozhrani $IPTABLES -A OUTPUT -o $LAN1_IFACE -p UDP --dport 68 --sport 67 -j ACCEPT # Ostatni pakety logujeme (nemely by byt zadne takove) $IPTABLES -A OUTPUT -j LOG --log-prefix "OUTPUT drop: "