Init-Skript für Masquerading, Firewall und Routing

Das maske-Skript lässt sich mit den Optionen start, stop, restart, status und show bedienen.

Das Skript muss noch angepasst werden, eine Konfigurationsdatei /etc/maske.conf erstellt werden und in das System integriert werden (siehe Beschreibung im Skript).

Evtl. müssen auch die Pfade zu modprobe und iptables geändert werden.

maske ist ein SuSE-Skript, dass sich automatisch mit insserv als Initskript in das System integriert. Im Skript ist erklärt wie der Gateway und die PC-Klienten konfiguriert werden. Für Debian und RedHat ist die Konfiguration ebenfalls im Skript beschrieben.

Es stellt schon vorkonfigurierte Ketten bereit, um Ports aus dem Internet erreichbar zu machen (ftp, ssh, eDonkey, IRC ...) ohne die Verbindung vorher anzufordern (z.B. durch eMail abrufen oder Surfen). Es müssen nur die entsprechenden Kommentarzeichen (#) entfernt werden. Wird dies nicht gemacht ist der Computer vom Internet nicht angreifbar , aber das soll ja auch so sein. (auser vieleicht bei DoS sensieblen Anwendungen, wass Paranoiker duch auskommetieren der entsprechenden Zeile beheben) B)

Jeder Verbindungsversuch aus dem Lokalen Netz wird mit Erfolg gekrönt sein! Sollen keine Verbindungen aus dem Internet aufgebaut werden können, muss nichts an den Regelketten von iptables geändert werden.

Um das Firewallskript herunter zu laden, klicke hier.

Ich habe diese Firewall nur mit meinen 2 Computern getestet, ich übernehme deshalb keinerlei Haftung auf Funktion und Sicherheit!

In meinem Netzwerk funktioniert maske aber hervorragend. ;) --- UliBaur

#
# /etc/init.d/maske
#
#   und seine symbolische Verknüpfung
#
# /sbin/rcmaske
#
# System start Skript für Masquerading, Firewall und Routing
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# Anforderungen:
# - Ein Linux 2.4.x Kernel (http://www.kernel.org)
# - Iptables 1.2.x Userspace tools (http://netfilter.samba.org)
# - Eine SuSE-Distribution, andernfalls musst Du dies Datei noch weiter editieren
#   (Kommentarzeichen (#) vor '. /etc/rc.config', '. /etc/rc.status',  'rc_reset'
#    und 'rc_status -v -r' setzen, sowie bei den 4 Zeilen:
#    #if [ $? != 0 ] ; then echo -e "\033[31;1mfailed\033[m" ; else echo -e "\033[32;1mdone\033[m"; fi
#    entfernen).
#
# Den Gateway-Computer konfigurieren:
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# Diese Datei muss editiert werden, besonders die Zeilen die Nezwerkschnitstellen
# enthalten (eth0, ppp0 etc. [eth+ -> + steht für alle Netzwerkkarten
# {eth0, eth1, eth2, eth3...}])
#
# Soll auch IRC möglich sein müssen die Kommentarzeichen (#) vor den Zeilen
# '$MODPROBE ip_nat_irc'
# '$MODPROBE ip_conntrack_irc' entfernt werden.
#
# Kopiere maske nach /etc/init.d/maske bzw. /etc/rc.d/maske.
# Führe "chmod 744 /etc/init.d/maske"
# und "ln -s /etc/init.d/maske /sbin/rcmaske" aus.
#
# Erstelle /etc/maske.conf:  <== "WICHTIG"
# Beispiel:
# Maske beim Systemstart laden:
# # echo 'START_MASKE="yes"' >> /etc/maske.conf
# Netzwerkschnitstelle zum Internet:
# # echo 'FW_DEV="ippp+"' >> /etc/maske.conf
# Netzwerkschnitstelle zum LAN:
# # echo 'LOCAL_DEV="eth0"' >> /etc/maske.conf
#
# Setze IP_FORWARD in /etc/rc.config auf "yes" und starte 'SuSEconfig --quick' (SuSE)!!
# oder setze FORWARD_IPV4=true in /etc/sysconfig/network (RedHat)!!
# Alternativ kann das Kommentarzeichen vor den 2 Zeilen die
# 'echo # > /proc/sys/net/ipv4/ip_forward' enthalten entfernt werden (# steht für 1 bzw. 0).
#
# Um maske beim Booten zu aktivieren führe in einem SuSE-System
# "insserv maske" aus.
# Um dies wieder ab zu stellen:
# "insserv -r maske"
#   [insserv enables an installed system init script (`boot script')
#   by reading the comment header of the script and set the links to
#   the appropriat runlevels (hier 3 4 5)]
# In Debian, versuche "update-rc.d maske defaults",
# in Redhat, versuche "chkconfig --add maske --level 2345" um die notwendigen
# symbolische Links zu erstellen.
# Von Hand geht es zum Beispiel so:
#       rm -f /etc/init.d/rc3.d/S??maske
#       ln -s /etc/init.d/maske /etc/init.d/rc3.d/S04maske
#       rm -f /etc/init.d/rc3.d/K??maske
#       ln -s /etc/init.d/maske /etc/init.d/rc3.d/K20maske
#       rm -f /etc/init.d/rc5.d/S??maske
#       ln -s /etc/init.d/maske /etc/init.d/rc5.d/S04maske
#       rm -f /etc/init.d/rc5.d/K??maske
#       ln -s /etc/init.d/maske /etc/init.d/rc5.d/K20maske
#
# Mit "rcmaske start" startet der Spaß.
#
# Weitere Optionen sind "stop, restart, status" und "show" womit die aktuellen
# Regeln in der Filtertabelle angezeigt werden (mit less?).
#
# Die PCs im Netzwerk konfigurieren:
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# Alle PC's im privaten Netzwerk sollten ihren "Gateway" auf die lokale private
# Netzwerk-IP des Linux-Gateway-Computer setzen (der auf dem maske läuft).
# Die "Domain Name System" (DNS) Adresse sollte der des InternetServiceProviders
# (ISP) sein.
# Die weitere Konfiguration setzt eine installierte und konfigurierte
# Netzwerk-Interface Steuereinheit (NIC = Netzwerkkarte) voraus:
# *  Windows '9x Konfiguration:
#  - Select "Start" + Settings" + "Control Panel"
#  - Select the "Network" icon
#  - Select the tab "Configuration" and double click the component "TCP/IP"
#    for the ethernet card. (NOT the TCP/IP -> Dial-Up Adapter)
#  - Select the tabs:
#       + "Gateway": Use the internal network IP address of the Linux box.
#         (192.168.XXX.XXX)
#       + "DNS Configuration": Use the IP addresses of the ISP
#         Domain Name Servers. (Actual internet IP address)
#       + "IP Address": The IP address (192.168.XXX.XXX - static) and netmask
#         (typically 255.255.255.0 for a small local office network) of the PC
#         can also be set here.
# *  Linux Computer:
#  - IP Adresse: Benutze ifconfig oder netcfg Kommandos um die IP-Adresse und
#    Netzwerkmaske (netmask) einzustellen, oder das entsprechende Programm Deiner
#    Distribution.
#  - Gateway: Der Gateway wird mit dem route Kommando gesetzt. Hierfür eignen sich
#    auch die GUI-Tools der Distribution (/usr/bin/netcfg etc. oder für die
#    Konsole /usr/sbin/netconfig und natürlich YaST von SuSE).
#    Er wird auch in /etc/sysconfig/network bzw. /etc/route.conf gespeichert.
#    Um zu kontrollieren ob der Gateway richtig gesetzt ist, gib 'route -n' ein:
#            # /sbin/route -n
#            # Kernel IP Routentabelle
#            # Ziel          Router       Genmask        Flags Metric Ref  Use Iface
#            # 192.168.1.0   0.0.0.0      255.255.255.0  U     0      0      0 eth0
# Gateway -> # 0.0.0.0       192.168.1.1  0.0.0.0        UG    0      0      0 eth0
#  - DNS: Konfiguriere /etc/resolv.conf um die DNS und Default-Domain einzustellen.
#    Hierfür eignen sich natürlich auch das entsprechende Programm Deiner
#    Distribution
#
# Hope that's all ;-)

### BEGIN INIT INFO
# Provides: maske
# Required-Start: $network
# Required-Stop:
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Description:  Start simple Firewall-Skript
### END INIT INFO

# Die config einlesen
. /etc/rc.config        # SuSE config
. /etc/maske.conf       # zusätzliche config s.o. "Den Gateway-Computer konfigurieren"

# Feststellen des Runlevels und folgen eines Runlevel-Linknamen.
base=${0##*/}
link=${base#*[SK][0-9][0-9]}

# Erzwinge das Ausführen auch wenn es nicht durch einen Runlevel gesteuert ist.
test $link = $base && START_MASKE=yes
test "$START_MASKE" = yes || exit 0

IPTABLES=/usr/sbin/iptables
MODPROBE=/sbin/modprobe

test -x $IPTABLES || exit 5
test -x $MODPROBE || exit 5

# SuSE-status für Meldungen einlesen:
. /etc/rc.status
rc_reset

# "gefälschte" IP-Adressen verhindern:
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
  echo 1 > $f
done

# Interface das an das Internet angeschlossen ist (ppp# = modem, ippp# = isdn):
[ $FW_DEV ] || FW_DEV="ppp+"
# Interface an das den PC mit dem LAN verbindet:
[ $LOCAL_DEV ] || LOCAL_DEV="eth+"

case "$1" in
        start)
        echo -n "Starting Maske Firewall Skript   "
        $MODPROBE iptable_nat
        $MODPROBE ip_nat_ftp
        # $MODPROBE ip_nat_irc
        $MODPROBE ip_conntrack
        $MODPROBE ip_conntrack_ftp
        # $MODPROBE ip_conntrack_irc
        # löschen aller bereits definierten Regeln (flush)
        $IPTABLES -F
        $IPTABLES -t nat -F
        # löschen aller bereits definierten Ketten
        $IPTABLES -X
        $IPTABLES -t nat -X
        # Maskarade:
        $IPTABLES -t nat -A POSTROUTING -o $FW_DEV -j MASQUERADE
        $IPTABLES -t nat -A POSTROUTING -o $LOCAL_DEV -j MASQUERADE
        # Weiterleiten der Pakete
        $IPTABLES -A FORWARD -j ACCEPT
# => Ab hier wird gemauert:
        # Verwerfe alle Verbindungsversuche
        $IPTABLES -P INPUT DROP
        # und erlaube unten definierte Verbindungen.
        # icmp-Pakete (z.B. ping) generell zulassen - vermindert log-messages
        $IPTABLES -A INPUT -p icmp -j ACCEPT # (nur für NICHT-DoS-gefährdete Anwendung)
        # Erlaube loopback (für ISO-Imagemounts & Selbstgespräche)
        $IPTABLES -A INPUT -i lo -p all -j ACCEPT
        $IPTABLES -A OUTPUT -o lo -p all -j ACCEPT
        # Pakete, die zu bereits bestehenden Verbindungen gehören (oder damit zusammenhängen) erlauben
        $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        $IPTABLES -A INPUT -p tcp --tcp-option ! 2 -j REJECT --reject-with tcp-reset
        # Neue Verbindungen nur dann erlauben, wenn sie NICHT über das externe Interface reinkommen
        $IPTABLES -A INPUT -m state --state NEW -i ! $FW_DEV -j ACCEPT
        # Mit den Zeilen:
        # '$IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p [tcp/udp] --dport [Portnummer] -j ACCEPT'
        # kann man die einzelnen Ports freischalten, die benötigt werden um auch
        # aus dem Internet erreichbar zu sein!
        # In '/etc/services' stehen die notwendigen Infos zu den Ports (s.a. man services).
        # Öffne ftp port:
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p tcp --dport 21 -j ACCEPT
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p udp --dport 21 -j ACCEPT
        # Öffne secure shell (ssh) port (für Fernwartung vom Internet aus):
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p tcp --dport 22 -j ACCEPT
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p udp --dport 22 -j ACCEPT
        # Simple Mail Transfer (smtp) erlauben
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p tcp --dport 25 -j ACCEPT
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p udp --dport 25 -j ACCEPT
        # Öffne HTTP port (z.B.: für Apache):
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p tcp --dport 80 -j ACCEPT
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p udp --dport 80 -j ACCEPT
        # Internet Message Access Protocol (imap) erlauben
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p tcp --dport 143 -j ACCEPT
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p udp --dport 143 -j ACCEPT
        # Öffne IPP für Cups:
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p tcp --dport 631 -j ACCEPT
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p udp --dport 631 -j ACCEPT
        # Für die Freigabe von KDE-Ordnern:
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p tcp --dport 8001 -j ACCEPT
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p udp --dport 8001 -j ACCEPT
        # Für die eDonkey-Eselei
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p tcp --dport 4662 -j ACCEPT
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p udp --dport 4662 -j ACCEPT
        # und für das Gnutella-Netzwerk
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p tcp --dport 6346 -j ACCEPT
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p udp --dport 6346 -j ACCEPT
        # AIM AOL-Chat:
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p tcp --dport 5190 -j ACCEPT
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p udp --dport 5190 -j ACCEPT
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p tcp --dport 9898 -j ACCEPT
#       $IPTABLES -A INPUT -m state --state NEW -i $FW_DEV -p udp --dport 9898 -j ACCEPT
        # Akzeptiere die locale Samba Verbindungen:
#       #$IPTABLES -A INPUT -p tcp --syn -s 192.168.11.0/24 --dport 139 -j ACCEPT
        # unerwünschte Pakete in's Log schreiben (max. aber 1 Eintrag pro Sekunde, um DoS zu verhindern)
        $IPTABLES -A INPUT -i $FW_DEV -m limit --limit 1/second -j LOG --log-prefix "MASKE_DROP from $FW_DEV: "
        $IPTABLES -A INPUT -i ! $FW_DEV -m limit --limit 1/second -j LOG --log-prefix "MASKE_DROP not from $FW_DEV: "
# => Ende der Mauer
        # Merke Status und sei Informativ
        rc_status -v -r
        #if [ $? != 0 ] ; then echo -e "\033[31;1mfailed\033[m" ; else echo -e "\033[32;1mdone\033[m"; fi
        touch /var/lock/maske
        # Alternetives IP_FORWARD setzen:
        # echo 1 > /proc/sys/net/ipv4/ip_forward
        ;;
        stop)
                echo -n "Shutting down Maske Firewall Skript   "
                $IPTABLES -F
                $IPTABLES -t nat -F
                $IPTABLES -X
                $IPTABLES -t nat -X
                $IPTABLES -P INPUT ACCEPT
                # Merke Status und sei Informativ
                rc_status -v -r
                #if [ $? != 0 ] ; then echo -e "\033[31;1mfailed\033[m" ; else echo -e "\033[32;1mdone\033[m"; fi
                rm -f /var/lock/maske
                # Alternetives IP_FORWARD entfernen:
                # echo 0 > /proc/sys/net/ipv4/ip_forward
                ;;
        restart)
                echo "Restarting Maske Firewall Skript:   "
                $0 stop && $0 start
                rc_status -v -r
                #if [ $? != 0 ] ; then echo -e "\033[31;1mfailed\033[m" ; else echo -e "\033[32;1mdone\033[m"; fi
                ;;
        status)
                echo -n "Maske Firewall Skript for kernel: $(uname -srm) is:   "
                $(test -f /var/lock/maske || exit 3)
                rc_status -v -r
                #if [ $? != 0 ] ; then echo -e "\033[31;1munused\033[m" ; else echo -e "\033[32;1mrunning\033[m"; fi
                ;;
        show)
                $IPTABLES -L --line -nv # | less
                $0 status
                ;;
        *)
                echo "Usage: $0 {start|stop|restart|status|show}"
                exit 1
                ;;

esac
rc_exit

Für Anmerkungen zum Skript bin ich immer dankbar!

Sollte das maske-Skript ÄRGER machen, schreibe hier doch einen Erfahrungsbericht:

Anmerkung für Didemann: Wenn Du mit deinem Hub auch Verbindung zu den anderen PCs aufnehmen möchtest musst Du noch diese Zeile:

in dem Abschnitt unter # => Ab hier wird gemauert: einfügen :) Wobei LANIP Broadcast/Metmask (Bsp.: 192.168.1.0/255.255.255.0) ist!

PaketFilter/MaskeFirewall (zuletzt geändert am 2007-12-23 22:45:15 durch localhost)