plik zapisac jako rc.firewall, nadac prawa , skopiowac do /etc/rc.d..i kula
Kod: Zaznacz cały
#!/bin/sh
#v0.0.1beta - start 23.10.2003
#author Jezior :P
# FUCK THE COPYRIGHT, GET FROM THIS SCRIPT WHATEVER YOU WANT :P
##########################################################################
#ustawienia lokalne #
##########################################################################
#sciezka do sysctl ( raczej zgodna dla wszystkich linuxow )
SYSCTL="/sbin/sysctl -w"
#sciezka do iptables domyslnie ustawione dla slacka
IPT="/usr/sbin/iptables"
IPTS="/usr/sbin/iptables-save"
IPTR="/usr/sbin/iptables-restore"
# interface do internetu ( np. dla neo to bedzie ppp0)
INET_IFACE="ppp0"
#siec lokalna. popraw jesli trzeba
#LOCAL_IFACE="eth1"
#LOCAL_IP="192.168.1.254"
#LOCAL_NET="192.168.1.0/24"
#LOCAL_BCAST="192.168.1.255"
# interfejsy lokalne
LO_IFACE="lo"
LO_IP="127.0.0.1"
# w przypadku neo chyba <lol> trzeba jeszcze dodac "karte wirtualna" i odhaszowac potrzebne linie :)
#jest tego 3 lub 4 regulki, latwo znalezc :)
LO_IFACEV="eth0"
LO_IPW="192.168.60.30"
#koniec ustawien lokalnych
##########################################################################
# Ponizej mozna grzebac na wlasna odpowiedzialnosc :P
#argumenty uruchomieniowe skryptu
if [ "$1" = "usage" ] || [ "$1" = "help" ];
then
echo ""
echo " uzycie skryptu: {start | stop | save | restore | zapis}"
echo ""
echo " save - zapis firewall'a do /etc/rc.d/iptables ... "
echo ""
echo " restore - przywracanie firewall'a z /etc/rc.d/iptables ... "
echo ""
echo " zapis - zapisywanie regulek do pliku /etc/rc.d/iptable.save ... "
echo ""
echo " stop - zatrzymywanie firewall'a."
echo ""
exit 0
elif [ "$1" = "save" ]
then
echo -n "zapis firewall'a do /etc/rc.d/iptables ... "
$IPTS > /etc/rc.d/iptables
echo "zrobione"
exit 0
elif [ "$1" = "restore" ]
then
echo -n "przywracanie firewall'a z /etc/rc.d/iptables ... "
$IPTR < /etc/rc.d/iptables
echo "zrobione"
exit 0
elif [ "$1" = "zapis" ]
then
echo -n "zapisywanie regulek do pliku /etc/rc.d/iptable.save ... "
$IPTS > /etc/rc.d/iptable.save
echo "zrobione"
exit 0
fi
#stopowanie firewall'a
if [ "$1" == "stop" ]
then
echo "zatrzymywanie firewall'a"
iptables -t filter -F > /dev/null 2>&1
iptables -t filter -X > /dev/null 2>&1
iptables -t nat -F > /dev/null 2>&1
iptables -t nat -X > /dev/null 2>&1
# iptables -t mangle -F > /dev/null 2>&1
# iptables -t mangle -X > /dev/null 2>&1
iptables -t filter -P INPUT ACCEPT > /dev/null 2>&1
iptables -t filter -P OUTPUT ACCEPT > /dev/null 2>&1
iptables -t filter -P FORWARD ACCEPT > /dev/null 2>&1
iptables -t nat -P PREROUTING ACCEPT > /dev/null 2>&1
iptables -t nat -P POSTROUTING ACCEPT > /dev/null 2>&1
iptables -t nat -P OUTPUT ACCEPT > /dev/null 2>&1
# iptables -t mangle -P POSTROUTING ACCEPT > /dev/null 2>&1
# iptables -t mangle -P OUTPUT ACCEPT > /dev/null 2>&1
# iptables -t mangle -P PREROUTING ACCEPT > /dev/null 2>&1
# iptables -t mangle -P INPUT ACCEPT > /dev/null 2>&1
# iptables -t mangle -P FORWARD ACCEPT > /dev/null 2>&1
if !(( `which modprobe 2>&1 | grep -c "which: no modprobe in"` )) && [ -a "/proc/modules" ]; then
for MODULE in ipt_TTL iptable_mangle ipt_mark ipt_MARK ipt_MASQUERADE ip_nat_irc ip_nat_ftp ipt_LOG ipt_limit ipt_REJECT ip_conntrack_irc ip_conntrack_ftp ipt_state iptable_nat iptable_filter ip_tables; do
if (( `lsmod | grep -c "$MODULE"` )); then
rmmod $MODULE > /dev/null 2>&1
fi
done
fi
echo -n " -> Firewall wylaczony."
#exit
#czyszczenie tablic polaczen
echo " [ czyszczenie starych polaczen... ]"
COUNT=`iptables -nL INPUT | grep -c "tcp-reset"`
TAB=$COUNT
while [ "$((COUNT--))" -gt "0" ]; do
iptables -D INPUT 1
done
COUNT=`iptables -nL FORWARD | grep -c "tcp-reset"`
while [ "$((COUNT--))" -gt "0" ]; do
iptables -D FORWARD 1
done
echo "-> stare polaczenia wyczyszczone... ( $TAB )...."
exit 0
fi
##########################################################################
#
#Ladujemy moduly
#
echo "ladowanie modulow iptables ..."
# modul podstawowy
/sbin/modprobe ip_tables
# zastanawiam sie czy nie wywalic tego modulu...
#/sbin/modprobe ip_conntrack
# modul filrtujacy
# /sbin/modprobe iptable_filter
# modul nat-u
# /sbin/modprobe iptable_nat
# modul logujacy ztargetowane pakiety
# /sbin/modprobe ipt_LOG
# do limitowania liczby pakietow na sec/min/hr
# /sbin/modprobe ipt_limit
# modul maskarady
# /sbin/modprobe ipt_MASQUERADE
# filtrowanie uzywajace "wlasciciela" jako czesci regulki filtrowania
# /sbin/modprobe ipt_owner
# odmowa i zwrot ICMP, odpowiedz konfigurowalna. defaultowo - odmowa polaczenia
# /sbin/modprobe ipt_REJECT
# tego modulu nier moge jeszcze rozgryzc...
# /sbin/modprobe ipt_tcpmss
# pozwalamy na wybieranie wielu portow jednoczesnie zamiast pojedynczych
# /sbin/modprobe multiport
# sprawdzanie na obecnosc flag w pakietach
# /sbin/modprobe ipt_state
# do wylapywania pakietow z blednymi flagami
# /sbin/modprobe ipt_unclean
# modul wymagany w przypadku non-passive FTP
/sbin/modprobe ip_nat_ftp
# modul sledzenia polaczen ftp ( wywalic?)
#/sbin/modprobe ip_conntrack_ftp
# modul do sledzenia polaczen IRC
#/sbin/modprobe ip_conntrack_irc
##########################################################################
# konfiguracja parametrow kernela ( duza czesc zerznieta od innych :P:P:P )
#wlaczenie forwardowania w kernelu
if [ "$SYSCTL" = "" ]
then
echo "1" > /proc/sys/net/ipv4/ip_forward
else
$SYSCTL net.ipv4.ip_forward="1"
fi
# wlaczenie wspomagania w przypadku dynamicznego IP ( neo, modem, dhcp.... )
if [ "$SYSCTL" = "" ]
then
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
else
$SYSCTL net.ipv4.ip_dynaddr="1"
fi
# wlaczenie ochrony przed SYN FLOOD
if [ "$SYSCTL" = "" ]
then
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
else
$SYSCTL net.ipv4.tcp_syncookies="1"
fi
# walidacja zrodla pakietow
if [ "$SYSCTL" = "" ]
then
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
else
$SYSCTL net.ipv4.conf.all.rp_filter="1"
fi
# ten parametr instruuje kernel o ignorowaniu zadan ICMP
# powinno pomagac w odpieraniu atakow DoS
if [ "$SYSCTL" = "" ]
then
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
else
$SYSCTL net.ipv4.icmp_echo_ignore_broadcasts="1"
fi
#przyjmowanie lub odrzucanie zrodla rutowanych pakietow
#zazwyczaj jest wlaczone, ta opcja je wylacza ze wzgledu
#na mozliwosc naruszenia bezpieczenstwa
if [ "$SYSCTL" = "" ]
then
echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
else
$SYSCTL net.ipv4.conf.all.accept_source_route="0"
fi
# ta opcja pozwala na przekierowania ICMP tylko z listy naszych gatewayow
if [ "$SYSCTL" = "" ]
then
echo "1" > /proc/sys/net/ipv4/conf/all/secure_redirects
else
$SYSCTL net.ipv4.conf.all.secure_redirects="1"
fi
# ta opcja loguje pakiety z "niemozliwych" adresow
if [ "$SYSCTL" = "" ]
then
echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
else
$SYSCTL net.ipv4.conf.all.log_martians="1"
fi
##########################################################################
# przeladowanie aktualnych tabel
echo "przeladowuje tabele ..."
# resetowanie standartowych regulek
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
#$IPT -t nat -P PREROUTING ACCEPT
#$IPT -t nat -P POSTROUTING ACCEPT
#$IPT -t nat -P OUTPUT ACCEPT
#$IPT -t mangle -P PREROUTING ACCEPT
#$IPT -t mangle -P OUTPUT ACCEPT
# przeladowanie wszystkich tabel
$IPT -F
#$IPT -t nat -F
#$IPT -t mangle -F
# wymazanie wszystkich lancuchow
$IPT -X
#$IPT -t nat -X
#$IPT -t mangle -X
##########################################################################
# konfiguracja zasad
# tabela filtrowania
# zabraniamy wszystkiego
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
# lecimy regulki
echo "laduje lancuchy ..."
# lancuch do filtrowania "zlych" pakietow
$IPT -N bad_packets
# jeszcze jeden...
$IPT -N bad_tcp_packets
# tworzymy osobne lancuchy dla icmp, tcp (incoming & outgoing),
# i dla przychodzacych udp.
$IPT -N icmp_packets
# uzywany dla przychodzacych z internetu pakietow UDP
$IPT -N udp_inbound
# uzywane dla wychodzacych uslug UDP z localnetu
# Defaultowo pozwalamy
$IPT -N udp_outbound
# uzywane do pozwalania przychodzacym uslugom jesli potrzebne
# Defaultowo blad oprocz polaczen ustanowionych
$IPT -N tcp_inbound
# uzywane do blokowania wychodzacych uslug z localnetu
# Defaultowo pozwalamy
$IPT -N tcp_outbound
###############################################################################
#
# lancuchy
#
# lancuchy bad_packets
#
# Dropujemy zle pakiety natychmiast po uprzednim zalogowaniu :P
$IPT -A bad_packets -p ALL -m state --state INVALID -j LOG --log-prefix "fp=bad_packets:1 a=DROP "
$IPT -A bad_packets -p ALL -m state --state INVALID -j DROP
# nastepnie sprawdzamy czy wszystko inne jest oki :)
$IPT -A bad_packets -p tcp -j bad_tcp_packets
# jesli tak, to wracamy
$IPT -A bad_packets -p ALL -j RETURN
# lancuchy bad_tcp_packets
# powrot do "wzywajacego" lancucha jesli pakiet przychodzi z localnetu.
# opcja w sumie dla duzych sieci lokalnych
#$IPT -A bad_tcp_packets -p tcp -i $LOCAL_IFACE -j RETURN
#localnet - raczej zostawic jak jest, nie chcialo mi sie komentowac bo cholera duzo tego :P
# $IPT -A bad_tcp_packets -p tcp -i $LOCAL_IFACE ! --syn -m state --state NEW -j DROP
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "fp=bad_tcp_packets:1 a=DROP "
$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
# wszystko oki wiec powrot
$IPT -A bad_tcp_packets -p tcp -j RETURN
# lancuch icmp_packets
# pakiety ICMP powinny zawsze miescic sie w warstwie 2 ramki
# i nigdy nie powinny byc zfragmentowane
# zfragmentowane pakiety ICMP sa typowa oznaka ataku DoS
$IPT -A icmp_packets --fragment -p ICMP -j LOG --log-prefix "fp=icmp_packets:1 a=DROP "
$IPT -A icmp_packets --fragment -p ICMP -j DROP
# te lancuchy sa dla przychodzacych pakietow type 8 ICMP
# (Echo Request) i jest defaultowo odrzucany.
# odhaszuj rowniez linijke LOG jesli chcesz aby pingowania byly logowane
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j LOG --log-prefix "fp=icmp_packets:2 a=ACCEPT "
# Echo - odhaszuj jesli chcesz aby mozna bylo pingnac router.
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
# akceptujemy z przychodzacych pakiety ICMP typu Time Exceeded
$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
# brak regul pozwalajacych, wiec powrot
$IPT -A icmp_packets -p ICMP -j RETURN
##########################################################################
# TCP & UDP
# lancuchy udp_inbound
# mowimy goodbye to microshit netbios
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 137 -j DROP
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 138 -j DROP
# jesli korzystasz z DHCP to odhaszuj
#$IPT -A udp_inbound -p UDP -s 0/0 --source-port 67 --destination-port 68 -j ACCEPT
# przychodzace UDP bez zadania odbijamy...
$IPT -A udp_inbound -p UDP -j RETURN
# lancuchy udp_outbound
# blokowanie wychodzacego ICQ
#$IPT -A udp_outbound -p UDP -s 0/0 --destination-port 4000 -j REJECT
# jesli nie ma regulek zabraniajacych to akceptujemy
$IPT -A udp_outbound -p UDP -s 0/0 -j ACCEPT
##########################################################################
# lancuchy tcp_inbound
# serwis identd, reject przyspiesza logowanie...
$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 113 -j REJECT
# $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 113 -j ACCEPT
$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 113 -j REJECT
#$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 113 -j ACCEPT
##########################################################################
# uslugi dostepne z zewnatrz
# indianiec
#$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 80 -j ACCEPT
# indianiec w wersji ssl
#$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 443 -j ACCEPT
# sshd
#$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -j ACCEPT
# rozne inne uslugi..... odhaszowac lub dodac w razie potrzeby...
#$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 8000:8001 -j ACCEPT
#$IPT -A tcp_inbound -p UDP -s 0/0 --destination-port 8000:8001 -j ACCEPT
# brak regulki, powrot
$IPT -A tcp_inbound -p TCP -j RETURN
##########################################################################
#uslugi jakie chcemy zablokowac dla sieci lokalnej
# blokowanie wychodzacego IRC
#$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 194 -j REJECT
# blokowanie wychodzacego telnetu
#$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 23 -j REJECT
# blokowanie internet messengerow ( przyklady... )
# AIM
#$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 5190 -j REJECT
# grafika przez AIM'a
#$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 4443 -j REJECT
# MSN Messenger
#$IPT -A tcp_outbound -p TCP -s 0/0 --destination-port 1863 -j REJECT
# brak regulek zabraniajacych wiec akceptujemy
$IPT -A tcp_outbound -p TCP -s 0/0 -j ACCEPT
##########################################################################
# lancuchy INPUT
echo "laduje lancuchy INPUT ..."
# pozwol na wszystko dla ifejsu lo
$IPT -A INPUT -p ALL -i $LO_IFACE -j ACCEPT
$IPT -A INPUT -p ALL -i $LO_IFACEV -j ACCEPT
# Drop bad packets
$IPT -A INPUT -p ALL -j bad_packets
# modemy kablowe DOCSIS
# $IPT -A INPUT -p ALL -d 224.0.0.1 -j DROP
# $IPT -A INPUT -p ALL -d 224.0.0.1 -j ACCEPT
# zasady dla sieci lokalnej (dostep do gateway'a dla samych siebie)
#$IPT -A INPUT -p ALL -i $LOCAL_IFACE -s $LOCAL_NET -j ACCEPT
#$IPT -A INPUT -p ALL -i $LOCAL_IFACE -d $LOCAL_BCAST -j ACCEPT
# zasady dla pakietow "przychodzacych"
# akceptujemy juz ustanowione polaczenia
$IPT -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
# rutujemy reszte wlasciwych pakietow
$IPT -A INPUT -p TCP -i $INET_IFACE -j tcp_inbound
$IPT -A INPUT -p UDP -i $INET_IFACE -j udp_inbound
$IPT -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
# odrzucamy bez logowania
$IPT -A INPUT -p ALL -d 255.255.255.255 -j DROP
# logujemy pakiety ktore ciagle nie pasuja...
$IPT -A INPUT -j LOG --log-prefix "fp=ip_in:99 a=DROP "
##########################################################################
# lancuchy FORWARD
echo "laduje lancuchy FORWARD ..."
# regulki do nat-u
# odrzucamy zle pakiety
$IPT -A FORWARD -p ALL -j bad_packets
# akceptujemy pakiety TCP ktore chcemy forwardowac z localnetu
#$IPT -A FORWARD -p tcp -i $LOCAL_IFACE -j tcp_outbound
# akceptujemy pakiety UDP ktore chcemy forwardowac z localnetu
#$IPT -A FORWARD -p udp -i $LOCAL_IFACE -j udp_outbound
# jesli nie sa zablokowane akceptujemy wszystkie pakiety z localnetu
#$IPT -A FORWARD -p ALL -i $LOCAL_IFACE -j ACCEPT
# ustanawiamy polaczenia z internetem
#$IPT -A FORWARD -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
# logujemy pakiety ktore ciagle nie pasuja...
$IPT -A FORWARD -j LOG --log-prefix "fp=ip_forward:99 a=DROP "
##########################################################################
# lancuchy OUTPUT
echo "laduje lancuchy OUTPUT ..."
# generalnie ufamy pakietom wychodzacym :P
# ale, "zle" pakieciki ICMP powinny "zejsc" :P
$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP
# Localhost
$IPT -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPT -A OUTPUT -p ALL -s $LO_IPW -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO_IFACE -j ACCEPT
$IPT -A OUTPUT -p ALL -o $LO_IFACEV -j ACCEPT
# do sieci lokalnej
#$IPT -A OUTPUT -p ALL -s $LOCAL_IP -j ACCEPT
#$IPT -A OUTPUT -p ALL -o $LOCAL_IFACE -j ACCEPT
# do internet'u
$IPT -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT
# logujemy pakiety ktore ciagle nie pasuja...
$IPT -A OUTPUT -j LOG --log-prefix "fp=ip_out:99 a=DROP "
##########################################################################
# tabela nat-u
echo "laduje lancuchy nat ..."
# lancuchy postrouting
#$IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE
echo "Zrobione:P"