rendered paste body#!/bin/bash# Linux iptables tűzfal script# Dátum : 2008.02.28# Ghotler-FW-HomeTITLE="Ghotler-Firewall-Home"IPTABLES=/sbin/iptablesSYSCTL=/sbin/sysctlINET_IF=ppp0 #külső interfészLNET_IF=eth0 #belső interfészINET_ADDR="12.12.12.12" #külső IP címFW_ADDR="192.168.0.1" #belső IP címLNET_ADDR="192.168.0.0/24" #védett hálózat IP címeCLASS_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 securityecho "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 -Zecho "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_inetecho "Á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