Viitor_iptables/etc/init.d/firewall
kueller 8e418df566 Merge mit V962 Tree
git-svn-id: svn://svn.compuextreme.de/Viitor/V963/Viitor_iptables@5984 504e572c-2e33-0410-9681-be2bf7408885
2011-02-18 10:37:51 +00:00

466 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
y=0
while [ ${INSERVER[$y]} ]; do
echo "Allow Access to Intranet Service ${INSERVER[$y]}"
IP=`echo ${INSERVER[$y]}|awk -F":" '{print $1}'`
PORT=`echo ${INSERVER[$y]}|awk -F":" '{print $2}'`
PROT=`echo ${INSERVER[$y]}|awk -F":" '{print $3}'`
AllowIntranetService ${IP} \
${PORT} \
${PROT}
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 filter nat mangle raw; do
$DEBUG $IPTABLES -t $i -F
$DEBUG $IPTABLES -t $i -X
done
for i in INPUT FORWARD OUTPUT; do
$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