#!/bin/bash # Linux iptables tűzfal script # Dátum : 2008.02.28 # Ghotler-FW-Home TITLE="Ghotler-Firewall-Home" IPTABLES=/sbin/iptables SYSCTL=/sbin/sysctl INET_IF=ppp0 #külső interfész LNET_IF=eth0 #belső interfész INET_ADDR="12.12.12.12" #külső IP cím FW_ADDR="192.168.0.1" #belső IP cím LNET_ADDR="192.168.0.0/24" #védett hálózat IP címe CLASS_A="10.0.0.0/8" CLASS_B="172.16.0.0/12" CLASS_C="192.168.0.0/16" CLASS_D_MULTICAST="224.0.0.0/4" CLASS_E_RESERVED="240.0.0.0/5" DENIED_IPS="61.31.0.0/16 61.140.0.0/11 61.220.0.0/10 62.165.226.178 62.165.227.56 62.165.227.223 62.165.225.99 62.165.224.86 62.165.215.44 62.165.224.241 62.165.215.19 62.165.227.41 62.165.227.97 64.12.24.161 66.137.176.6 89.132.26.222 86.106.44.179 200.195.0.0/10 210.73.133.22 210.212.0.0/16 218.248.35.62 218.188.23.45 218.248.35.62 218.13.0.0/11 218.160.0.0/12 219.80.0.0/15 219.128.0.0/12 222.156.0.0/15 " # # Szűrési láncok létrehozása # create_chains() { # Beállítjuk az alapértelfwzett policykat: DROP # Eldobunk minden csomagot alapból, előtte válogatunk. $IPTABLES -P INPUT DROP $IPTABLES -P OUTPUT DROP $IPTABLES -P FORWARD DROP # Csoportosított láncok a forgalom iránya alapján # a gépről az internetre fwnő csomagok $IPTABLES -N fw_to_inet # az internetről a gépre jövő csomagok $IPTABLES -N inet_to_fw # a lokális hálózatról az internetre fwnő csomagok (forward) $IPTABLES -N lnet_to_inet # az internetről a lokális hálózatra fwnő csomagok $IPTABLES -N inet_to_lnet # a lokális hálózatról a gépre jövő csomagok $IPTABLES -N lnet_to_fw # a gépről a lokális hálózatra fwnő csomagok $IPTABLES -N fw_to_lnet # szűrési lánc $IPTABLES -N security echo "Szűrési láncok létrehozása ..........[ OK ]" } # # Láncok törlése # delete_chains() { # Táblák tisztítása $IPTABLES -F $IPTABLES -X $IPTABLES -F -t nat $IPTABLES -X -t nat $IPTABLES -F -t mangle $IPTABLES -X -t mangle # Csomagszzmlálók nullázása $IPTABLES -Z echo "Láncok tőrlése ......................[ OK ]" } # # Átirányítások # basic_rules() { # Loopbacken mindent fogadunk $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A OUTPUT -o lo -j ACCEPT # Bejövő csomagok $IPTABLES -A INPUT -i $INET_IF -j inet_to_fw $IPTABLES -A INPUT -i $LNET_IF -s $LNET_ADDR -j lnet_to_fw # Kimenő csomagok $IPTABLES -A OUTPUT -o $INET_IF -j fw_to_inet $IPTABLES -A OUTPUT -o $LNET_IF -d $LNET_ADDR -j fw_to_lnet # Átmenő csomagok - továbbítás $IPTABLES -A FORWARD -i $INET_IF -o $LNET_IF -d $LNET_ADDR -j inet_to_lnet $IPTABLES -A FORWARD -i $LNET_IF -o $INET_IF -s $LNET_ADDR -j lnet_to_inet echo "Átirányítások beállítása ..........[ OK ]" } # # Az internetről a tűzfalra érkező csomagok # inet_to_fw() { # Tiltott IP-k szűrése for i in `echo $DENIED_IPS`; do $IPTABLES -A inet_to_fw -s $i -j DROP done # Hamisított IP-k szűrése (sysctl-k bebiztosítása) $IPTABLES -A inet_to_fw -s $CLASS_A -j LOG --log-prefix "$TITLE : fake IP source " $IPTABLES -A inet_to_fw -s $CLASS_A -j DROP $IPTABLES -A inet_to_fw -s $CLASS_B -j LOG --log-prefix "$TITLE : fake IP source " $IPTABLES -A inet_to_fw -s $CLASS_B -j DROP $IPTABLES -A inet_to_fw -s $CLASS_C -j LOG --log-prefix "$TITLE : fake IP source " $IPTABLES -A inet_to_fw -s $CLASS_C -j DROP $IPTABLES -A inet_to_fw -s $CLASS_D_MULTICAST -j LOG --log-prefix "$TITLE : fake IP source " $IPTABLES -A inet_to_fw -s $CLASS_D_MULTICAST -j DROP $IPTABLES -A inet_to_fw -s $CLASS_E_RESERVED -j LOG --log-prefix "$TITLE : fake IP source " $IPTABLES -A inet_to_fw -s $CLASS_E_RESERVED -j DROP # SYN-Flood $IPTABLES -A inet_to_fw -p tcp --syn -m limit --limit 1/s --limit-burst 4 -j ACCEPT $IPTABLES -A inet_to_fw -p tcp --syn -j LOG --log-prefix "$TITLE : SYN-Flood attack " $IPTABLES -A inet_to_fw -p tcp --syn -j DROP # Nmap FIN/URG/PSH $IPTABLES -A inet_to_fw -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/m -j LOG --log-prefix "$TITLE : Nmap XMAS scan " $IPTABLES -A inet_to_fw -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP # SYN/RST $IPTABLES -A inet_to_fw -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 5/m -j LOG --log-prefix "$TITLE : SYN/RST scan " $IPTABLES -A inet_to_fw -p tcp --tcp-flags SYN,RST SYN,RST -j DROP #SYN/FIN $IPTABLES -A inet_to_fw -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/m -j LOG --log-prefix "$TITLE : SYN/FIN scan " $IPTABLES -A inet_to_fw -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP # Portscan,PoD $IPTABLES -A inet_to_fw -p tcp --tcp-flags ALL ALL -j LOG --log-prefix "$TITLE : XMAS-tree scan " $IPTABLES -A inet_to_fw -p tcp --tcp-flags ALL NONE -m state --state ! ESTABLISHED -j LOG --log-prefix "$TITLE : NULL scan " # PING -re ne válaszoljunk $IPTABLES -A inet_to_fw -m state --state NEW -p icmp -j DROP $IPTABLES -A inet_to_fw -p icmp --icmp-type echo-request -m limit --limit 3/s -j ACCEPT $IPTABLES -A inet_to_fw -p icmp --icmp-type echo-request -j LOG --log-prefix "$TITLE : PoD attack " $IPTABLES -A inet_to_fw -p icmp --icmp-type echo-request -j DROP # Az új kapcsolatok helyesen kezdődjenek ( közvetett DoS ) $IPTABLES -A inet_to_fw -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "$TITLE : hidden portscan " $IPTABLES -A inet_to_fw -p tcp ! --syn -m state --state NEW -j DROP # Jóváhagyott kapcsolatok elfogadása $IPTABLES -A inet_to_fw -m state --state ESTABLISHED,RELATED -j ACCEPT } # # Az internetről a LAN-ra továbbított csomagok # inet_to_lnet() { # Tiltott IP-k szűrése for i in `echo $DENIED_IPS`; do $IPTABLES -A inet_to_fw -s $i -j DROP done # Hamisított IP-k szűrése (sysctl-k bebiztosítása) $IPTABLES -A inet_to_lnet -s $CLASS_A -j LOG --log-prefix "$TITLE : fake IP source " $IPTABLES -A inet_to_lnet -s $CLASS_A -j DROP $IPTABLES -A inet_to_lnet -s $CLASS_B -j LOG --log-prefix "$TITLE : fake IP source " $IPTABLES -A inet_to_lnet -s $CLASS_B -j DROP $IPTABLES -A inet_to_lnet -s $CLASS_C -j LOG --log-prefix "$TITLE : fake IP source " $IPTABLES -A inet_to_lnet -s $CLASS_C -j DROP $IPTABLES -A inet_to_lnet -s $CLASS_D_MULTICAST -j LOG --log-prefix "$TITLE : fake IP source " $IPTABLES -A inet_to_lnet -s $CLASS_D_MULTICAST -j DROP $IPTABLES -A inet_to_lnet -s $CLASS_E_RESERVED -j LOG --log-prefix "$TITLE : fake IP source " $IPTABLES -A inet_to_lnet -s $CLASS_E_RESERVED -j DROP # SYN-Flood $IPTABLES -A inet_to_lnet -p tcp --syn -m limit --limit 1/s --limit-burst 4 -j ACCEPT $IPTABLES -A inet_to_lnet -p tcp --syn -j LOG --log-prefix "$TITLE : SYN-Flood attack " $IPTABLES -A inet_to_lnet -p tcp --syn -j DROP # Nmap FIN/URG/PSH $IPTABLES -A inet_to_lnet -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/m -j LOG --log-prefix "$TITLE : Nmap XMAS scan " $IPTABLES -A inet_to_lnet -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP # SYN/RST $IPTABLES -A inet_to_lnet -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 5/m -j LOG --log-prefix "$TITLE : SYN/RST scan " $IPTABLES -A inet_to_lnet -p tcp --tcp-flags SYN,RST SYN,RST -j DROP #SYN/FIN $IPTABLES -A inet_to_lnet -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/m -j LOG --log-prefix "$TITLE : SYN/FIN scan " $IPTABLES -A inet_to_lnet -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP # Portscan,PoD $IPTABLES -A inet_to_lnet -p tcp --tcp-flags ALL ALL -j LOG --log-prefix "$TITLE : XMAS-tree scan " $IPTABLES -A inet_to_lnet -p tcp --tcp-flags ALL NONE -m state --state ! ESTABLISHED -j LOG --log-prefix "$TITLE : NULL scan " # PING -re ne válaszoljunk $IPTABLES -A inet_to_lnet -m state --state NEW -p icmp -j DROP $IPTABLES -A inet_to_lnet -p icmp --icmp-type echo-request -m limit --limit 3/s -j ACCEPT $IPTABLES -A inet_to_lnet -p icmp --icmp-type echo-request -j LOG --log-prefix "$TITLE : PoD attack " $IPTABLES -A inet_to_lnet -p icmp --icmp-type echo-request -j DROP # Az új kapcsolatok helyesen kezdődjenek ( közvetett DoS ) $IPTABLES -A inet_to_lnet -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "$TITLE : hidden portscan " $IPTABLES -A inet_to_lnet -p tcp ! --syn -m state --state NEW -j DROP # Jóváhagyott kapcsolatok elfogadása $IPTABLES -A inet_to_lnet -m state --state ESTABLISHED,RELATED -j ACCEPT # Szolgáltatások engedélyezése (nyitott portok) # $IPTABLES -A inet_to_lnet -m state --state NEW -p tcp --dport 20 -j ACCEPT # Ftp-data # $IPTABLES -A inet_to_lnet -m state --state NEW -p udp --dport 20 -j ACCEPT # Ftp-data # $IPTABLES -A inet_to_lnet -m state --state NEW -p tcp --dport 21 -j ACCEPT # Ftp # $IPTABLES -A inet_to_lnet -m state --state NEW -p udp --dport 21 -j ACCEPT # Ftp # $IPTABLES -A inet_to_lnet -m state --state NEW -p tcp --dport 23 -j ACCEPT # Telnet # $IPTABLES -A inet_to_lnet -m state --state NEW -p udp --dport 23 -j ACCEPT # Telnet # $IPTABLES -A inet_to_lnet -m state --state NEW -p tcp --dport 25 -j ACCEPT # SMTP # $IPTABLES -A inet_to_lnet -m state --state NEW -p udp --dport 25 -j ACCEPT # SMTP # $IPTABLES -A inet_to_lnet -m state --state NEW -p tcp --dport 53 -j ACCEPT # DNS # $IPTABLES -A inet_to_lnet -m state --state NEW -p udp --dport 53 -j ACCEPT # DNS # $IPTABLES -A inet_to_lnet -m state --state NEW -p tcp --dport 80 -j ACCEPT # HTTP # $IPTABLES -A inet_to_lnet -m state --state NEW -p udp --dport 80 -j ACCEPT # HTTP # $IPTABLES -A inet_to_lnet -m state --state NEW -p tcp --dport 22 -j ACCEPT # ssh # $IPTABLES -A inet_to_lnet -m state --state NEW -p udp --dport 22 -j ACCEPT # ssh # $IPTABLES -A inet_to_lnet -m state --state NEW -p tcp --dport 107 -j ACCEPT # rtelnet # $IPTABLES -A inet_to_lnet -m state --state NEW -p udp --dport 107 -j ACCEPT # rtelnet # $IPTABLES -A inet_to_lnet -m state --state NEW -p tcp --dport 110 -j ACCEPT # POP3 # $IPTABLES -A inet_to_lnet -m state --state NEW -p udp --dport 110 -j ACCEPT # POP3 # $IPTABLES -A inet_to_lnet -m state --state NEW -p tcp --dport 143 -j ACCEPT # IMAP # $IPTABLES -A inet_to_lnet -m state --state NEW -p udő --dport 143 -j ACCEPT # IMAP # $IPTABLES -A inet_to_lnet -m state --state NEW -p tcp --dport 3389 -j ACCEPT # Távsegítség # $IPTABLES -A inet_to_lnet -m state --state NEW -p udp --dport 3389 -j ACCEPT # Távsegítség } # # A LAN-ról a tűzfalra érkező csomagok # lnet_to_fw() { # Itt mindent engedünk $IPTABLES -A lnet_to_fw -j ACCEPT # Másik alternatíva : SSH-t engedünk, pingelni lehet, dhcp ok # $IPTABLES -A lnet_to_fw -m state --state ESTABLISHED,RELATED -j ACCEPT # $IPTABLES -A lnet_to_fw -m state --state NEW -p tcp --dport 22 -j ACCEPT # $IPTABLES -A lnet_to_fw -m state --state NEW -p udp --dport 22 -j ACCEPT # $IPTABLES -A lnet_to_fw -m state --state NEW -p icmp -j ACCEPT # $IPTABLES -A lnet_to_fw -p udp --dport 67 -j ACCEPT # DHCP # $IPTABLES -A lnet_to_fw -j DROP } # # A LAN-ról az internetre küldött csomagok # lnet_to_inet() { # Itt mindent engedünk $IPTABLES -A lnet_to_inet -j ACCEPT } # # A tűzfalról a LAN-ra küldött csomagok # fw_to_lnet() { # Itt mindent engedünk $IPTABLES -A fw_to_lnet -j ACCEPT } # # A tűzfalról az internetre küldött csomagok # fw_to_inet() { # Itt mindent engedünk $IPTABLES -A fw_to_inet -j ACCEPT } # # Internet megosztása a LAN számára # nat() { $IPTABLES -t nat -A POSTROUTING -o $INET_IF -j MASQUERADE } # # Sysctl beállítások a /proc fájlrendszeren # sysctls() { # ICMP redirect fogadásának kikapcsolása for f in /proc/sys/net/ipv4/conf/*; do $SYSCTL -w net.ipv4.conf.`basename $f`.accept_redirects=0 > /dev/null; done #$SYSCTL -w net.ipv4.conf.all.accept_redirects=0 > /dev/null # A forrás-routolási csomagok kikapcsolása for f in /proc/sys/net/ipv4/conf/*; do $SYSCTL -w net.ipv4.conf.`basename $f`.accept_source_route=0 > /dev/null; done #$SYSCTL -w net.ipv4.conf.all.accept_source_route=0 > /dev/null # A lehetetlen IP ről jövő csomagok loggolása for f in /proc/sys/net/ipv4/conf/*; do $SYSCTL -w net.ipv4.conf.`basename $f`.log_martians=1 > /dev/null; done #$SYSCTL -w net.ipv4.conf.all.log_martians=1 > /dev/null # Routolási háromszögelés illetve ip spoofing védelem for f in /proc/sys/net/ipv4/conf/*; do $SYSCTL -w net.ipv4.conf.`basename $f`.rp_filter=1 > /dev/null; done #$SYSCTL -w net.ipv4.conf.all.rp_filter=1 > /dev/null # ICMP redirect engedélyezése az átjáróknak for f in /proc/sys/net/ipv4/conf/*; do $SYSCTL -w net.ipv4.conf.`basename $f`.secure_redirects=1 > /dev/null; done #$SYSCTL -w net.ipv4.conf.all.secure_redirects=1 > /dev/null # ICMP redirect kikapcsolása # Ha a gép router, írjuk át 1-re, és a többi host kap ICMP redirect-t for f in /proc/sys/net/ipv4/conf/*; do $SYSCTL -w net.ipv4.conf.`basename $f`.send_redirects=0 > /dev/null; done #$SYSCTL -w net.ipv4.conf.all.send_redirects=0 > /dev/null # PING-re válaszolunk - majd a láncokon szűrjük/kikapcsolhatjuk $SYSCTL -w net.ipv4.icmp_echo_ignore_all=0 > /dev/null # Ne válaszoljunk a broadcast PING-re $SYSCTL -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null # Ne loggoljuk a hibás router broadcastokat $SYSCTL -w net.ipv4.icmp_ignore_bogus_error_responses=1 > /dev/null # IP routolás engedélyezése NAT-hoz $SYSCTL -w net.ipv4.ip_forward=1 > /dev/null } # # Sysctl visszaállítások # unsysctls() { # Default értékeket visszaállítjuk # --- mégjobb lenne: config fájlban elmenteni a tűzfal előtti beállításokat, és onnan visszamenteni! --- for f in /proc/sys/net/ipv4/conf/*; do $SYSCTL -w net.ipv4.conf.`basename $f`.accept_redirects=1 > /dev/null; done for f in /proc/sys/net/ipv4/conf/*; do $SYSCTL -w net.ipv4.conf.`basename $f`.accept_source_route=0 > /dev/null; done for f in /proc/sys/net/ipv4/conf/*; do $SYSCTL -w net.ipv4.conf.`basename $f`.log_martians=0 > /dev/null; done for f in /proc/sys/net/ipv4/conf/*; do $SYSCTL -w net.ipv4.conf.`basename $f`.rp_filter=0 > /dev/null; done for f in /proc/sys/net/ipv4/conf/*; do $SYSCTL -w net.ipv4.conf.`basename $f`.secure_redirects=1 > /dev/null; done for f in /proc/sys/net/ipv4/conf/*; do $SYSCTL -w net.ipv4.conf.`basename $f`.send_redirects=1 > /dev/null; done $SYSCTL -w net.ipv4.icmp_echo_ignore_all=0 > /dev/null $SYSCTL -w net.ipv4.icmp_echo_ignore_broadcasts=0 > /dev/null $SYSCTL -w net.ipv4.icmp_ignore_bogus_error_responses=0 > /dev/null $SYSCTL -w net.ipv4.ip_forward=0 > /dev/null } # # Az internethozzáférés zárása # lock() { LINE=`$IPTABLES -L inet_to_lnet -n | head -3 | tail -1` if ! ( [ `echo $LINE | awk '{print $1}'` == "DROP" ] && [ `echo $LINE | awk '{print $2}'` == "all" ] && [ `echo $LINE | awk '{print $4}'` == "0.0.0.0/0" ] && [ `echo $LINE | awk '{print $5}'` == "0.0.0.0/0" ]); then $IPTABLES -I inet_to_lnet 1 -j DROP fi LINE=`$IPTABLES -L inet_to_fw -n | head -3 | tail -1` if ! ( [ `echo $LINE | awk '{print $1}'` == "DROP" ] && [ `echo $LINE | awk '{print $2}'` == "all" ] && [ `echo $LINE | awk '{print $4}'` == "0.0.0.0/0" ] && [ `echo $LINE | awk '{print $5}'` == "0.0.0.0/0" ]); then $IPTABLES -I inet_to_fw 1 -j DROP fi } # # Az internethozzáférés engedélyezése # unlock() { LINE=`$IPTABLES -L inet_to_lnet -n | head -3 | tail -1` if [ `echo $LINE | awk '{print $1}'` == "DROP" ] && [ `echo $LINE | awk '{print $2}'` == "all" ] && [ `echo $LINE | awk '{print $4}'` == "0.0.0.0/0" ] && [ `echo $LINE | awk '{print $5}'` == "0.0.0.0/0" ]; then $IPTABLES -D inet_to_lnet 1 fi LINE=`$IPTABLES -L inet_to_fw -n | head -3 | tail -1` if [ `echo $LINE | awk '{print $1}'` == "DROP" ] && [ `echo $LINE | awk '{print $2}'` == "all" ] && [ `echo $LINE | awk '{print $4}'` == "0.0.0.0/0" ] && [ `echo $LINE | awk '{print $5}'` == "0.0.0.0/0" ]; then $IPTABLES -D inet_to_fw 1 fi } case "$1" in start) if [ ! -x $IPTABLES ]; then echo "No iptables found so not starting firewall..." exit 1 fi echo " * Starting Firewall..." sysctls delete_chains create_chains basic_rules inet_to_fw inet_to_lnet lnet_to_fw lnet_to_inet fw_to_lnet fw_to_inet nat ;; stop) echo " * Stopping Firewall..." delete_chains unsysctls ;; restart) $0 stop sleep 1 $0 start ;; lock) echo " * Locking System & LAN from Internet access..." lock ;; unlock) echo " * Unlocking System & LAN for Internet acccess..." unlock ;; list) $IPTABLES -L -n ;; *) echo "Usage : $0 {start|stop|restart|lock|unlock}" exit 1 ;; esac