• 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ů:

- Paketový filtr
- Aplikační proxy
- Stavový firewall
- Analyzátor paketů,
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:
- Securing and Optimizing Linux: Red Hat Edition
(http://www.linuxsecurity.com/docs/) - man ipchains
Michal Vymazal
www.linuxservices.cz
Akce:
Otevřít verzi pro tisk
