Josef Kufner

iptables

Nastavování firewallu z iptables ve většině případů není nic extrémě složitého, ale kdo si to má pamatovat. Linux v sobě má podporu pro netfilter snad v každé distribuci, takže s nějakou instalací se není třeba zabývat, stačí nastavit pravidla a zde je script, který obsahuje většinu běžně potřebných pravidel vetně maškarády.

Záměrně zde není přímo soubor ke stažení, protože toto má sloužit jen jako inspirace a v žádném případě to není hotová věc, kterou stačí spustit (i když se tak tváří).

#!/bin/bash 
#----------------------------------------------------------------------------#
#
#	iptables initialization
#	by Josef Kufner <jk(a)myserver.cz>
#
#
#	special thanks to:
#		http://www.petricek.cz/mpfw/mpfw.sh.txt
#
#----------------------------------------------------------------------------#

## config
IPTABLES=/sbin/iptables
LO_IFACE=lo
INET_IFACE=eth0
LAN_IFACE=eth1

## vyber rozhrani na ktere to bude pustene
## (v pripade ze je spousteno z /etc/network/if-pre-up.d/ -- Debian)
[ "$IFACE" != "" ] && [ "$IFACE" != "$INET_IFACE" ] && exit


#----------------------------------------------------------------------------#
#		Moduly & inicializace
#----------------------------------------------------------------------------#

echo
echo -n "Loading iptables settings"

## Zavedeme moduly pro nestandardni cile
/sbin/modprobe ipt_REJECT
/sbin/modprobe ipt_MASQUERADE

## Moduly pro FTP prenosy
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp

## clear all
$IPTABLES -F -t mangle
$IPTABLES -F -t nat
$IPTABLES -F
$IPTABLES -Z
$IPTABLES -X

echo -n "."


#----------------------------------------------------------------------------#
#		Default
#----------------------------------------------------------------------------#

$IPTABLES -P INPUT	DROP
$IPTABLES -P OUTPUT	ACCEPT
$IPTABLES -P FORWARD	DROP

echo -n "."


#----------------------------------------------------------------------------#
#		retezce
#----------------------------------------------------------------------------#

## Retezec pro stanoveni limitu prichozich SYN konexi (ochrana pred SYN floods)
## propusti pouze 4 SYN segmenty/sec
$IPTABLES -N syn-flood
$IPTABLES -A syn-flood -m limit --limit 20/s --limit-burst 5 -j RETURN
$IPTABLES -A syn-flood -j DROP

echo -n "."


#----------------------------------------------------------------------------#
#		INPUT
#----------------------------------------------------------------------------#

## Pakety od navazanych spojeni jsou v poradku
$IPTABLES -A INPUT -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

## loopback bez omezeni
$IPTABLES -A INPUT -i $LO_IFACE -j ACCEPT

## server sit bez omezeni
$IPTABLES -A INPUT -i $SERVER_IFACE -j ACCEPT

## lan bez omezeni -- jedine neco jako transparentni proxy, ale to az casem
$IPTABLES -A INPUT -i $LAN_IFACE -j ACCEPT


## ping -- max 5 za sec
$IPTABLES -A INPUT -i $INET_IFACE -p icmp --icmp-type 'echo-request' \
		-m limit --limit 1/s --limit-burst 10 -j ACCEPT

## Odfiltrovat pokusy o syn-flooding
$IPTABLES -A INPUT -i $INET_IFACE -p tcp --syn -j syn-flood

## Odfiltrovat pokusy o zahlceni icmp
$IPTABLES -A INPUT -i $INET_IFACE -p icmp -j syn-flood

## auth nerado DROP
$IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport auth -j REJECT --reject-with tcp-reset

## povolene sluzby
# $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 21	-j ACCEPT	#  FTP server
# $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 22	-j ACCEPT	#  SSH server
# $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 25	-j ACCEPT	#  SMTP server
# $IPTABLES -A INPUT -i $INET_IFACE -p UDP --dport 53	-j ACCEPT	#  DNS server UDP
# $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 53	-j ACCEPT	#  DNS server TCP
# $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 80	-j ACCEPT	#  WWW server
# $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 110	-j ACCEPT	#  POP3 server
# $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 143	-j ACCEPT	#  IMAP server
# $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 443	-j ACCEPT	#  HTTPS server
# $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 873	-j ACCEPT	#  rsync server
# $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 995	-j ACCEPT	#  POP3s server
# $IPTABLES -A INPUT -i $INET_IFACE -p TCP --dport 10000 -j ACCEPT	#  webmin server

## DC++
# $IPTABLES -A INPUT -p tcp --dport 9176 -j ACCEPT
# $IPTABLES -A INPUT -p udp --dport 9176 -j ACCEPT

## otevreni firewallu pro LAN
$IPTABLES -A INPUT   -i $LAN_IFACE -j ACCEPT

echo -n "."


#----------------------------------------------------------------------------#
#		OUTPUT
#----------------------------------------------------------------------------#

## vse je defaultne povoleno

## TOS flagy slouzi k optimalizaci datovych cest. Pro ssh, ftp a telnet
## pozadujeme minimalni zpozdeni. Pro ftp-data zase maximalni propostnost
$IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p tcp	\
	--sport ssh -j TOS --set-tos Minimize-Delay
$IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p tcp	\
	--dport ssh	-j TOS --set-tos Minimize-Delay
$IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p tcp	\
	--sport ftp	-j TOS --set-tos Minimize-Delay
$IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p tcp	\
	--dport ftp	-j TOS --set-tos Minimize-Delay
$IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p tcp	\
	--dport telnet -j TOS --set-tos Minimize-Delay
$IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p tcp	\
	--sport ftp-data -j TOS --set-tos Maximize-Throughput

echo -n "."


#----------------------------------------------------------------------------#
#		FORWARD
#----------------------------------------------------------------------------#


# MTU je na ppp0 a eth0 ruzny:
#    This is called MSS-clamping and influences the amount
#    of data per TCP packet.
$IPTABLES -I FORWARD -p tcp --tcp-flags SYN,RST SYN \
                     -j TCPMSS --clamp-mss-to-pmtu

## NAT - maskarada
echo "1" > /proc/sys/net/ipv4/ip_forward
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE

## jedna zlobiva IP
$IPTABLES -A FORWARD -i $LAN_IFACE -s 192.168.1.99 -j REJECT

## povoleni provozu
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $LAN_IFACE -p all -m state --state NEW -j ACCEPT


echo -n "."


#----------------------------------------------------------------------------#
#		Konec
#----------------------------------------------------------------------------#

echo done.
exit

#----------------------------------------------------------------------------#