#!/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