#! /bin/sh -e # /etc/network/iptables.up.run # Esimerkki iptables-skriptistä pienelle palvelimelle. # Kokoelma erilaisia ja malliksi eri tavoin tehtyjä säätöjä, # ei kovin perusteellisesti testattu - testaa ja # muuta omiin tarpeisiisi. # Erityisesti tarpeettomat säännöt on yleensä parempi poistaa # (kommentoida pois) eikä käyttää tällaisia if-then -virityksiä. # minimalistinen PATH PATH=/sbin:/bin:/usr/bin LAN=eth0 MYNETS="172.21.0.0/16,192.168.125.0/24,192.168.126.0/23,192.168.128.0/24" JYUNETS="130.234.0.0/16,172.16.0.0/12,192.168.0.0/16" APTSERVERS="172.21.208.0/27" # 172.21.208.0-31 # Policyt iptables -t filter -P INPUT DROP iptables -t filter -P OUTPUT DROP iptables -t filter -P FORWARD DROP # Seuraavia ei normaalisti koskaan muuteta, mutta varmuuden vuoksi... iptables -t nat -P INPUT ACCEPT iptables -t nat -P OUTPUT ACCEPT iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t mangle -P INPUT ACCEPT iptables -t mangle -P OUTPUT ACCEPT iptables -t mangle -P FORWARD ACCEPT iptables -t mangle -P PREROUTING ACCEPT iptables -t mangle -P POSTROUTING ACCEPT iptables -t raw -P OUTPUT ACCEPT iptables -t raw -P PREROUTING ACCEPT # Tyhjennetään kaikki taulut iptables -t filter -F iptables -t nat -F iptables -t mangle -F iptables -t raw -F # Poistetaan mahdolliset omat ketjut iptables -t filter -X iptables -t nat -X iptables -t mangle -X iptables -t raw -X # Sallitaan kaikki yhteydet localhostiin iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Lokitusketju iptables -N LogDrop iptables -A LogDrop -m limit --limit-burst 5 --limit 2/min -j LOG --log-prefix "bad-input " --log-tcp-options --log-ip-options iptables -A LogDrop -j DROP # Dropataan bootp/dhcp-paketit lokittamatta iptables -A INPUT -p udp --dport 67 -j DROP # Anti-spoof -ketju iptables -N Antispoof # Sallitaan omat privaattialueet iptables -A Antispoof -s $MYNETS -j RETURN # ja blokataan muut iptables -A Antispoof -s 10.0.0.0/8 -j LogDrop iptables -A Antispoof -s 172.16.0.0/12 -j LogDrop iptables -A Antispoof -s 192.168.0.0/16 -j LogDrop iptables -A Antispoof -s 224.0.0.0/4 -j LogDrop iptables -A Antispoof -s 240.0.0.0/5 -j LogDrop iptables -A Antispoof -i $LAN -s 127.0.0.0/8 -j LogDrop iptables -A Antispoof -s 169.254.0.0/16 -j LogDrop iptables -A Antispoof -s 0.0.0.0/8 -j LogDrop iptables -A Antispoof -s 239.255.255.0/24 -j LogDrop iptables -A INPUT -j Antispoof # Torjutaan sekalaisia hyökkäyksiä # invalid-paketit iptables -A INPUT -m state --state INVALID -j LogDrop # fragmentit iptables -A INPUT -f -j LogDrop # NEW-paketit joissa ei ole SYN-bittiä iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LogDrop # "joulupaketit" (kaikki tcp-liput yhtaikaa päällä) iptables -A INPUT -p tcp --tcp-flags ALL ALL -j LogDrop # rikkinäiset NULL-paketit (ei mitään tcp-lippua päällä) iptables -A INPUT -p tcp --tcp-flags ALL NONE -j LogDrop # paluuliikenne sisään iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT # paluuliikenne ulos iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT # PAM-Kerberos ulos if [ -f /etc/krb5.conf ] ;then iptables -A OUTPUT -p tcp --dport 88 -j ACCEPT fi # ssh sisään valituilta alueilta kohtuumäärin iptables -A INPUT -p tcp -s 130.234.0.0/16 --dport 22 -m limit --limit 2/minute --limit-burst 3 -j ACCEPT # omista verkoista rajoittamattomasti iptables -A INPUT -p tcp -s $MYNETS --dport 22 -j ACCEPT # ssh ulos valituille alueille iptables -A OUTPUT -p tcp -d 172.21.0.0/16 --dport 22 -j ACCEPT # dns-kyselyt ulos iptables -A OUTPUT -p udp --dport 53 -j ACCEPT iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT # ntp ulos ja sisään iptables -A OUTPUT -p tcp --dport 123 -j ACCEPT iptables -A OUTPUT -p udp --dport 123 -j ACCEPT iptables -A INPUT -p tcp --dport 123 -j ACCEPT iptables -A INPUT -p udp --dport 123 -j ACCEPT # apt-asennuspalvelupyynnöt ulos iptables -A OUTPUT -p tcp -d $APTSERVERS --dport 3142 -j ACCEPT # ping (icmp 8) ulos kaikkialle iptables -A OUTPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT # luotetaan että echo-reply hoituu established -säännöllä # icmp 3, 11 ja 12 myös ulos kaikkialle iptables -A OUTPUT -p icmp -m icmp --icmp-type destination-unreachable -j ACCEPT iptables -A OUTPUT -p icmp -m icmp --icmp-type time-exceeded -j ACCEPT iptables -A OUTPUT -p icmp -m icmp --icmp-type parameter-problem -j ACCEPT # ping (icmp 8) sisään valituilta alueilta iptables -A INPUT -p icmp -s $JYUNETS -m icmp --icmp-type echo-request -j ACCEPT # icmp 3, 11 ja 12 kaikkialta iptables -A INPUT -p icmp -m icmp --icmp-type destination-unreachable -j ACCEPT iptables -A INPUT -p icmp -m icmp --icmp-type time-exceeded -j ACCEPT iptables -A INPUT -p icmp -m icmp --icmp-type parameter-problem -j ACCEPT # icmp 13 voi olla joskus tarpeen #iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j ACCEPT # http(s) sisään kaikkialta, jos www-palvelin asennettuna if [ -d /etc/apache2 -o -d /etc/nginx -o -d /etc/lighttpd ] ;then iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT fi # identd ulos jos tarpeen # iptables -A OUTPUT -p tcp --dport 113 -j ACCEPT # identd sisään jos asennettu if dpkg -l | grep -q identd; then iptables -A INPUT -p tcp --dport 113 -j ACCEPT fi # tftp sisään jos tarpeen if dpkg -l | egrep -q 'tftpd|dnsmasq'; then iptables -A INPUT -p udp --dport 69 -j ACCEPT fi # tftp ulos jos tarpeen if [ -x /usr/bin/tftp -o -x /usr/bin/atftp ] ;then iptables -A OUTPUT -p udp --dport 69 -j ACCEPT fi # ftp sisään kaikkialta, jos palvelin asennettuna if [ -f /etc/vsftpd.conf -o -d /etc/twoftpd -o -d /etc/pure-ftpd ] ;then modprobe nf_conntrack_ftp # Yhteyden muodostus: sallitaan yhteydenotto omaan porttiimme 21 maailmalta iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT # sallitaan itsemme vastata iptables -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT # Aktiivinen ftp: sallitaan itsemme ottaa paluuyhteys portin 20 kautta iptables -A OUTPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT # ja sallitaan vastaukset siihen iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT # Passiivinen ftp: sallitaan yhteydenotto maailmalta uuteen omaan porttiimme iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT # ja sallitaan itsemme vastata iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT fi # ftp ulos jos client asennettuna if [ -x /usr/bin/ftp ] ;then modprobe nf_conntrack_ftp # ei haittaa vaikka olisi jo # Yhteyden muodostus: sallitaan yhteydenotto porttiin 21 valikoituihin paikkoihin iptables -A OUTPUT -p tcp -d 130.234.0.0/16 --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT # sallitaan vastaus (ei tarpeen jos vastaukset yleisemminkin sallittu) iptables -A INPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT # Aktiivinen ftp: annetaan palvelimen ottaa yhteys takaisin porttiimme 20 iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT # ja sallitaan itsemme vastata sille iptables -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT # Passiivinen ftp: sallitaan itsemme ottaa yhteys palvelimen ilmoittamaan porttiin iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT # ja sallitaan palvelimen vastata iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT fi # NFS: oletetaan että palvellaan/käytetään vain omaa verkkoaluetta ja # että statd, mountd, lockd ja quotad käyttävät portteja 4000-4005 # NFS-palvelin if [ -f /etc/exports ] ;then iptables -A INPUT -s $MYNETS -p tcp --dport 111 -j ACCEPT iptables -A INPUT -s $MYNETS -p tcp --dport 2049 -j ACCEPT iptables -A INPUT -s $MYNETS -p tcp --dport 4000:4005 -j ACCEPT fi # NFS-asiakas if grep -iq nfs /etc/fstab || [ -f /etc/auto.master ] ;then iptables -A OUTPUT -d $MYNETS -p tcp --dport 111 -j ACCEPT iptables -A OUTPUT -d $MYNETS -p tcp --dport 2049 -j ACCEPT iptables -A OUTPUT -d $MYNETS -p tcp --dport 4000:4005 -j ACCEPT fi # APC UPS daemon, jos asennettuna if [ -d /etc/apcupsd ] ;then iptables -A OUTPUT -d $MYNETS -p tcp --dport 3551 -j ACCEPT fi # Tuntemattomat INPUT-paketit lokitetaan ja torjutaan iptables -A INPUT -m limit --limit-burst 5 --limit 2/min -j LOG --log-prefix "unknown-input " --log-tcp-options --log-ip-options iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable # Tuntemattomat OUTPUT-paketit lokitetaan ja dropataan iptables -A OUTPUT -m limit --limit-burst 5 --limit 2/min -j LOG --log-prefix "unknown-output " --log-tcp-options --log-ip-options iptables -A OUTPUT -j DROP # ei oikeastaan tarpeen koska policy drop # Tuntemattomat FORWARD-paketit lokitetaan ja dropataan iptables -A FORWARD -m limit --limit-burst 5 --limit 2/min -j LOG --log-prefix "unknown-forward " --log-tcp-options --log-ip-options iptables -A FORWARD -j DROP # ei oikeastaan tarpeen koska policy drop exit 0