#!/bin/bash
### BEGIN INIT INFO
# Provides: firewall load rules
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 5
# Default-Stop: 2 3 5
# Description: Firewall Filterregeln laden und entladen
### END INIT INFO
# (c) Wenger Florian
# wenger@unifox.at
# http://www.unifox.at
##########################################################################
#
# nach Aenderungen musz "/etc/init.d/firewall reload" ausgefuehrt werden
# um die Regeln neu zu laden
#
##########################################################################
# Globale Variabeln definieren
# ----------------------------
IPTABLES=/usr/sbin/iptables
# Spezielle Ports
# ----------------------------
p_high=1024:65535
# Interfaces
# ----------------------------
EXTIF=eth0
INTIF=eth1
IF="$EXTIF $INTIF"
# IP Adressen
# ----------------------------
EXTIP=62.0.0.1 #IP-Adresse deiner Internet-schnittstelle
INTIP=192.168.1.1
EXTNS="195.0.0.0 195.0.1.0" #nsmeserver deines Providers
MAIL=62.0.0.35
GAMESERVER=62.1.0.2 #ip des Gameservers
SQUIDSERVER=192.168.1.1
INTERN=192.168.1.0/255.255.255.0
ADMIN="192.168.1.202" #liste aller ip-Adressen die alles dürfen
######################################################################
# folgende IP-Adressen duerfen dieses Gateway passieren 192.168.1.xxx
# IP-Adresse des Gateways nicht eintragen
######################################################################
ALLOWACCESS="120 121 "
##################################################
# #
# hier folgen die IP-Tables - Regeln #
# #
# bitte nur veraendern, wenn man sich auskennt. #
# #
##################################################
# Kernel-Parameter setzen
echo "0" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# Kernel-Parameter fuer Interface
for interf in $IF
do
#echo "# Kernel-Parameter fuer "$interf
echo "1" > /proc/sys/net/ipv4/conf/$interf/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/$interf/accept_redirects
echo "0" > /proc/sys/net/ipv4/conf/$interf/accept_source_route
echo "0" > /proc/sys/net/ipv4/conf/$interf/bootp_relay
echo "0" > /proc/sys/net/ipv4/conf/$interf/log_martians
done
# START / STOP
case $1 in
load)
# Default Policity
# alles verbieten
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -X
# Splitqueue fuer Clientqueues erstellen
# nur wer in der liste steht, darf frowarden
$IPTABLES -N mysplit
for myclient in $ALLOWACCESS
do
$IPTABLES -A mysplit -s 192.168.1.$myclient -d $INTIP -j ACCEPT
$IPTABLES -A mysplit -s $INTIP -d 192.168.1.$myclient -j ACCEPT
$IPTABLES -A mysplit -s 192.168.1.$myclient -d ! $INTERN -j ACCEPT
$IPTABLES -A mysplit -s ! $INTERN -d 192.168.1.$myclient -j ACCEPT
done
$IPTABLES -N my-ext-in
$IPTABLES -A my-ext-in -d $EXTIP -j ACCEPT
$IPTABLES -N my-ext-out
$IPTABLES -A my-ext-out -s $EXTIP -j ACCEPT
$IPTABLES -N myextdrop
$IPTABLES -A myextdrop -j DROP
$IPTABLES -N myextreject
$IPTABLES -A myextreject -j REJECT
$IPTABLES -N myintdrop
$IPTABLES -A myintdrop -j DROP
$IPTABLES -N myintreject
$IPTABLES -A myintreject -j REJECT
$IPTABLES -A mysplit -i $EXTIF -j myextreject
$IPTABLES -A mysplit -i $INTIF -j myintreject
# ----------------------------------------
# Regeln fuer diesen Rechner
# local 127.0.0.1 alles erlauben
# -----------------------------------------
$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A INPUT -i lo -j ACCEPT
# falsche Ip - Adressen ueber Netzwerinterfaces
# falls du böse Jungs in deiner LanParty hast
$IPTABLES -A INPUT -d ! $EXTIP -i $EXTIF -j myextdrop
$IPTABLES -A INPUT -d ! $INTIP -i $INTIF -j myintdrop
$IPTABLES -A OUTPUT -s ! $EXTIP -o $EXTIF -j myextdrop
$IPTABLES -A OUTPUT -s ! $INTIP -o $INTIF -j myintdrop
$IPTABLES -A INPUT -s $INTERN -i $EXTIF -j myextdrop
$IPTABLES -A INPUT -s ! $INTERN -i $INTIF -j myintdrop
# falsche pakete wegwerfen
$IPTABLES -A INPUT -i $INTIF -m state --state INVALID -j myintdrop
$IPTABLES -A INPUT -i $EXTIF -m state --state INVALID -j myextdrop
$IPTABLES -A OUTPUT -o $INTIF -m state --state INVALID -j myintdrop
$IPTABLES -A OUTPUT -o $EXTIF -m state --state INVALID -j myextdrop
# ICMP - Meldungen erlauben LAN - SEITE
$IPTABLES -A INPUT -p icmp -s $INTERN -d $INTIP -i $INTIF -j mysplit
$IPTABLES -A OUTPUT -p icmp -s $INTIP -d $INTERN -o $INTIF -j mysplit
# ICMP - Meldungen erlauben INTERNET - Seite
$IPTABLES -A INPUT -p icmp -s ! $INTERN -d $EXTIP -i $EXTIF -j my-ext-in
$IPTABLES -A OUTPUT -p icmp -s $EXTIP -d ! $INTERN -o $EXTIF -j my-ext-out
# Nameserver Abfragen auf INTERNET - SEITE erlauben
for ns in $EXTNS
do
$IPTABLES -A OUTPUT -p TCP -s $EXTIP --sport $p_high -d $ns --dport domain -o $EXTIF -j my-ext-out
$IPTABLES -A INPUT -p TCP -s $ns --sport domain -d $EXTIP --dport $p_high -i $EXTIF -j my-ext-in
$IPTABLES -A OUTPUT -p UDP -s $EXTIP --sport $p_high -d $ns --dport domain -o $EXTIF -j my-ext-out
$IPTABLES -A INPUT -p UDP -s $ns --sport domain -d $EXTIP --dport $p_high -i $EXTIF -j my-ext-in
done
# SSH auf LAN Seite erlauben
# wenn du das brauchen kannst
$IPTABLES -A INPUT -p tcp -s $INTERN --sport $p_ssh -d $INTIP --dport 22 -i $INTIF -m state --state NEW,ESTABLISHED,RELATED -j mysplit
$IPTABLES -A OUTPUT -p tcp -s $INTIP --sport 22 -d $INTERN --dport $p_ssh -o $INTIF -mstate --state ESTABLISHED,RELATED -j mysplit
# Intern auf Squid erlauben
$IPTABLES -A INPUT -p tcp -s $INTERN --sport $p_high -d $INTIP --dport 3128 -i $INTIF -m state --state NEW,ESTABLISHED,RELATED -j mysplit
$IPTABLES -A OUTPUT -p tcp -s $INTIP --sport 3128 -d $INTERN --dport $p_high -o $INTIF -m state --state ESTABLISHED,RELATED -j mysplit
# nach auszen HTTP erlauben (used by squid)
$IPTABLES -A OUTPUT -p tcp -s $EXTIP --sport $p_high -d ! $INTERN --dport http -o $EXTIF -m state --state NEW,ESTABLISHED,RELATED -j my-ext-out
$IPTABLES -A INPUT -p tcp -s ! $INTERN --sport http -d $EXTIP --dport $p_high -i $EXTIF -m state --state ESTABLISHED,RELATED -j my-ext-in
# nach auszen HTTPS erlauben (used by squid)
#squid kann ja auch https
$IPTABLES -A OUTPUT -p tcp -s $EXTIP --sport $p_high -d ! $INTERN --dport https -o $EXTIF -m state --state NEW,ESTABLISHED,RELATED -j my-ext-out
$IPTABLES -A INPUT -p tcp -s ! $INTERN --sport https -d $EXTIP --dport $p_high -i $EXTIF -m state --state ESTABLISHED,RELATED -j my-ext-in
# nach auszen 8080 erlauben (used by squid)
# da manche ältere Webservices auf port 8080 arbeiten
$IPTABLES -A OUTPUT -p tcp -s $EXTIP --sport $p_high -d ! $INTERN --dport 8080 -o $EXTIF -m state --state NEW,ESTABLISHED,RELATED -j my-ext-out
$IPTABLES -A INPUT -p tcp -s ! $INTERN --sport 8080 -d $EXTIP --dport $p_high -i $EXTIF -m state --state ESTABLISHED,RELATED -j my-ext-in
#ENDE der Regeln fuer diesen Computer
# Masquerading (NAT) auf EXTernemInterFace----------------------------------
################################################
################################################
$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
# neue und ungueltige eingehende Pakete verwerfen+LOG
$IPTABLES -A FORWARD -i $EXTIF -o $INTIF -m state --state NEW,INVALID -j myextdrop
$IPTABLES -A FORWARD -i $INTIF -o $EXTIF -m state --state INVALID -j myintdrop
# ADMIN - REGELN setzten (alles erlauben)
for adip in $ADMIN
do
$IPTABLES -A FORWARD -d ! $INTERN -i $INTIF -o $EXTIF -p TCP -m state --state NEW,ESTABLISHED,RELATED -s $adip -j ACCEPT
$IPTABLES -A FORWARD -d $adip -i $EXTIF -o $INTIF -p TCP -m state --state ESTABLISHED,RELATED -s ! $INTERN -j ACCEPT
$IPTABLES -A FORWARD -d ! $INTERN -i $INTIF -o $EXTIF -p UDP -m state --state NEW,ESTABLISHED,RELATED -s $adip -j ACCEPT
$IPTABLES -A FORWARD -d $adip -i $EXTIF -o $INTIF -p UDP -m state --state ESTABLISHED,RELATED -s ! $INTERN -j ACCEPT
done
# ICMP erlauben"
$IPTABLES -A FORWARD -p ICMP -s $INTERN -d ! $INTERN -i $INTIF -o $EXTIF -j mysplit
$IPTABLES -A FORWARD -p ICMP -s ! $INTERN -d $INTERN -i $EXTIF -o $INTIF -j mysplit
# Nameserver Abfragen erlauben
for ns in $EXTNS
do
$IPTABLES -A FORWARD -p TCP -s $INTERN --sport $p_high -d $ns --dport domain -i $INTIF -o $EXTIF -j mysplit
$IPTABLES -A FORWARD -p TCP -s $ns --sport domain -d $INTERN --dport $p_high -i $EXTIF -o $INTIF -j mysplit
$IPTABLES -A FORWARD -p UDP -s $INTERN --sport $p_high -d $ns --dport domain -i $INTIF -o $EXTIF -j mysplit
$IPTABLES -A FORWARD -p UDP -s $ns --sport domain -d $INTERN --dport $p_high -i $EXTIF -o $INTIF -j mysplit
done
# hier kannst du dann was lernen
$IPTABLES -A FORWARD -p tcp -s $INTERN --sport $p_high -d $GAMESERVER --dport 3048 -i $INTIF -o $EXTIF -j mysplit
$IPTABLES -A FORWARD -p tcp -s $GAMESERVER --sport 3048 -d $INTERN --dport $p_high -i $EXTIF -o $INTIF -j mysplit
# DROP everything else
$IPTABLES -A INPUT -i $INTIF -j myintdrop
$IPTABLES -A INPUT -i $EXTIF -j myextdrop
$IPTABLES -A FORWARD -i $INTIF -j myintdrop
$IPTABLES -A FORWARD -i $EXTIF -j myextdrop
$IPTABLES -A OUTPUT -o $INTIF -j myintdrop
$IPTABLES -A OUTPUT -o $EXTIF -j myextdrop
$IPTABLES -A INPUT -j DROP
$IPTABLES -A FORWARD -j DROP
$IPTABLES -A OUTPUT -j DROP
;;
unload)
#echo "Loesche IP-Tables Regeln (alles erlaubt)"
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -X
;;
start)
echo "LOADING FIREWALL"
$0 load
;;
stop)
echo "UNLOADING FIREWALL"
$0 unload
;;
reload)
$0 stop
$0 start
;;
list)
echo "IPTABLES - Listing"
echo "------------------"
$IPTABLES -L
;;
*)
echo "Benutzung: $0 {start|stop|reload|list|night}"
exit 1
;;
esac