#!/bin/sh # # mpfw.sh - pravidla pro firewall # # http://www.root.cz/clanek.phtml?id=980 # http://www.root.cz/clanek.phtml?id=990 # # sestavil Miroslav Petříček - mirek@petricek.cz # http://www.petricek.cz # připomínky jsou vítány ! # # Tohle je funkční (doufám) konfigurace firewallu nad iptables. # # Předpokládáme nasazení na routeru se dvěma síťovými kartami eth0 # a eth1. Router zajišťuje konektivitu vnitřní síti pomocí SNATu # # Na routeru kromě toho zároveň běží tyto služby # ftp, http(s), smtp, ssh, pop2, imap, rsync a dns # # Požadavky na HTTP jsou transparentně směrovány na proxy-cache # # Uvnitř sítě je počítač, na kterém běží ssh server a my jej # prostřednictvím našeho portu 2222, umožňujeme oslovit z internetu # # # 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 # # $Platon: $ # Vaše IP adresa a vnější rozhraní #INET_IP="195.80.179.0/24" #INET_IP="213.81.136.181/16" INET_IP="195.168.60.53/16" INET_IFACE="ppp0" # IP a broadcast adresa a rozhraní vnitřní sítě LAN1_IP="192.168.1.0/24" LAN1_BCAST="192.168.1.255/24" LAN1_IFACE="eth0" # Lokální loopback rozhraní LO_IFACE="lo" LO_IP="127.0.0.1/24" # Cesta k programu iptables IPTABLES="/sbin/iptables" # Inicializace databáze modulů /sbin/depmod -a # Některé moduly pro nestandardní cíle /sbin/modprobe ipt_LOG /sbin/modprobe ipt_REJECT /sbin/modprobe ipt_MASQUERADE # Modul pro FTP přenosy /sbin/modprobe ip_conntrack_ftp # Zapneme routování paketů echo "1" > /proc/sys/net/ipv4/ip_forward # rp_filter na zamezení IP spoofování for interface in /proc/sys/net/ipv4/conf/*/rp_filter; do echo "1" > ${interface} done # Implicitní politikou je zahazovat nepovolené pakety $IPTABLES -P INPUT DROP $IPTABLES -P OUTPUT DROP $IPTABLES -P FORWARD DROP # # Řetězec PREROUTING v NAT tabulce # # Odchozí HTTP požadavky budou přesměrovány na lokálního squida # ve funkci transparentní proxy cache #$IPTABLES -t nat -A PREROUTING -p tcp --dport 80 -i ! $INET_IFACE \ # -d ! $INET_IP -j REDIRECT --to-port 3128 # Přesměrujeme port 2222 na port 22 (ssh) stanice uvnitř sítě #$IPTABLES -t nat -A PREROUTING -p tcp --dport 2222 -d $INET_IP \ # -j DNAT --to 192.168.1.2:22 # TOS flagy slouzi k optimalizaci datovych cest. Pro ssh, ftp a telnet # pozadujeme minimalni zpozdeni. $IPTABLES -t mangle -A PREROUTING -p tcp --dport ssh -j TOS --set-tos Minimize-Delay $IPTABLES -t mangle -A PREROUTING -p tcp --dport ftp -j TOS --set-tos Minimize-Delay $IPTABLES -t mangle -A PREROUTING -p tcp --dport telnet -j TOS --set-tos Minimize-Delay # # Řetězec POSTROUTING v NAT tabulce # # IP maškaráda - SNAT #$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to $INET_IP iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE # # Přídavné řetězce pro snazší kontrolu na rezervované adresy # # Zahazovat a logovat (max. 5 x 3 pakety za hod) $IPTABLES -N spoofing $IPTABLES -A spoofing -m limit --limit 5/h --limit-burst 3 \ -j LOG --log-prefix "Rezervovana adresa: " $IPTABLES -A spoofing -j DROP # V tomto řetězci se kontroluje, zda příchozí pakety nemají nesmyslnou IP adresu $IPTABLES -N IN_FW $IPTABLES -A IN_FW -s 192.168.0.0/16 -j spoofing # rezervováno podle RFC1918 $IPTABLES -A IN_FW -s 10.0.0.8/8 -j spoofing # ---- dtto ---- $IPTABLES -A IN_FW -s 172.16.0.0/12 -j spoofing # ---- dtto ---- $IPTABLES -A IN_FW -s 96.0.0.0/4 -j spoofing # rezervováno podle IANA # ... dalsi rezervovane adresy mozno doplnit podle # http://www.iana.com/assignments/ipv4-address-space # Řetězec pro stanovení limitu příchozích SYN konexí (ochrana před SYN floods) # propustí 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 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 # # Řetězec FORWARD # # Paket je označen jako NEW, ale nemá nastavený příznak SYN, pryč s ním $IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "NEW nema SYN: " $IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP # Nechceme rezervované adresy na internetovém rozhraní $IPTABLES -A FORWARD -i $INET_IFACE -j IN_FW # Umožnit přesměrování portu na stanici dovnitř sítě #$IPTABLES -A FORWARD -i eth0 -o eth1 -p tcp -d 192.168.1.2 --dport ssh \ # -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # Routing zevnitř sítě ven neomezujeme $IPTABLES -A FORWARD -i $LAN1_IFACE -j ACCEPT # Routing zvenku dovnitř pouze pro navázaná spojení (stavový firewall) $IPTABLES -A FORWARD -i $INET_IFACE -o $LAN1_IFACE \ -m state --state ESTABLISHED,RELATED -j ACCEPT # Ostatní pakety budou zahozeny, tak je budeme logovat (6 x 5 pak/hod) $IPTABLES -A FORWARD -m limit --limit 6/h -j LOG --log-prefix "forward drop: " # # Řetězec INPUT # # Paket je označený jako NEW, ale nemá nastavený SYN flag - pryč s ním $IPTABLES -A INPUT -i $INET_IFACE -p tcp ! --syn -m state --state NEW -j DROP # Nejprve se zbavíme nežádoucích 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 # Pravidla pro povolené služby #$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 #$IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 53 -j ACCEPT #DNS server nad TCP #$IPTABLES -A INPUT -i $INET_IFACE -p UDP --sport 53 -j ACCEPT #DNS klient #$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 UDP --sport 123 -j ACCEPT #NTP klient #$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 $IPTABLES -A INPUT -i $INET_IFACE -p UDP --dport 517 -j ACCEPT # talk $IPTABLES -A INPUT -i $INET_IFACE -p UDP --dport 518 -j ACCEPT # ntalk # Službu AUTH není dobré filtrovat pomocí DROP, protože to může # vést k prodlevám při navazování některých spojení. Proto jej # sice zamítneme, ale vygenerujeme korektní ICMP chybovou zprávu $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 113 -j REJECT --reject-with tcp-reset #AUTH server # To get Nepto.SK ident timeout hang up #$IPTABLES -A INPUT -i $LAN1_IFACE -p TCP --dport 113 -j REJECT #$IPTABLES -A INPUT -i $LO_IFACE -p TCP --dport 113 -j REJECT # Propouštíme pouze vybrané ICMP zprávy $IPTABLES -A INPUT -i $INET_IFACE -p ICMP --icmp-type echo-reply -j ACCEPT $IPTABLES -A INPUT -i $INET_IFACE -p ICMP --icmp-type destination-unreachable -j ACCEPT $IPTABLES -A INPUT -i $INET_IFACE -p ICMP --icmp-type echo-request -j ACCEPT $IPTABLES -A INPUT -i $INET_IFACE -p ICMP --icmp-type time-exceeded -j ACCEPT # Loopback není radno omezovat $IPTABLES -A INPUT -i $LO_IFACE -j ACCEPT # Stejně jako pakety z lokální sítě, jsou-li určeny pro nás $IPTABLES -A INPUT -i $LAN1_IFACE -d $LAN1_IP -j ACCEPT $IPTABLES -A INPUT -i $LAN1_IFACE -d $INET_IP -j ACCEPT # Broadcasty na lokálním rozhraní jsou také naše $IPTABLES -A INPUT -i $LAN1_IFACE -d $LAN1_BCAST -j ACCEPT # Pakety od navázaných spojení jsou v pořádku $IPTABLES -A INPUT -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT # Všechno ostatní je zakázáno - tedy logujeme, maximálně 5 paketů, # 6x za hodinu $IPTABLES -A INPUT -m limit --limit 6/h -j LOG --log-prefix "input drop: " # # Řětězec 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 # Povolíme odchozí pakety, které mají naše 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 # Ostatní pakety logujeme (neměly by být žádné takové) $IPTABLES -A OUTPUT -j LOG --log-prefix "output drop: "