Hlavní menu:

Kontakt

Telefony:

Objednávky: +420 267 314 267
Technická podpora:
+420 267 314 267

Reklamace, servis:
+420 272 732 827
Zakázkový vývoj: +420 272 732 827

Fax:

+420 267 314 269

Objednávky: obchod@papouch.com
Dotazy: papouch@papouch.com

V našem e-shopu můžete platit také kartami MasterCard®, Maestro®, VISA® a VISA Electron®.

Jak na to? > Linux > Firewall - díl 2. - vlastní skript >

Firewall - díl 2. - vlastní skript



V minulém díle jsme si řekli, že firewall je vlastně jakási "pagoda", jež sestává z níže uvedených dílů:

tucnak_button.gif

 

  1. Paketový filtr
  2. Aplikační proxy
  3. Stavový firewall
  4. Analyzátor paketů,
přičemž paketový filtr je povinný. Díly 2-4 povinné nejsou a můžeme je kombinovat (záleží na tom, co všechno bude náš firewall hlídat). A protože v minulém díle jsme se zaměřili na paketový filtr, podívejme se na něj poněkud blíže. Já sám používám níže uvedený skript, založený na ipchains (tedy kernel řady 2.2.x). K jeho cti slouží fakt, že za půl roku provozu skrze něj "neprošel" žádný sušenka (tedy cracker, vetřelec, prostě nenechavec zvenčí). To ovšem neznamená, že nemám v archivu žádný záznam o pokusech o něco takového, naopak. Jejich výčet je pěkně dlouhý. Připomínám, že doma používám modelovou topologii popsanou v minulém dílu, tedy PC připojené k Internetu pomocí externího modemu (o interních modemech si také někdy povíme, do té doby berte jako fakt, že na firewall interní modemy prostě nepatří). Na tomto PC neběží žádné služby dostupné zvenčí a věškeré navazování spojení se děje výhradně a pouze ze strany PC směrem do Internetu.

 

Tak. Skript se nachází v adresáři /etc/rc.d/init.d a jmenuje se firewall
Napřed vyplňte vaše parametry (vaši IP adresu a localnet), poté skript zkopírujte do uvedeného adresáře. Nyní musíte skript učinit "spustitelným" a změňte i jeho vlastníka:
chmod 700 /etc/rc.d/init.d/firewall
chown 0.0 /etc/rc.d/init.d/firewall

vytvořte symbolické rc.d linky pro Váš firewall
chkconfig --add firewall
chkconfig--level 345 firewall on

Skript firewall se nyní bude automaticky spouštět v runlevelech 3,4 a 5.

Mimochodem, dávejte pozot, v čem budete skript editovat. Doporučuji Midnight Commander, vi nebo kedit. Pozor na konce řádků. Znak ^M tam rozhodně nepatří.

Vzhledem k tomu, že vysvětlování jednotlivých parametrů ipchains by bylo dosti obsáhlé a vlastně bychom opisovali manuál, doporučuji si manuál k ipchains vytisknout. Můžete to provést třeba takto:
Napřed manové stránky "převeďte" do textové podoby
man ipchains | col -b >ipchains.txt
a teď jej můžete poslat na tiskárnu

A nyní vlastní skript:
/etc/rc.d/init.d/firewall

#!/bin/sh
#
# chkconfig: - 60 95
# description: Starts and stops the IPCHAINS Firewall \
# used to provide Firewall network services.

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

if [ ! -x /sbin/ipchains ]; then
exit 0
fi

# See how we were called.
case "$1" in
start)
echo -n "Starting Firewalling Services: "
# Some definitions for easy maintenance.
# ----------------------------------------------------------------------------
# EDIT THESE TO SUIT YOUR SYSTEM AND ISP.
EXTERNAL_INTERFACE="ppp0" # Internet connected interface
LOCAL_INTERFACE_1="eth0" # Internal LAN interface
LOOPBACK_INTERFACE="127.0.0.1" # Your local naming convention
IPADDR="10.10.10.30" # Your IP address
LOCALNET_1="10.10.10.0/24" # Whatever private range you use
#IPSECSG="my.ipsecsg.address" # Space separated list of remote VPN gateways
#FREESWANVI="ipsec0" # Space separated list of virtual interfaces
ANYWHERE="any/0" # Match any IP address
#NAMESERVER_1="195.250.128.34" # Everyone must have at least one
#NAMESERVER_2="195.250.128.38" # Your secondary name server
#MY_ISP="195.250.128.0/24" # ISP & NOC address range
# SMTP_SERVER="smtp.vol.cz" # Your Mail Hub Server.
#POP_SERVER="pop.vol.cz" # External pop server, if any
#NEWS_SERVER="my.news.server" # External news server, if any
#SYSLOG_SERVER="syslog.internal.server" # Your syslog internal server
LOOPBACK="127.0.0.0/8" # Reserved loopback address range
CLASS_A="10.0.0.0/8" # Class A private networks
CLASS_B="172.16.0.0/12" # Class B private networks
CLASS_C="192.168.0.0/16" # Class C private networks
CLASS_D_MULTICAST="224.0.0.0/4" # Class D multicast addresses
CLASS_E_RESERVED_NET="240.0.0.0/5" # Class E reserved addresses
BROADCAST_SRC="0.0.0.0" # Broadcast source address
BROADCAST_DEST="255.255.255.255" # Broadcast destination address
PRIVPORTS="0:1023" # Well known, privileged port range
UNPRIVPORTS="1024:65535" # Unprivileged port range
echo -n '.'
# ----------------------------------------------------------------------------
# SSH starts at 1023 and works down to 513 for
# each additional simultaneous incoming connection
SSH_PORTS="1022:1023" # range for SSH privileged ports
# traceroute usually uses -S 32769:65535 -D 33434:33523
TRACEROUTE_SRC_PORTS="32769:65535"
TRACEROUTE_DEST_PORTS="33434:33523"
echo -n '.'
# ----------------------------------------------------------------------------
# DEFAULT POLICY
# Default policy is DENY / vyradil jsem!, zatim je accept
# Explicitly accept desired INCOMING & OUTGOING connections
# Remove all existing rules belonging to this filter
ipchains -F
# Clearing all current rules and user defined chains
ipchains -X
#
# Moje uprava 20.11.2000 prednastaveno je input/output accept, forward je deny
ipchains -P input ACCEPT
ipchains -P output ACCEPT
ipchains -P forward DENY
#----------------------------------------------------------------------------
# Moje uprava 28.11.2000
# LOGOVANI PRICHOZICH PAKETU
# Logovat vsechny prichozi SYN pakety
# (SYN plati pouze pro TCP)
#ipchains -A input -p TCP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 -y -l
# Jen pro externi rozhrani
#
ipchains -A input -p TCP -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 -y -l
# Pro vsechna rozhrani
#
# Moje uprava 21.01.2001
# logovat vsechny prichozi UDP pakety z externiho rozhrani
ipchains -A input -p UDP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 -l
#
# LOOPBACK
# Unlimited traffic on the loopback interface.
ipchains -A input -i $LOOPBACK_INTERFACE -j ACCEPT
ipchains -A output -i $LOOPBACK_INTERFACE -j ACCEPT
echo -n '.'
# ----------------------------------------------------------------------------
# Network Ghouls
# Deny access to jerks
# /etc/rc.d/rc.firewall.blocked contains a list of
# ipchains -A input -i $EXTERNAL_INTERFACE -s address -j DENY
# rules to block from any access.
# Refuse any connection from problem sites
#if [ -f /etc/rc.d/rc.firewall.blocked ]; then
# . /etc/rc.d/rc.firewall.blocked
#fi
echo -n '.'
# ----------------------------------------------------------------------------
# SPOOFING & BAD ADDRESSES
# Refuse spoofed packets.
# Ignore blatantly illegal source addresses.
# Protect yourself from sending to bad addresses.
# Refuse spoofed packets pretending to be from the external address.
ipchains -A input -i $EXTERNAL_INTERFACE -s $IPADDR -j DENY -l
# Refuse packets claiming to be to or from a Class A private network
ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_A -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -d $CLASS_A -j DENY -l
ipchains -A output -i $EXTERNAL_INTERFACE -s $CLASS_A -j REJECT -l
ipchains -A output -i $EXTERNAL_INTERFACE -d $CLASS_A -j REJECT -l
# Refuse packets claiming to be to or from a Class B private network
ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_B -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -d $CLASS_B -j DENY -l
ipchains -A output -i $EXTERNAL_INTERFACE -s $CLASS_B -j REJECT -l
ipchains -A output -i $EXTERNAL_INTERFACE -d $CLASS_B -j REJECT -l
# Refuse packets claiming to be to or from a Class C private network
ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_C -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -d $CLASS_C -j DENY -l
ipchains -A output -i $EXTERNAL_INTERFACE -s $CLASS_C -j REJECT -l
ipchains -A output -i $EXTERNAL_INTERFACE -d $CLASS_C -j REJECT -l
# Refuse packets claiming to be from the loopback interface
ipchains -A input -i $EXTERNAL_INTERFACE -s $LOOPBACK -j DENY -l
ipchains -A output -i $EXTERNAL_INTERFACE -s $LOOPBACK -j REJECT -l
# Refuse broadcast address SOURCE packets
ipchains -A input -i $EXTERNAL_INTERFACE -s $BROADCAST_DEST -j DENY -l
ipchains -A input -i $EXTERNAL_INTERFACE -d $BROADCAST_SRC -j DENY -l
# Refuse Class D multicast addresses (in.h) (NET-3-HOWTO)
# Multicast is illegal as a source address.
# Multicast uses UDP.
ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_D_MULTICAST -j DENY -l
# Refuse Class E reserved IP addresses
ipchains -A input -i $EXTERNAL_INTERFACE -s $CLASS_E_RESERVED_NET -j DENY -l
#
#---------------------------------------------------------------------------
# OMEZENI PRO EXTERNI ROZHRANI
# Moje doplnky 15.12.2000
# ftp
ipchains -A input -p TCP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 21 -j DENY -l
ipchains -A input -p UDP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 21 -j DENY -l
# ssh
ipchains -A input -p TCP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 22 -j DENY -l
ipchains -A input -p UDP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 22 -j DENY -l
# whois
ipchains -A input -p TCP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 43 -j DENY -l
#linuxconf
ipchains -A input -p TCP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 98 -j DENY -l
# portmapper rpc
ipchains -A input -p TCP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 111 -j DENY -l
ipchains -A input -p UDP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 111 -j DENY -l
# auth
ipchains -A input -p TCP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 113 -j DENY -l
# samba - netbios
ipchains -A input -p TCP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 137:139 -j DENY -l
ipchains -A input -p UDP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 137:139 -j DENY -l
#swat
ipchains -A input -p TCP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 901 -j DENY-l
#-----------------------------------------------------------------------------
# ZAKAZANI PRICHOZICH TCP SYN PAKETU
# od 1024 do cca 5000 si otevira sockets Netscape pro svou potrebu!
# podobne je to s Mozillou
# Konqueror pouziva porty nad 30000
#ipchains -A input -p TCP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 2000:65535 -j DENY -l
ipchains -A input -p TCP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 1024:65535 -y -j DENY -l
# zakazat prichozi TCP SYN pakety na portech 1024:65535 pro ppp0
#
ipchains -A input -p TCP -i $EXTERNAL_INTERFACE -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 1:1023 -y -j DENY -l
# zakazat prichozi TCP STYN pakety na portech 1:1023 pro ppp0
#
# Moje uprava 12.01.2001
# Zarazuji sem pote, co nekdo spoofoval na adresu meho ppp0 pomoci adresy meho eth0
# Sel na port 139 netbios-ssn
# Refuse spoofed packets pretending to be from the external address.
ipchains -A input -i $EXTERNAL_INTERFACE -s $IPADDR -j DENY -l
#---------------------------------------------------------------------------
# OMEZENI PRO VSECHNA ROZHRANI
#
# telnet
ipchains -A input -p TCP -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 23 -j DENY -l
# smtp
ipchains -A input -p TCP -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 25 -j DENY -l
# dns
ipchains -A input -p UDP -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 53 -j DENY -l
ipchains -A input -p TCP -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 53 -j DENY -l
# finger
ipchains -A input -p TCP -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 79 -j DENY -l
# printer
ipchains -A input -p TCP -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 515 -j DENY -l
# x-windows
ipchains -A input -p TCP -s ! $LOOPBACK_INTERFACE -d 0.0.0.0/0 6000 -j DENY -l
# zakazat pro vsechna rozhrani
#----------------------------------------------------------------------------
# MINIMALNI PRODLEVA PRO ODCHOZI PAKETY
ipchains -A output -p TCP -d 0.0.0.0/0 21:23 -t 0x01 0x10
# minimalni prodleva pro odchozi pakety zajistujici sluzby FTP, telnet a SSH
echo -n '.'
echo ' OK'

ipchains -L
# ----------------------------------------------------------------------------
;;
stop)
echo -n "Shutting Firewalling Services: "
# Remove all existing rules belonging to this filter
ipchains -F
# Delete all user-defined chain to this filter
ipchains -X
# Reset the default policy of the filter to accept.
ipchains -P input ACCEPT
ipchains -P output ACCEPT
ipchains -P forward ACCEPT
echo ' OK'
;;
status)
status firewall
RETVAL=$?
ipchains -L
# Pokud bude "resolving" u ipchains -L zdrzovat, nahradte predchozi radek radkem
# ipchains -n -L
;;
restart|reload)
$0 stop
$0 start
;;
*)
echo "Usage: firewall {start|stop|status|restart|reload}"
exit 1
esac
exit 0


Zápisy do logu
Ano, veškeré zápisy logovaných paketů se provedou do souboru /var/log/messages.

O tom, jak procházení tohoto logu urychlit a zpříjemnit, si povíme příště.

Popis vlastního skriptu
Skript má svůj původ v (1), nicméně jsem jej musel upravit pro naši modelovou topologii (popisovali jsme si ji v minulém článku). Krátce tedy připomenu, že se jedná o samostatné PC, které je modemem připojeno k Internetu. Je to vlastně "normální domácí PC", které provozuje X-Windows a nějaké ty kancelářské aplikace typu StarOffice, www prohlížeč a elektronická pošta (mozilla, netvrdím, že je dokonalá, ale docela mi vyhovuje). Veškerá síťová spojení navazuje uživatel PC směrem k Internetu, navázání spojení z Internetu (mám na mysli TCP SYN) není povoleno. UDP pakety jsou zatím "ošetřeny" tak, že logujeme všechny příchozí UDP pakety z externího rozhraní. Pokud se ptáte proč, odpověď je prostá, vyhovuje mi to:-) Co se týče "zakázaných" příchozích TCP SYN paketů, jsou samozřejmě logovány také. Ve skriptu jsem ponechal i mé "kontrolní" poznámky. Inu, skript se vyvíjí. Budeme se k němu vracet v příštích dílech a poznámky se budou hodit:-)

Pravdu mají Ti, kdo tvrdí, že skript je zbytečně dlouhý. Ano, je tomu tak, bylo by možné jej shrnout asi do 10 řádek, ale pak přijdete o možnost změny (odkomentovat/zakomentovat řádku a firewall reload). Má to svůj význam zejména v době, kdy budete něco ladit.

Poznámka:
Pokud se ptáte, zda jsou čísla portů v /etc/services nějak "normována", pak vězte, že jsou. Podrobný popis je k mání například zde:
http://www.isi.edu/in-notes/iana/assignments/port-numbers

A na příště:
Příště je podíváme na nějakou tu šikovnou utilitku, která "zpřehlední" procházení logu /var/log/messages. Provedeme si rozborku/sborku záznamů v logu a podíváme se na rotaci /var/log/messages (už jste měli někdy plný disk jen proto, že jej zabraly log soubory?).

Kontrolní otázka:
Kterou principielní otázku výše uvedený skript neřeší? Určitě na to přijdete, jeden protokol tam zkrátka chybí. Nechal jsem si jej na příště záměrně. Ale pokud sledujete například security@underground.cz, pak již určitě tušíte, co mám na mysli.

Nezapomeňte
Náš skript je jen paketový filtr a nazývat jej firewallem by bylo dosti nadnesené (vzpomínáte na pagodu v minulém článku?). Je sice užitečný, ale nikoliv všemocný. Takže nezapomeňte denně prohlížet /var/log/messages ! A samozřejmě, sledovat konference. Inu, čert nikdy nespí:-)

Poděkování
Patří samozřejmě všem, kdož mě zásobili svými příspěvky. Obzvláště děkuji za odkaz na literaturu (ozve se mi autor z loňské debaty?, díky) a Jardovi Gratzovi, který svým článkem "Jak na filtrování paketů pro dialup" (www.root.cz) vlastně celou tuhle věc odstartoval.

Použitá literatura:

  1. Securing and Optimizing Linux: Red Hat Edition
    (http://www.linuxsecurity.com/docs/)
  2. man ipchains

 

Michal Vymazal
www.linuxservices.cz






Akce: Otevřít verzi pro tisk Otevřít verzi pro tisk


Soubory: