Viitor_iptables/etc/init.d/firewall
kueller 1b2421eafa Die Nutzung von Services im Intranet aus der DMZ heraus kann jetzt
dediziert freigeschaltet werden.
Weiterhin gibt es eine hostbasierte Sonderbehandlung um NetBIOS durch
die Firewall zu bekommen



git-svn-id: svn://svn.compuextreme.de/Viitor/V962/Viitor_iptables@5792 504e572c-2e33-0410-9681-be2bf7408885
2010-08-19 12:39:16 +00:00

450 lines
15 KiB
Bash

#!/bin/bash
#Framework, welches ein komplettes Linux System aus den Sourcen erstellt
#dieses Framework wird im CVS Repository
#:pserver:cvs.rainmaker-mm.de/RMM/cvs zur Verfügung gestellt
#
#Lage dieser Datei im Archiv: $Source$
#
#(c) Rainmaker MultiMedia OHG
#This program is free software; you can redistribute it and/or
#modify ist under the terms of the GNU General Public License
#as published by the Free Software Foundation; either version
#2 of the License, or (at your option) any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#See the GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program; if not write to the Free Software Foundation,
#Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
#Beschreibung:
#Neues Firewall Script für MonsumLinux. Dieses Script arbeitet
#in Verbindung mit /etc/init.d/functions und /etc/init.d/.firewallfunc
#Durch einfache Konfiguration über die Datei /etc/sysconfig/firewall
#kann die Firewall eingestellt werden. Es wird dediziert angegeben
#welche Systeme durch die Firewall das Angeschlossene Internet mit
#Dynamischer IP Nutzen können. Zugriff auf den Router selber, sowie
#das Routing durch den Router für die Local angeschlossenen Netze
#kann getrennt gesteuert werden.
#Die Firewall arbeitet nach der Regel: Alles was nicht explizit erlaubt
#ist, ist verboten.
#
#Aufrufparameter:
#Es handelt sich um ein System V Init script. Entsprechend die Optionen
#start und stop
#
#Letzte Änderung von: $Author$
#Datum der letzten Änderung: $Date$
#Version der Datei: $Revision$
#
#$Log$
#Revision 1.20 2007/05/09 12:03:06 segler
#firewall.template has moved to etc/sysconfig/net
#
#Revision 1.19 2007/05/02 12:07:35 segler
#iptables resides in /usr/sbin, not /sbin
#
#Revision 1.18 2007/03/23 11:25:32 kueller
#Neue Funktionen und bugfixes eingepflegt. (Diese laufen auf skylla und sphinx stabil)
#
#Revision 1.17 2006/08/24 21:19:41 kueller
#Viele Funktionen ueberarbeitet. Erkennung der incomming devices optimiert.
#Wird nicht mehr ueber das DEVICES Array mit verschachtelten schleifen gemacht,
#sondern ueber ausgaben von netstat -rn mit zugehoerigen netzadressen ->
#das ist deutlich schneller.
#Ausserdem ausbau und verbesserung diverser Firewall einstellungen. Weiter
#entwicklung des port forwardings auf interne Server -> dem scheint jetzt
#auch mit MASQUERADE zu funktionieren.
#Weiterhin die entschluesselung von "Portnummer;tcp" aufgehoben. dafuer
#werden jetzt jeweils 2 Variablen (1x udp, 1x tcp) definiert, und deren
#inhalte mit -m multiport auf einen schlag uebergeben. Das spart einiges
#an Schleifen und beschleunigt das script emminent.
#
#Revision 1.16 2006/06/30 09:33:02 kueller
#Sonderbehandlung fuer localen zugriff auf syslog eingebaut
#
#Revision 1.15 2006/02/21 14:42:35 kueller
#Korrektur im Aufruf der LocalServices Function - sollte jetzt fuer alle richtig functionieren.
#Weiterhin beschleunigung beim startup wenn /etc/sysconfig/firewall nicht veraendert wurde.
#Nach dem Aufbau der Firewall tables wird ein iptables-save in /var/state/iptables.state gemacht.
#Diese kann, sofern /etc/sysconfig/firewall unveraendert ist, mit iptables-restore wieder
#geladen werden - was wesentlich schneller als das parsen der configfiles geht.
#
#Revision 1.14 2004/11/23 19:46:07 kueller
#Debuging und neue Funktionalität der Firewall. Mit der Zeit weiter gewachsen
#im CompuExtreme Netzwerk.
#
#Revision 1.9 2002/11/04 12:03:01 kueller
#Fehlende Funktionssammlung .firewallfunc hinzugefügt. Erweiterung der Firewall
#um MARK Funktionalitaet, sowie Freischaltung von Getunnelten Netzen (letzteres
#ist in der DEBUG Phase und funktioniert noch nicht komplett!)
#
#Revision 1.8 2002/10/14 12:36:45 kueller
#Firewall Script komplett neu erstellt. Es wird nun mit den Unterschiedlichen
#Chains (INPUT, FORWARD, OUTPUT) gearbeitet. Die Firewall lässt sich so
#wesentlich feiner abstimmen, und arbeitet sicherer.
#
#
CFGFILE=/etc/sysconfig/net/firewall
SYSFUNCTIONS=/etc/init.d/functions
FIREWALLFUNC=/etc/init.d/.firewallfunc
TMPSCRIPT=/var/tmp/firewall_reconfig$$
source $SYSFUNCTIONS
source $FIREWALLFUNC
IPTABLES="/usr/sbin/iptables"
IPCFG=/sbin/ip
IFCONFIG=/sbin/ifconfig
#DEBUG=echo
if [ -f "$CFGFILE" ]; then
source $CFGFILE
case $1 in
start)
if [ -f /var/state/iptables.state ]; then
echo -n "Disabling Kernel Console Output"
echo "0" >/proc/sys/kernel/printk
evaluate_retval
echo -n "Restoring Firewall Table"
cat /var/state/iptables.state|iptables-restore
evaluate_retval
else
echo "No saved configuration. please generate new config"
echo "Use $0 configure to generate new config"
fi
;;
configure)
if [ -f "$TMPSCRIPT" ]; then
rm $TMPSCRIPT
fi
touch $TMPSCRIPT
chmod 755 $TMPSCRIPT
echo -n "Firewall: loads network informations"
LoadDevArray
evaluate_retval
echo -n "Firewall: Setting default rule DROP "
DefaultRule
evaluate_retval
echo -n "Firewall: Opening loopback Communication"
AllowLoopBack
evaluate_retval
ACCEPTRULE=ACCEPT
REJECTRULE=REJECT
if [ "$ACCOUNTING" == "yes" ]; then
echo -n "Activate ACCOUNTING LOG"
echo "#ACCOUNTING Table erstellen" >>$TMPSCRIPT
CreateAccountingTable
ACCEPTRULE=account-log
evaluate_retval
fi
if [ "$LOG_REJECTED" == "yes" ]; then
echo -n "Activate REJECT LOG"
echo "#LOG_REJECT einrichten" >>$TMPSCRIPT
CreateLogTable
REJECTRULE=reject-log
evaluate_retval
fi
if [ "$ICMP" == "yes" ]; then
echo -n "Activate ICMP Rules"
echo "#ICM Rules" >>$TMPSCRIPT
CreateICMPTable
ActivateICMPRules
evaluate_retval
else
echo -n "Opening ICMP"
echo "#ICM Ohne einschraenkung zulassen" >>$TMPSCRIPT
for i in FORWARD \
INPUT \
OUTPUT; do
echo "$DEBUG $IPTABLES -A $i \
-p icmp \
-j ACCEPT" >>$TMPSCRIPT
done
evaluate_retval
fi
if [ "$INTERNROUTING" ]; then
echo -n "Activate Local Routing for $INTERNROUTING"
echo "#Firewalling fuer interne Ports deaktivieren" >>$TMPSCRIPT
AllowInternRouting ACCEPT $INTERNROUTING
evaluate_retval
fi
y=0
while [ "${LOCALSERVER[$y]}" ]; do
echo -n "Activating allow for localserver ${LOCALSERVER[$y]}"
LOCSERVER=`echo ${LOCALSERVER[$y]}|cut -d":" -f 2`
DMZCLIENT=`echo ${LOCALSERVER[$y]}|cut -d":" -f 1`
LOCPORT=`echo ${LOCALSERVER[$y]}|cut -d":" -f 3`
LOCPROT=`echo ${LOCALSERVER[$y]}|cut -d":" -f 4`
AllowLocalServer $LOCSERVER \
$DMZCLIENT \
$LOCPORT \
$LOCPROT
evaluate_retval
(( y++ ))
done
if [ "$ALLOWNET" ]; then
echo -n "Allowing routing for NET=$ALLOWNET over $TUNDEV"
echo "#Netz $ALLOWNET komplett freischalten" >>$TMPSCRIPT
AllowAllDefault $ALLOWNET $TUNDEV ACCEPT
evaluate_retval
fi
for i in $MASQNET; do
echo -n "Activate Masquerading for $i"
echo "#Masquerade einrichten" >>$TMPSCRIPT
ActivateMasq $OUTDEVICE $MASQNET
evaluate_retval
done
y=0
while [ ${DMZSERVER[$y]} ]; do
echo "Allow Access to ${DMZSERVER[$y]}"
echo "for UDP Ports: ${UDPDMZPORTS[$y]}"
echo -n "for TCP Ports: ${TCPDMZPORTS[$y]}"
echo "#DMZServer ${DMZSERVER[$y]} freigeben" >>$TMPSCRIPT
AllowDMZServiceAccess ${DMZSERVER[$y]} \
"${UDPDMZPORTS[$y]}" \
"${TCPDMZPORTS[$y]}"
evaluate_retval
(( y++ ))
done
for i in $GLOBALSERVER; do
echo -n "Allow Access to Server $i"
echo "#Zugriff auf server $i freigeben" >>$TMPSCRIPT
LocalAllowWSAll $i
evaluate_retval
done
if [ "$LOCALDEVICES" ]; then
if [ "$LOCALUDP" ] || [ "$LOCALTCP" ]; then
echo "#Zugriff auf Firewall fuer locale Netze freigeben" >>$TMPSCRIPT
LocalAllowPortIN "$LOCALUDP" "$LOCALTCP" "$LOCALDEVICES"
evaluate_retval
fi
fi
wszahler=0
while [ "${ALLOWEDNETWORK[$wszahler]}" ]; do
echo "Allow Local Access for Network ${ALLOWEDNETWORK[$wszahler]}"
echo "#Eingeschr. Zugriff fuer Netz ${ALLOWEDNETWORK[$wszahler]} einrichten" >>$TMPSCRIPT
AllowNetPortIN "${NETUDPSERVICES[$wszahler]}" \
"${NETTCPSERVICES[$wszahler]}" \
${ALLOWEDNETWORK[$wszahler]}
(( wszahler = $wszahler + 1 ))
done
wszahler=0
while [ "${LOCALWS[$wszahler]}" ]; do
echo "Internet Access for ${LOCALWS[$wszahler]}"
echo "UDP: ${ROUTEUDP[$wszahler]}"
echo -n "TCP:${ROUTETCP[$wszahler]}"
echo "#Freischaltung fuer ${LOCALWS[$wszahler]}" >>$TMPSCRIPT
AllowWSPortOUT $OUTDEVICE \
${LOCALWS[$wszahler]} \
"${ROUTEUDP[$wszahler]}" \
"${ROUTETCP[$wszahler]}" \
$ACCEPTRULE
if [ "${ALLOWSWPORTS[$wszahler]}" = "yes" ]; then
echo "#ftp portswitch fuer ${LOCALWS[$wszahler]}" >>$TMPSCRIPT
AllowWSSwitchPort ${LOCALWS[$wszahler]} tcp $OUTDEV $ACCEPTRULE
AllowWSSwitchPort ${LOCALWS[$wszahler]} udp $OUTDEV $ACCEPTRULE
fi
if [ "${ALLOWNTP[$wszahler]}" = "yes" ]; then
echo "#ntp fuer ${LOCALWS[$wszahler]}" >>$TMPSCRIPT
AllowWSntpSync $OUTDEV ${LOCALWS[$wszahler]} $ACCEPTRULE
fi
if [ "${ALLOWNETBIOS[$wszahler]}" = "yes" ]; then
echo "#netbios fuer ${LOCALWS[$wszahler]}" >>$TMPSCRIPT
AllowNetBios $OUTDEV ${LOCALWS[$wszahler]} $ACCEPTRULE
fi
evaluate_retval
(( wszahler = $wszahler + 1 ))
done
netzahler=0
while [ "${ROUTEDBGNETWORK[$netzahler]}" ]; do
echo "Internet Access for ${ROUTEDBGNETWORK[$netzahler]}"
echo "UDPPORTS: ${BGNETUDP[$netzahler]}"
echo -n "RCPPORTS: ${BGNETTCP[$netzahler]}"
echo "#Internet Access for ${ROUTEDBGNETWORK[$netzahler]}" >>$TMPSCRIPT
AllowRouteNetOut ${ROUTEDBGNETWORK[$netzahler]} \
$OUTDEV \
"${BGNETUDP[$netzahler]}" \
"${BGNETTCP[$netzahler]}" \
$ACCEPTRULE
evaluate_retval
if [ ${ROUTEDBGNETSW[$netzahler]} == "yes" ]; then
echo "Allowing Port Switch for ${ROUTEDBGNETWORK[$netzahler]}"
echo "#Allowing Port Switch for ${ROUTEDBGNETWORK[$netzahler]}" >>$TMPSCRIPT
AllowRouteNetSwitch ${ROUTEDBGNETWORK[$netzahler]} $OUTDEV tcp $ACCEPTRULE
AllowRouteNetSwitch ${ROUTEDBGNETWORK[$netzahler]} $OUTDEV udp $ACCEPTRULE
fi
if [ ${ROUTEDBGNETNTP[$netzahler]} == "yes" ]; then
echo "Allowing NTP for ${ROUTEDBGNETWORK[$netzahler]}"
echo "#Allowing NTP for ${ROUTEDBGNETWORK[$netzahler]}" >>$TMPSCRIPT
AllowRouteNetNTP ${ROUTEDBGNETWORK[$netzahler]} $OUTDEV $ACCEPTRULE
fi
(( netzahler = $netzahler + 1 ))
done
if [ "$EXTUDPOPEN" ] || [ "$EXTTCPOPTEN"]; then
echo "Allow External Access"
echo "for UDP: $EXTUDPOPEN"
echo -n "for TCP: $EXTTCPOPEN"
echo "#Allow External Access" >>$TMPSCRIPT
ExternAllowPortIn "$EXTUDPOPEN" "$EXTTCPOPEN" $OUTDEVICE $ACCEPTRULE
evaluate_retval
fi
for i in $ALLOWDEVICESWPORT; do
echo -n "Allowing Portswitch on device $i"
echo "#Allowing Portswitch on device $i" >>$TMPSCRIPT
AllowLocalSwitchPort tcp $i $ACCEPTRULE
AllowLocalSwitchPort udp $i $ACCEPTRULE
evaluate_retval
done
if [ "$LOCALUSEUDP" ] || [ "$LOCALUSETCP" ]; then
echo "Allow Local Internet Access"
echo "for UDP: $LOCALUSEUDP"
echo -n "for TCP: $LOCALUSETCP"
echo "#Allow Local Internet Access" >>$TMPSCRIPT
ExternAllowPortOut "$LOCALUSEUDP" "$LOCALUSETCP" $OUTDEVICE $ACCEPTRULE
evaluate_retval
fi
if [ "$NTPSYNC" = "yes" ]; then
echo -n "Allow NTP Time Sync"
echo "#Allow NTP Time Sync" >>$TMPSCRIPT
LocalAllowntpSync $OUTDEV $ACCEPTRULE
evaluate_retval
fi
for i in $LOCSYSLOG; do
echo -n "Allowing remote syslog for $i"
echo "#Allowing remote syslog for $i" >>$TMPSCRIPT
ExternAllowSyslog $i $ACCEPTRULE
evaluate_retval
done
if [ "$USESYSLOG" ]; then
echo -n "Allowing use of $USESYSLOG for syslog"
echo "#Allowing use of $USESYSLOG for syslog" >>$TMPSCRIPT
LocalAllowSyslog $USESYSLOG $ACCEPTRULE
evaluate_retval
fi
if [ "$MARK" = "yes" ]; then
echo -n "Setting mark $MARKVALUE for Net $MARKNET"
echo "#Setting mark $MARKVALUE for Net $MARKNET" >>$TMPSCRIPT
InternMarkNet $MARKNET $MARKVALUE
evaluate_retval
fi
y=0
while [ "${FORWARDSRV[$y]}" ]; do
echo "Forwarding to ${FORWARDSRV[$y]}"
echo "UDP Ports: ${FORWDUDP[$y]}"
echo "TCP Ports: ${FORWDTCP[$y]}"
echo "#Forwarding to ${FORWARDSRV[$y]}" >>$TMPSCRIPT
ExtForwardPorts ${FORWARDSRV[$y]} \
"${FORWDUDP[$y]}" \
"${FORWDTCP[$y]}" \
$OUTDEVICE
evaluate_retval
(( y++ ))
done
y=0
while [ "${DSTSERVER[$y]}" ]; do
for x in ${FWDSERVICE[$y]}; do
SPORT=`echo $x|cut -d";" -f 1`
PROT=`echo $x|cut -d";" -f 2`
DPORT=`echo $x|cut -d";" -f 3`
ExtForwardPort ${DSTSERVER[$y]} \
$PROT \
$SPORT \
$DPORT \
$OUTDEVICE
done
(( y++ ))
done
if [ "$DHCPSERVER" ]; then
AllowDHCPRelay $DHCPSERVER
fi
echo -n "Closing all returned open ports"
echo "#Closing all returned open ports" >>$TMPSCRIPT
CloseLast $REJECTRULE
evaluate_retval
echo -n "Stopping Firewall"
$0 stop
evaluate_retval
echo -n "Applying new config to firewall"
$DEBUG $TMPSCRIPT
evaluate_retval
rm $TMPSCRIPT
echo -n "Saving Firewall rules table"
$DEBUG iptables-save >/var/state/iptables.state
evaluate_retval
;;
stop)
for i in INPUT FORWARD OUTPUT; do
$DEBUG $IPTABLES -F $i
$DEBUG $IPTABLES -P $i ACCEPT
done
if [ "$ACCOUNTING" == "yes" ]; then
$DEBUG $IPTABLES -F account-log
$DEBUG $IPTABLES -X account-log
fi
if [ "$LOG_REJECTED" = "yes" ]; then
$DEBUG $IPTABLES -F reject-log
$DEBUG $IPTABLES -X reject-log
fi
if [ "$ICMP" == "yes" ]; then
$DEBUG $IPTABLES -F icmp-rules
$DEBUG $IPTABLES -X icmp-rules
fi
if [ "$MASQ" == "yes" ] || [ "$FORWARDSRV[0]" ]; then
$DEBUG $IPTABLES -t nat -F
fi
if [ "$MARK" = "yes" ]; then
$DEBUG $IPTABLES -t mangle -F
fi
;;
deny)
if [ ! "$2" ]; then
echo "Need a Workstation to lock"
exit 1
fi
wszahler=0
WSIP=`nslookup $2|tail -n 2|head -n 1|awk '{print $2}'`
while [ "${LOCALWS[$wszahler]}" ]; do
if [ "${LOCALWS[$wszahler]}" == "$WSIP" ]; then
for k in ${ROUTEPORTS[$wszahler]}; do
echo -n " $k"
FW_PORT=`echo $k|cut -f 1 -d ";"`
FW_PROT=`echo $k|cut -f 2 -d ";"`
ChangeWSOutRule ${LOCALWS[$wszahler]}\
$FW_PORT $FW_PROT DROP
done
evaluate_retval
fi
(( wszahler = $wszahler + 1 ))
done
;;
allow)
if [ ! "$2" ]; then
echo "Need a Workstation to lock"
exit 1
fi
wszahler=0
WSIP=`nslookup $2|tail -n 2|head -n 1|awk '{print $2}'`
while [ "${LOCALWS[$wszahler]}" ]; do
if [ "${LOCALWS[$wszahler]}" == "$WSIP" ]; then
for k in ${ROUTEPORTS[$wszahler]}; do
echo -n " $k"
FW_PORT=`echo $k|cut -f 1 -d ";"`
FW_PROT=`echo $k|cut -f 2 -d ";"`
ChangeWSOutRule ${LOCALWS[$wszahler]}\
$FW_PORT $FW_PROT ACCEPT
done
evaluate_retval
fi
(( wszahler = $wszahler + 1 ))
done
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac
fi