Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

iptables portforwarding problem

Alles rund um das Internet, Internet-Anwendungen (E-Mail, Surfen, Cloud usw.) und das Einrichten von Netzwerken einschl. VPN unter Linux

Moderator: Moderatoren

Antworten
oliver123
Newbie
Newbie
Beiträge: 6
Registriert: 9. Dez 2004, 10:55

iptables portforwarding problem

Beitrag von oliver123 »

Hallo!
Ich habe einen Linux-Rechner (mit IP 192.168.1.1) als Firewall/Router mit IPTables aufgesetzt, dahinter mein Netzwerk. eth1 am Internet, et0 am internen Netz.

Auf dem Linux-Rechner ist VMWare installiert. Darin läuft ein zweites Linux, (das als Webserver fungieren soll), so konfiguriert, dass ich es direkt mit 192.168.1.200 ansprechen kann.
So weit so gut, funktioniert prima.

Allerdings weiß ich nicht, wie ich es anstellen soll, dass die Pakete, die am Linux-Rechner auf eth1, port 25,80 eintreffen geforwardet werden an 192.168.1.200 und dieser Virtuelle-Webserver hinaus ins Internet antworten kann.

Meine bisherigen, vermutlich konfusen Versuche dafür:
iptables -N block
iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A block -m state --state NEW -i ! eth1 -j ACCEPT
iptables -A block -j REJECT --reject-with icmp-net-unreachable
iptables -A INPUT -j block
iptables -A FORWARD -j ACCEPT

# Enable Masquerading...
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

# Forwarding, Answering...
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.1.200
iptables -A FORWARD -o eth1 -s 192.168.1.200 -p tcp -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp -d 192.168.1.200 --dport 80 -j ACCEPT

Ich bin alles andere als ein Linux-Crack, ich hab mir das Script zusammengestückelt als HowTo's und Ähnlichem.

Weiß jemand eine Lösung für mein Problem?
Benutzeravatar
ThomasF
Hacker
Hacker
Beiträge: 578
Registriert: 1. Mai 2004, 12:37
Wohnort: Köln

Beitrag von ThomasF »

Hmm,

es gibt viel gute Doku zu iptables ...

Versuch doch mal mit dem fwbuilder ...

http://www.fwbuilder.org/

so long

ThomasF
______________________

Ich bin /root, ich darf das !
gaw
Hacker
Hacker
Beiträge: 464
Registriert: 28. Sep 2004, 16:33

Beitrag von gaw »

Konfus ist das richtige Wort.


1) Warum auf einem Router ind einer Firewall VM und ein Apache laufen soll erscheint an sich schon recht konfus. Das ganze dann aber noch mit unter einem virtuellen Linux in VM zu implementieren verstehe wer will. Was willst du damit erreichen, einen Preis für die umständlichste Konfiguration erringen? Je komplexer die Situation auf dem Router/Firewall, desto fehleranfälliger wird das ganze. Und desto höher steigt die Chance dass kompromittierbare Routinen Angreifern Hintertüren öffnen. Web- und Sambaserver haben auf einer Firewall eigentlich nichts zu suchen. Wenn ich das jetzt richtig verstanden habe sind eth0 und eth1 nur virtuelle Schnittstellen im VM oder wie?




2) Was die iptables Regeln betreffen, so solltest du die Grundlagen verstehen lernen. Es nutzt nichts eine eigene Kette "block" zu bauen und dann alle Forwarding Pakete daran vorbeirauschen zu lassen.

3) Warum ankommende Pakete auf dem Port 25 auf den virtuellen Rechner gelenkt werden soll, ist mir ganz unklar, willst du dem Internet einen Mailserver spendieren oder warum?

4) Drittens fehlt neben dem Masquerading auch die Erlaubnis dynamische Adressen zu benutzen.

echo "1" > /proc/sys/net/ipv4/ip_dynaddr

5) Was sollen die Kombination diieser Regeln?
iptables -A FORWARD -j ACCEPT
iptables -A FORWARD -o eth1 -s 192.168.1.200 -p tcp -j ACCEPT

Willst du nun alles im Forwarding erlauben? Die zweite Regel kommt nie zur Anwendung weil die Pakete schon vorher akzeptiert werden.


Wenn du dein Szenario aufsetzt um mit iptables die ersten Schritte zu trainieren oder das mal auszutesten ist das es sicher nicht der günstigste Weg mit einer unnötig komplexen Ausgangssituation zu beginnen. Dazu solltest du ein Linux auf dem Router aufsetzen und dort nur Paketfilter, Routing Proxies und Redirectoren bzw, Filterprogramme laufen lassen. Dafür würde ich dann auch nicht die leistungsfähigste Maschine mit VM-Ware nehmen auf dem du arbeitest. Ein etwas älterer Rechner kann das ebensogut und reicht, bei Verzicht auf einem Squid tut's selbst ein alter Pentium 1 oder ein 486. Selbst mit DSL arbeitet das Internet um Größenordungen langsamer als ein Fastethernet oder die Hardware eines Rechners. Bei Verwendung eines squid ist etwas mehr Hauptspeicher sinnvoll, besonders wenn gleich 20 oder 30 Clients dahinterhängen.

Der Rechner mit VM-Ware+virtuellen Linux+Webserver etc. gehört aber auf jeden Fall hinter (Vom Internet aus betrachtet) dem Router bzw. die Firewall und nicht auf den gleichen Rechner.

Es gibt im O'Reilly Verlag ein open book über Firewalls, das du dir kostenlos als LaTeX-Variante herunterziehen kannst. Vielleicht solltest du das lesen.

mfG
gaw
Zuletzt geändert von gaw am 9. Dez 2004, 12:37, insgesamt 1-mal geändert.
oliver123
Newbie
Newbie
Beiträge: 6
Registriert: 9. Dez 2004, 10:55

Beitrag von oliver123 »

----
gaw
Hacker
Hacker
Beiträge: 464
Registriert: 28. Sep 2004, 16:33

Beitrag von gaw »

Mit codeschnippseln ist das nicht getan. Es kommt auf das Design der Firewall an. Das dümmste was man machen kann sind Codeschnipsel aus verschiedenen Firewallkonzepten miteinander zu mischen. Das wird höchstwahrscheinlich nicht funktionieren.

Besser du nimmst ein Script und passt dies deinen Bedingungen an.


mfG
gaw
oliver123
Newbie
Newbie
Beiträge: 6
Registriert: 9. Dez 2004, 10:55

Beitrag von oliver123 »

Wie gesagt, ich bin kein Computer-Experte und komme auch nicht aus dieser Sparte.

Die beschriebene Lösung soll für mich privat zum Einsatz kommen, ich hab auch nicht die finanziellen Mittel mir jetzt noch einen Computer anzuschaffen und den hinter die Firewall zu hängen, darum die Lösung mit VMWare... Das virtuelle Linux soll einen Mail- und einen Webserver bereitstellen.
Mit der Lösung mittels VMWare möchte ich jederzeit die Möglichkeit haben das Virtuelle Linux in einen früheren Zustand zu versetzen.
Nur soviel zu meinen Intentionen.

eth1 (Internet) und eth0 (192.168.1.1) sind echte Schnittstellen am Linux-Rechner. am virtuellen Linux-Rechner ist eine eth0 Schnittstelle vorhanden, mit der internen IP 192.168.1.200.
Wie gesagt. das funktioniert bereits.

Es dürfte doch generell keinen Unterschied machen ob der Apache auf einem eigenen PC oder einer virtuellen Maschine läuft?

Ich habe leider, auch wenn es sehr interessant ist, nicht die Zeit mich intensiv mit Linux auseinanderzusetzen. Mir wachsen jetzt schon graue Haare bei diesem (vermutlich) kleinen Problem.
Solltest Du ein Profi sein und einem Neuling helfen wollten wäre ich sehr dankbar, falls Du mir die richtigen Code-Zeilen posten könntest.
gaw
Hacker
Hacker
Beiträge: 464
Registriert: 28. Sep 2004, 16:33

Beitrag von gaw »

Ein iptables Skript kann mehrere hundert Zeilen lang sein, je nachdem wie komplex die Regeln sind.

Hier ist eine etwas abgespeckte Firewall so wie ich sie selbst einsetze. Lokale Prozesse auf der Firewall sind freigegeben. Den Clients ist serven über http, onlinebanking über https. abholen und versenden von emails über smtp und pop3 gestattet. Auch dns ist freigeschaltet so dass die Namesauflösung zu deinem ISP klappen müsste. Vom internen Netz ist ein ssh-Zugriff erlaubt. Eine eigene Regelkette TRASH erlaubt das Loggen der Pakete. Du kannst mit tail -f /var/log/messages in einem Terminal mitverfolgen welche Pakete die Firewall verwirft, bis auf die Pakete die im Logginabschnitt ausgeschaltet werden, die muss man aber auch nicht loggen, sie füllen nur die logfiles.

Ich habe nun die Regeln implementiert das der Zugriff auf deinem Rechner über dynddns o.ä. auf den Rechner umgeleitet werden und solche Anfragen akzeptiert werden.

Code: Alles auswählen


#!/bin/bash
#############  Firewallskript für einen Linux Router
# copyright (c) gaw
# Autor: gaw
# Oktober 2004

############# Initialisierung der Variablen

############# Interfaces 
INTERFACE_EXT="ppp0"
INTERFACE_INT="eth0"   
INTERFACES="$INTERFACE_EXT $INTERFACE_INT"
$ROUTER_IP="192.168.1.1" 
$WEB_SERVER_IP="192.168.1.200"
$LOCAL_NET_IP="192.168.1.0/24"

############# Portnummern
PORTS_HIGH="1024:65535"
# Bei mir stehen noch ein paar mehr;)

############# Programm
IPTABLES="/usr/sbin/iptables"



############# Grundkonfiguration

############# Vorläufiges Ausschalten des IP Forwarding. 
echo "0" > /proc/sys/net/ipv4/ip_forward

############# TCP-Syncookies, Abwehrmaßnahme gegen das SYN Flooding.
echo "1" > /proc/sys/net/ipv4/tcp_syncookies

############# Ignorieren von Echoauforderungen von icmp
############# Abwehrmaßnahme gegen Broadcast-Stürme
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

############# Das Loggen ungültiger ICMP-Pakete wird ausgeschaltet,
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

############# Schleife für alle Schnittstellen in $INTERFACES
for if in $INTERFACES;
do

        ##### IP-Spoof Protection
        echo "1" > /proc/sys/net/ipv4/conf/$if/rp_filter

        ##### Keine Redirections
        echo "0" > /proc/sys/net/ipv4/conf/$if/accept_redirects

        ##### Kein Source-Routing
        echo "0" > /proc/sys/net/ipv4/conf/$if/accept_source_route

        ##### Kein Bootstrap Protokoll
        echo "0" > /proc/sys/net/ipv4/conf/$if/bootp_relay

        ##### Ungültige IP-Pakete werden geloggt.
        echo "1" > /proc/sys/net/ipv4/conf/$if/log_martians
done
echo "Dynamische Kernelparameter gesetzt"

############ Alle Pakete der Grundeinstellung werden verworfen

$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP

############ Alle eventuell noch vorhandenen Regeln werden gelöscht

############ Lösche alle Regeln aus der Filter Tabelle
$IPTABLES -F

############ Lösche aller Regeln aus der NAT Tabelle
$IPTABLES -t nat -F

############ Lösche alle selbstdefinierten Regeln
$IPTABLES -X

echo "Alles verboten und alle Regeln gelöscht"

############ Selbstdefinierte Regelkette zum Loggen wird erstellt

$IPTABLES -N TRASH

# Hier folgen Regeln für Pakete die nicht geloggt werden sollen als 
# Schutz gegen ein Überquellen der Logdateien
$IPTABLES -A TRASH -p UDP --dport 123 -j DROP
# IPP-Anfragen zur Druckereinstellungen müssen nicht geloggt werden
$IPTABLES -A TRASH -p UDP -s 192.168.0.1 --dport 631 -j DROP
$IPTABLES -A TRASH -p UDP --dport $NETBIOS_PORTS -j DROP
$IPTABLES -A TRASH -p TCP --dport $NETBIOS_PORTS -j DROP
$IPTABLES -A TRASH -p TCP --dport 445 -j DROP
$IPTABLES -A TRASH -p TCP --dport 135 -j DROP

# Diese Pakete sollen geloggt werden
$IPTABLES -A TRASH -p ICMP -j LOG --log-prefix "Abgelehnte-ICMP-Pakete "
$IPTABLES -A TRASH -p UDP  -j LOG --log-prefix "Abgelehnte-UDP-Pakete "
$IPTABLES -A TRASH -p TCP  -j LOG --log-prefix "Abgelehnte-TCP-Pakete "
$IPTABLES -A TRASH -j DROP

echo "Loggin eingeschaltet"


############ Bis hier ist alles verboten. Nun werden bestimmte
############ Pakete wieder akzeptiert

############ Lokale Prozesse auf dem Rechner akzeptieren ###############
$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A INPUT  -i lo -j ACCEPT

echo "Lokale Prozesse erlaubt"
############ SSH Verbindungen vom internen Netz erlauben

$IPTABLES -A INPUT -i $INTERFACE_INT -s $LOCAL_NET -d $ROUTER_IP \
          -p TCP --sport $PORTS_HIGH --dport ssh \
          -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


$IPTABLES -A OUTPUT -o $INTERFACE_INT -s $ROUTER_IP -d $LOCAL_NET \
          -p TCP --dport $PORTS_HIGH --sport ssh \
          -m state --state ESTABLISHED,RELATED -j ACCEPT

echo "ssh vom LAN auf den Router erlaubt"

########### Masquarading einschalten 


$IPTABLES -t nat -A POSTROUTING -o $INTERFACE_EXT -j MASQUERADE

########### IP-Forwarding und DNAT einschalten 
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

echo "Masquerading eingeschaltet"

########### Web-Anfragen werden auf internen Webserver umgelenkt

$IPTABLES -A PREROUTING -t nat -p tcp --dport $HTTP_PORT -i ppp0 \
        -j DNAT --to-destination $WEB_SERVER_IP

echo "DNAT für Webserver eingeschaltet:"
echo "http-Anfragen werden nach $WEB_SERVER_IP umgeleitet"

########### WEB-Anfragen zum Weiterleiten werden akzeptiert

$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT \
                 -d $WEB_SERVER_IP -m state \
                  --state NEW,ESTABLISHED,RELATED -p TCP \
                 --sport $PORTS_HIGH \
                  --dport http -j ACCEPT

 $IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \
                 -s $WEB_SERVER_IP -m state \
                  --state ESTABLISHED,RELATED -p TCP \
                 --sport http \
                  --dport $PORTS_HIGH -j ACCEPT

echo "WEB-Anfragen aus dem Netz werden akzeptiert"

########### DNS Verbindungen erlauben

$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \
                   -m state \
                  --state NEW,ESTABLISHED,RELATED -p UDP --sport $PORTS_HIGH \
                  --dport 53 -j ACCEPT


$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT \
                   -m state \
                  --state ESTABLISHED,RELATED  -p UDP --sport 53 \
                  --dport $PORTS_HIGH -j ACCEPT


 echo "DNS  eingeschaltet"

########### smtp Verbindungen erlauben

$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \
                   -m state \
                  --state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH \
                  --dport smtp -j ACCEPT

$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT \
                   -m state \
                  --state ESTABLISHED,RELATED  -p TCP --sport smtp \
                  --dport $PORTS_HIGH -j ACCEPT

echo "smtp  eingeschaltet"

########### POP3 Verbindungen erlauben

$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \
                   -m state \
                  --state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH \
                  --dport 110 -j ACCEPT

$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT \
                   -m state \
                  --state ESTABLISHED,RELATED  -p TCP --sport 110 \
                  --dport $PORTS_HIGH -j ACCEPT

echo "POP3  eingeschaltet"



########### http -Verbindungen erlauben
#
$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \
                   -m state \
                  --state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH \
                  --dport http -j ACCEPT

$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT \
                   -m state \
                  --state ESTABLISHED,RELATED  -p TCP --sport http \
                  --dport $PORTS_HIGH -j ACCEPT

echo "http eingeschaltet"

########### https-Verbindungen erlauben

$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \
                   -m state \
                  --state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH \
                  --dport https -j ACCEPT

$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT \
                   -m state \
                  --state ESTABLISHED,RELATED  -p TCP --sport https \
                  --dport $PORTS_HIGH -j ACCEPT

echo "https eingeschaltet"

########### Bestimmte ICMP Anfragen werden gestattet. 
 
#
# Vom Netz ins Internet zur Diagnose nützlich
# $IPTABLES -A FORWARD -p ICMP --icmp-type 
# echo-request -j ACCEPT
# $IPTABLES -A FORWARD -p ICMP --icmp-type 
# echo-reply -j ACCEPT

# ROUTER_IP
$IPTABLES -A OUTPUT -p ICMP --icmp-type echo-request -j ACCEPT
$IPTABLES -A OUTPUT -p ICMP --icmp-type echo-reply -j ACCEPT
$IPTABLES -A OUTPUT -p ICMP --icmp-type redirect -j ACCEPT
$IPTABLES -A INPUT -p ICMP --icmp-type echo-request -j ACCEPT
$IPTABLES -A INPUT -p ICMP --icmp-type echo-reply -j ACCEPT
$IPTABLES -A INPUT -p ICMP --icmp-type redirect -j ACCEPT
echo "ICMP Anfragen des Firewallrouters werden gestattet"




############ Rest wird gesperrt und geloggt
$IPTABLES -A INPUT   -j TRASH
$IPTABLES -A FORWARD -j TRASH
$IPTABLES -A OUTPUT  -j TRASH
echo "Firewall eingeschaltet"

Meine eigene Skripte enthalten wesentlich mehr Funktionen, einen transparenten Proxy, IRC-Zugriff, dynamisch abschaltbares passives FTP über extra Skripte DCC-Zugriff, Identd Portforwarding u.v.a. mehr. Außerdem läuft noch ein DNS-Server auf dem Router. Falls du das eine oder andere benötigst dann frage mich lieber, bevor du Codeschnippsel aus anderen Skripten einbaust, das geht in den seltensten Fällen gut.

Ob du ein ping vom Lan aus erlaubst ist deine Entscheidung, du musst dann nur die entsprechenden Zeilen auskommentieren.

Ich hoffe ich habe daher alles mitgegeben was du für deinen Filter benötigst, schließlich ist das ziemlich schnell zusammengeschoben worden. Für das korrekte Funktionieren übernehme ich natürlich keine Gewährleistung oder komme für entstandene Folgen auf. Ich betone, dass das Skript auf eigenes Risiko benutzt wird.

Wenn du dich wunderst, diese Sätze sind heute aus rechtlichen Gründen notwendig, einfach um sich selbst zu schützen und sollen niemanden erschrecken.

Das DNAT funktioniert auf vielen Rechnern die ich so oder so ähnlich eingerichtet habe. Das sollte auch bei dir laufen, vorausgesetzt der Fehler liegt nicht anderswo zum Beispiel in der Konfiguration des Apaches.

Wichtig wäre vielleicht, dass du vor in Betrieb der Firewall testet ob der Apache über die IP 192.168.1.200 erreichbar ist.

mfG
gaw
Zuletzt geändert von gaw am 9. Dez 2004, 15:32, insgesamt 6-mal geändert.
oliver123
Newbie
Newbie
Beiträge: 6
Registriert: 9. Dez 2004, 10:55

Beitrag von oliver123 »

@ gaw:
Ich werd es mir heute Abend genau anschauen und ausprobieren.
Vielen, vielen Dank dafür aber jetzt schon!
Benutzeravatar
oc2pus
Ultimate Guru
Ultimate Guru
Beiträge: 6506
Registriert: 21. Jun 2004, 13:01

Beitrag von oc2pus »

@gaw:
supi script:)
die Definition der Variablen PORTS_HIGH= fehlt noch!
[EDIT hat der liebe gaw sofort korrigiert :) EDIT]

Verbesserungsvorschlag zur Übung für oliver123:
um Coding Redundanzen zu vermeiden eine kleine Funktion freigabeDienst() mit Parameter Port
Zuletzt geändert von oc2pus am 9. Dez 2004, 15:52, insgesamt 1-mal geändert.
tell people what you want to do, and they'll probably help you to do it.
PackMan
LinWiki : Das Wiki für Linux User
gaw
Hacker
Hacker
Beiträge: 464
Registriert: 28. Sep 2004, 16:33

Beitrag von gaw »

Hallo oc2pus, habe das fehlende PORTS_HIGH ergänzt. Steht in meinem Script in einem eigenen Abschnitt mit vielen anderen Portnummern wie
SQUID_PORT, IRC_PORTS, DCC_PORTS etc. Daher war es "rausgefallen".

Mal sehen ob sich seine virtuelle Maschine damit ansteuern lässt.

mfG
gaw
Benutzeravatar
oc2pus
Ultimate Guru
Ultimate Guru
Beiträge: 6506
Registriert: 21. Jun 2004, 13:01

Beitrag von oc2pus »

@gaw
grade gesehen :)

hier mein Verbesserungsvorschlag:

Code: Alles auswählen

function erlaubeDienst()
{
	DIENST=$1
	$IPTABLES -A FORWARD \
                 -i $INTERFACE_INT \
                 -o $INTERFACE_EXT \
                  -m state \
                  --state NEW,ESTABLISHED,RELATED \
                  -p TCP \
                  --sport $PORTS_HIGH \
                  --dport $DIENST \
                  -j ACCEPT

	$IPTABLES -A FORWARD \
                  -i $INTERFACE_EXT \
                  -o $INTERFACE_INT \
                  -m state \
                  --state ESTABLISHED,RELATED  \
                  -p TCP \
                  --sport $DIENST \
                  --dport $PORTS_HIGH \
                  -j ACCEPT

	echo "Port $DIENST freigeschaltet"
}
Aufruf mit
erlaubeDienst smtp
erlaubeDienst pop3
etc
tell people what you want to do, and they'll probably help you to do it.
PackMan
LinWiki : Das Wiki für Linux User
gaw
Hacker
Hacker
Beiträge: 464
Registriert: 28. Sep 2004, 16:33

Beitrag von gaw »

So sehen im Prinzip meine dynamischen Scripte aus.
Auch mein Perlprogramm mit dem GUI arbeitet so. Immer haut es aber nicht hin. Manche Protokolle verhalten sich völlig entgegen diesen Normen, zum Beispiel ftp. Passives ftp benötigt ein conntracking Modul. Ohne ein solches Modul ist ftp überhaupt nicht sicher. Selbst mit diesen Modul wird die Firewall unsicherer weil die hohen Ports wenn auch nicht für neue, so doch für rückläufige und etablierte Verbindungen geöffnet bleiben müssen. Für ein Firewallscript dass sowieso alle rückläufigen Verbindungen aufhält mag das nicht ins Gewicht fallen. Meine Scripte arbeiten aber paarweise und erlauben auch Paketen die zu rückläufigen Verbindungen gehören nicht generell den Kernel zu passieren. Sicherer ist es allemal auch diese Verbindungen zu kontrollieren. Daher setze ich ein dynamisches Script für passiven ftp-Transport ein um dieses Manko nur während eine ftp-Sitzung akzeptieren zu müssen:

Code: Alles auswählen

############  Firewallzusatzskript für einen Linux Router
# copyright (c) gaw

###########   Variabeln laden

eval `cat /usr/sbin/firewallvariabeln`

############  Passive FTP--Verbindungen erlauben

case "$1" in

 "start")

        $IPTABLES -I FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \
                   -m state \
                  --state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH \
                  --dport ftp -j ACCEPT

        $IPTABLES -I FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT \
                   -m state \
                  --state ESTABLISHED,RELATED  -p TCP --sport ftp \
                  --dport $PORTS_HIGH -j ACCEPT

        $IPTABLES -I FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \
                   -m state \
                  --state ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH \
                  --dport $PORTS_HIGH -j ACCEPT

        $IPTABLES -I FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT \
                   -m state \
                  --state ESTABLISHED  -p TCP --sport $PORTS_HIGH \
                  --dport $PORTS_HIGH -j ACCEPT

     echo "Passives FTP über Contrackingmodul eingeschaltet"
        ;;
 "stop")

        $IPTABLES -D FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \
                   -m state \
                  --state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH \
                  --dport ftp -j ACCEPT

        $IPTABLES -D FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT \
                   -m state \
                  --state ESTABLISHED,RELATED  -p TCP --sport ftp \
                  --dport $PORTS_HIGH -j ACCEPT


        $IPTABLES -D FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \
                   -m state \
                  --state ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH \
                  --dport $PORTS_HIGH -j ACCEPT

        $IPTABLES -D FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT \
                   -m state \
                  --state ESTABLISHED  -p TCP --sport $PORTS_HIGH \
                  --dport $PORTS_HIGH -j ACCEPT

        echo "Passives FTP über Contrackingmodul ausgeschaltet"

esac
dazu sollte im Hauptscript natürlich noch das ftp
contracking modul geladen sein mit

Code: Alles auswählen

modprobe ip_conntrack_ftp
und die Variabeln in einem Script /usr/sbin/firewallvariabeln ausgelagert werden

Code: Alles auswählen

INTERFACE_EXT="ppp0"
INTERFACE_INT="eth0"
INTERFACES="$INTERFACE_EXT $INTERFACE_INT"
WEB_SERVER_IP="192.168.0.1"
$ROUTER_IP="192.168.1.1"
$WEB_SERVER_IP="192.168.1.200"
$LOCAL_NET_IP="192.168.1.0/24"
PORTS_HIGH="1024:65535" 
Dann lässt sich bei eingeschalteter Firewall per
allow-ftp start
bzw.
allow-ftp stop
ftp dynamisch zu- bzw. abschalten um das Öffnen rückläufiger Pakte der etablierten und beigeordneten Verbindungen über alle Ports nur so lange wie unbedingt nötig zu erlauben. Mit iptables die sicherste Variante ftp zu erlauben.

mfG
gaw
oliver123
Newbie
Newbie
Beiträge: 6
Registriert: 9. Dez 2004, 10:55

Beitrag von oliver123 »

Ich hab mich jetzt damit beschäftigt.
Ist LOCAL_NET_IP und LOCAL_NET das selbe, oder? Die anderen fehlenden Variablen hab ich noch ergänzt.
Es geht immer noch nicht. :oops:
Ich habe die eigentragenen Routen kontrolliert, das passt. Ich kann auch von überall im Netz überall hinpingen.

Aber ich kann vom Router aus weder einen Domainnamen auflösen noch an meinen Virtuellen Server an Port 80 telneten. Ein telnet an Port 80 meiner externe IP ergibt auch nichts. Aus dem lokalen Netz sehe ich aber sehr wohl die Apache-Testpage.

Das Script gibt keine Fehlermeldung aus.

Wenn ich noch einmal um Rat fragen darf?

EDIT Ach ja, die Backslashes musste ich rausnehmen, weil mir der Interpreter mit eingesetzten "\" eine seltsame Fehlermeldung präsentiert hat.

Code: Alles auswählen

#############  Firewallskript für einen Linux Router 
# copyright (c) gaw 
# Autor: gaw 
# Oktober 2004 

#############  Firewallskript für einen Linux Router 

############# Initialisierung der Variablen 

############# Interfaces 
INTERFACE_EXT="eth1" 
INTERFACE_INT="eth0"    
INTERFACES="$INTERFACE_EXT $INTERFACE_INT" 
WEB_SERVER_IP="192.168.1.200" 
WEBMIN_PORT="10000"
ROUTER_IP="192.168.1.1" 
WEB_SERVER_IP="192.168.1.200" 
LOCAL_NET_IP="192.168.1.0/24" 
LOCAL_NET="192.168.1.0/24" 
HTTP_PORT="80"
PORTS_HIGH="1024:65535" 
IPTABLES="/sbin/iptables" 



############# Grundkonfiguration 

# Vorläufiges Ausschalten des IP Forwarding. IP Forwarding 
echo "0" > /proc/sys/net/ipv4/ip_forward 

############# TCP-Syncookies, Abwehrmaßnahme gegen das SYN Flooding. 
echo "1" > /proc/sys/net/ipv4/tcp_syncookies 

############# Ignorieren von Echoauforderungen von icmp 
############# Abwehrmaßnahme gegen Broadcast-Stürme 
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 

############# Das Loggen ungültiger ICMP-Pakete wird ausgeschaltet, 
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses 

############# Schleife für alle Schnittstellen in $INTERFACES 
for if in $INTERFACES; 
do 

        ##### IP-Spoof Protection 
        echo "1" > /proc/sys/net/ipv4/conf/$if/rp_filter 

        ##### Keine Redirections 
        echo "0" > /proc/sys/net/ipv4/conf/$if/accept_redirects 

        ##### Kein Source-Routing 
        echo "0" > /proc/sys/net/ipv4/conf/$if/accept_source_route 

        ##### Kein Bootstrap Protokoll 
        echo "0" > /proc/sys/net/ipv4/conf/$if/bootp_relay 

        ##### Ungültige IP-Pakete werden geloggt. 
        echo "1" > /proc/sys/net/ipv4/conf/$if/log_martians 
done 
echo "Dynamische Kernelparameter gesetzt" 

############# Alle Pakete der Grundeinstellung werden verworfen 

$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP



############# 
############# Alle eventuell noch vorhandenen Regeln werden gelöscht 
############# 


############# Lösche alle Regeln aus der Filter Tabelle 
$IPTABLES -F 

############# Lösche aller Regeln aus der NAT Tabelle 
$IPTABLES -t nat -F 

############# Lösche alle selbstdefinierte Regeln 
$IPTABLES -X 

echo "Alles verboten und alle Regeln gelöscht" 

############# 
############# Selbstdefinierte Regelkette zum Loggen 

$IPTABLES -N TRASH 

# Pakete die nicht geloggt werden sollen 

$IPTABLES -A TRASH -p UDP --dport 123 -j DROP 
# IPP-Anfragen zur Druckereinstellungen müssen nicht geloggt werden 
$IPTABLES -A TRASH -p UDP -s $ROUTER_IP --dport 631 -j DROP 
$IPTABLES -A TRASH -p TCP --dport 445 -j DROP 
$IPTABLES -A TRASH -p TCP --dport 135 -j DROP 

# Pakete die geloggt werden sollen 
$IPTABLES -A TRASH -p ICMP -j LOG --log-prefix "Abgelehnte-ICMP-Pakete " 
$IPTABLES -A TRASH -p UDP  -j LOG --log-prefix "Abgelehnte-UDP-Pakete  " 
$IPTABLES -A TRASH -p TCP  -j LOG --log-prefix "Abgelehnte-TCP-Pakete  " 
$IPTABLES -A TRASH -j DROP 

echo "Loggin eingeschaltet" 


############ Bis hier ist alles verboten. Nun werden bestimmte 
############ Pakete wieder akzeptiert 
############ 

################### Lokale Prozesse auf dem Rechner akzeptieren ################ 

$IPTABLES -A OUTPUT -o lo -j ACCEPT 
$IPTABLES -A INPUT  -i lo -j ACCEPT 

echo "Lokale Prozesse erlaubt" 
############# SSH Verbindungen vom internen Netz erlauben 

$IPTABLES -A INPUT -i $INTERFACE_INT -s $LOCAL_NET -d $ROUTER_IP -p TCP --sport $PORTS_HIGH --dport ssh -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT 
$IPTABLES -A OUTPUT -o $INTERFACE_INT -s $ROUTER_IP -d $LOCAL_NET -p TCP --dport $PORTS_HIGH --sport ssh -m state --state ESTABLISHED,RELATED -j ACCEPT 

echo "ssh vom LAN auf den Router erlaubt" 

############# Webmin Verbindungen vom internen Netz erlauben 

$IPTABLES -A INPUT -i $INTERFACE_INT -s $LOCAL_NET -d $ROUTER_IP -p TCP --sport $PORTS_HIGH --dport $WEBMIN_PORT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT 
$IPTABLES -A OUTPUT -o $INTERFACE_INT -s $ROUTER_IP -d $LOCAL_NET -p TCP --dport $PORTS_HIGH --sport $WEBMIN_PORT -m state --state ESTABLISHED,RELATED -j ACCEPT 

echo "Webmin vom LAN auf den Router erlaubt" 


######################### Masquarading einschalten ############################# 


$IPTABLES -t nat -A POSTROUTING -o $INTERFACE_EXT -j MASQUERADE 

##################### IP-Forwarding und DNAT einschalten ###################### 

echo "1" > /proc/sys/net/ipv4/ip_forward 
echo "1" > /proc/sys/net/ipv4/ip_dynaddr 

echo "Masquerading eingeschaltet" 

############ WEB-Anfragen zum Weiterleiten werden akzeptiert 
############ 

$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT -d $WEB_SERVER_IP -m state --state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH --dport http -j ACCEPT 
$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT -s $WEB_SERVER_IP -m state --state ESTABLISHED,RELATED -p TCP --sport http --dport $PORTS_HIGH -j ACCEPT 

echo "WEB-Anfragen aus dem Netz werden akzeptiert" 

############# Web-Anfragen werden auf internen Webserver umgelenkt 


$IPTABLES -A PREROUTING -t nat -i $INTERFACE_EXT -p tcp --dport $HTTP_PORT -j DNAT --to $WEB_SERVER_IP 

echo "DNAT für Webserver eingeschaltet:" 
echo "http-Anfragen werden nach $WEB_SERVER_IP umgeleitet" 

############# DNS Verbindungen erlauben 

$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT -m state --state NEW,ESTABLISHED,RELATED -p UDP --sport $PORTS_HIGH --dport 53 -j ACCEPT 
$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT -m state --state ESTABLISHED,RELATED  -p UDP --sport 53 --dport $PORTS_HIGH -j ACCEPT 


echo "DNS  eingeschaltet" 

############# smtp Verbindungen erlauben 

$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT -m state --state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH --dport smtp -j ACCEPT 
$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT -m state --state ESTABLISHED,RELATED  -p TCP --sport smtp --dport $PORTS_HIGH -j ACCEPT 

echo "smtp  eingeschaltet" 

############# POP3 Verbindungen erlauben 

$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT -m state --state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH --dport 110 -j ACCEPT 
$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT -m state --state ESTABLISHED,RELATED  -p TCP --sport 110 --dport $PORTS_HIGH -j ACCEPT 

echo "POP3  eingeschaltet" 



############# http -Verbindungen erlauben 
# 
$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT -m state --state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH --dport http -j ACCEPT 
$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT -m state --state ESTABLISHED,RELATED  -p TCP --sport http --dport $PORTS_HIGH -j ACCEPT 

echo "http eingeschaltet" 

############# https-Verbindungen erlauben 

$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT -m state --state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH --dport https -j ACCEPT 
$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT -m state --state ESTABLISHED,RELATED  -p TCP --sport https --dport $PORTS_HIGH -j ACCEPT 

echo "https eingeschaltet" 

############# Bestimmte ICMP Anfragen werden gestattet. 
  
# 
# Vom Netz ins Internet zur Diagnose nützlich 
# $IPTABLES -A FORWARD -p ICMP --icmp-type 
# echo-request -j ACCEPT 
# $IPTABLES -A FORWARD -p ICMP --icmp-type 
# echo-reply -j ACCEPT 

# ROUTER_IP 
$IPTABLES -A OUTPUT -p ICMP --icmp-type echo-request -j ACCEPT 
$IPTABLES -A OUTPUT -p ICMP --icmp-type echo-reply -j ACCEPT 
$IPTABLES -A OUTPUT -p ICMP --icmp-type redirect -j ACCEPT 
$IPTABLES -A INPUT -p ICMP --icmp-type echo-request -j ACCEPT 
$IPTABLES -A INPUT -p ICMP --icmp-type echo-reply -j ACCEPT 
$IPTABLES -A INPUT -p ICMP --icmp-type redirect -j ACCEPT 
echo "ICMP Anfragen des Firewallrouters werden gestattet" 


############# Rest wird gesperrt und geloggt 
$IPTABLES -A INPUT   -j TRASH 
$IPTABLES -A FORWARD -j TRASH 
$IPTABLES -A OUTPUT  -j TRASH 
echo "Firewall eingeschaltet" 
gaw
Hacker
Hacker
Beiträge: 464
Registriert: 28. Sep 2004, 16:33

Beitrag von gaw »

Wie startest du eigentlich das Script? Mit Namen?
Dann musst du noch

Code: Alles auswählen

#!/bin/bash
in die erste Zeile einfügen. Das fehlt in deinem Script. Oder du startest es mit
/bin/bash firewallscript

Ich hatte das Script übrigens noch einmal überarbeitet, beim Kopieren war etwas zu hochgerutscht, du hast ziemlich früh kopiert und die Änderungen nicht mehr mitbekommen. Zunächst wird das DNAT eingeschaltet und dann der http Zugriff erlaubt, vergleiche noch einmal die Scripte.

Wenn trotzdem irgendwo ein Tippfehler steckt oder eine Variable leer bleibt, dann gibt es eine Fehlermeldung oder das Script bleibt hängen und kehrt nicht zum prompt zurück. Wenn aber nach dem Starten und den Echoausgaben (nach kurzer Zeit) der prompt erscheint und vorher iptables keine Fehler monierte, hat es aus Sicht von iptables auch keinen Fehler gegeben.

Jedenfalls hat iptables alle Anweisungen genauso ausgeführt wie sie im Script stehen. Das Script arbeitet erst einmal ordungsgemäß aus Sicht von iptables. Ob die Regeln das machen was du willst, weiss iptables nicht.

Wenn Pakete trotzdem abgelehnt werden weil die Regeln deine Situation nicht so erfassen wie du dir das vorstellst und Pakete irrtümlich gesperrt werden
müssen die Regeln angepasst werden.

Dazu muss du wissen, ob und wenn welche Pakete abgelehnt werden. Starte dazu die Firewall, öffne anschließend einen xterm (oder eine konsole bzw. gterm) und melde dich als su an.
linux # tail -f /var/log/messages
Der Cursor bleibt stehen und wartet auf neue Meldungen. Du kannst die Firewall bei der Arbeit beobachten und sehen welche Pakete sie ablehnt. Das ganze sieht etwa so aus:

Code: Alles auswählen

Dec 10 01:37:32 duron kernel: Abgelehnte-TCP-Pakete IN=ppp0 OUT= MAC= SRC=84.28.35.15 DST=217.255.187.228 LEN=48 TOS=0x00 PREC=0x00 TTL=115 ID=23894 DF PROTO=TCP SPT=3881 DPT=3374 WINDOW=8192 RES=0x00 SYN URGP=0 
Dec 10 01:37:35 duron kernel: Abgelehnte-TCP-Pakete IN=ppp0 OUT= MAC= SRC=84.28.35.15 DST=217.255.187.228 LEN=48 TOS=0x00 PREC=0x00 TTL=115 ID=35414 DF PROTO=TCP SPT=3881 DPT=3374 WINDOW=8192 RES=0x00 SYN URGP=0 
Dec 10 01:37:41 duron kernel: Abgelehnte-TCP-Pakete IN=ppp0 OUT= MAC= SRC=84.28.35.15 DST=217.255.187.228 LEN=48 TOS=0x00 PREC=0x00 TTL=115 ID=52310 DF PROTO=TCP SPT=3881 DPT=3374 WINDOW=8192 RES=0x00 SYN URGP=0 
Hier werden also Pakete abgelehnt die einen Dienst auf dem Port 3374 suchen. Wenn du also nicht auf deinen Apache kommst, öffne den xterm geb den tail-Befehl ein ruf einen Freund an, geb ihm deine IP-Adresse und sag ihm er soll versuchen auf deinen Rechner zu kommen. Dann beobachte einfach welche Pakete abgelehnt werden. Vielleicht ist durch deine komplexe Ausgangsbedingung irgendetwas übersehen worden.

Werden aber keine Pakete abgelehnt ist es höchstwahrscheinlich kein Problem der Firewall.

mfG
gaw

ps: Das mit den backslash funktioniert eigentlich, vielleicht hast du die Leerzeichen davor vergessen einzufügen?


mfG
gaw
oliver123
Newbie
Newbie
Beiträge: 6
Registriert: 9. Dez 2004, 10:55

Beitrag von oliver123 »

Noch einmal vielen Dank für die Hilfe, es funktioniert jetzt alles soweit.

Eine letzte Frage noch, die eigentlich nicht hierher gehört.

Der Apache auf 192.168.111.200 scheint keine Virtuellen Server mehr unterscheiden zu können? Egal mit welcher Adresse ich auf den Apache zugreife, er nimmt immer die 192.168.111.200.

Lässt sich gegen dieses Verhalten etwas unternehmen oder ist das einfach so, wenn ich die Anfragen ins interne Netz leite?
gaw
Hacker
Hacker
Beiträge: 464
Registriert: 28. Sep 2004, 16:33

Beitrag von gaw »

oliver123 hat geschrieben:Noch einmal vielen Dank für die Hilfe, es funktioniert jetzt alles soweit.

Eine letzte Frage noch, die eigentlich nicht hierher gehört.

Der Apache auf 192.168.111.200 scheint keine Virtuellen Server mehr unterscheiden zu können? Egal mit welcher Adresse ich auf den Apache zugreife, er nimmt immer die 192.168.111.200.

Lässt sich gegen dieses Verhalten etwas unternehmen oder ist das einfach so, wenn ich die Anfragen ins interne Netz leite?
Das ist keine Frage ob der Apache etwas unterscheidet sondern was ankommt. Virtuelle Server bedürfen auch einer entsprechenden Namensauflösung. Mit anderen Worten, wenn dns mit deinen virtuellen servern nichts anfangen kann, wie sollen die Pakete denn dann zu deinem Router gelangen?


mfG
gaw
Huflatisch
Hacker
Hacker
Beiträge: 543
Registriert: 5. Apr 2004, 22:40

Beitrag von Huflatisch »

Hey

Sehr gutes Firewall Script. Aber mal ne Frage. Ich hänge das schon ne Weile dran ....

wurde in einem anderen Topic beantwortet
:roll:

By Huflatisch
Rain-Air
Newbie
Newbie
Beiträge: 7
Registriert: 27. Jan 2005, 09:42
Kontaktdaten:

obiges script

Beitrag von Rain-Air »

ich fummel seit langem an einem ipt-script rum, welches folgende sachen können soll:
rechner steht zwischen zwei privaten netzen: 192.9.... 192.168....
im 192.168.... Netz befindet sich ein NAT-Router zum Internet
aus dem 192.9... Netz soll jetzt folgendes möglich werden:
POP3, SMTP, DNS, FTP
Auserdem läuft auf dem entsprechenden Rechner zwischen den Netzen noch Squid und später noch ein FTP (wenn das möglich ist?)
ICMP soll nach außen auch möglich sein (oder ist das ein Sicherheitsrisiko?)
ssh nur aus 192.9- netz möglich.

Von außen (INet) soll der FTP-Server, und ein Rechner im 192.9.. Netz via port 80 erreichbar sein, portforwarding im NAT-Router kann ich einstellen.

Mein Script kann ich leider nicht posten, da ich an einem anderen Rechner sitze... Aber ich glaube, daß ich damit eh nur Gelächter auslösen würde, wenn ich mir dieses script so ansehe....

nun meine frage: ist es prinzipiell möglich, dieses script auch für meine zwecke abzuändern, oder ist es da einfacher doch etwas neues selbst zu machen? Ich hätte es gerne so übersichtlich wie möglich, so dass ich es auch in ein paar Monaten noch verändern kann, ohne mich vorher wieder tagelang damit zu beschäftigen.

Rechner ist ein Dual-P3 mit 512MB RAM, 9GB HD, 2xLan und Fedora Core 2
Rain-Air
Newbie
Newbie
Beiträge: 7
Registriert: 27. Jan 2005, 09:42
Kontaktdaten:

IPTABLES incl SQUID

Beitrag von Rain-Air »

Hallo gaw
habe dein Script jetzt soweit abgeändert, dass es bei mir funktioniert...
Vielleicht kannste mal drüberschaun, ob mir irgendwo ein grober Schnitzer unterlaufen ist, und ich jetzt ein riesiges Tor aufgemacht habe... :shock:
Schonmal Danke fürs posten deines Scriptes!


#!/bin/bash
############# Firewallskript fuer einen Linux Router
# copyright (c) gaw
# Autor: gaw
# Oktober 2004
############# Initialisierung der Variablen

############# Interfaces
INTERFACE_EXT="eth1"
INTERFACE_INT="eth0"
INTERFACES="$INTERFACE_EXT $INTERFACE_INT"
ROUTER_IP="192.9.200.205"
WEB_SERVER_IP="192.9.200.201"
LOCAL_NET="192.9.200.0/24"
NETBIOS_PORTS=""
HTTP_PORT="80"

############# Portnummern
PORTS_HIGH="1024:65535"
# Bei mir stehen noch ein paar mehr;)

############# Programm
IPTABLES="/sbin/iptables"


############# Grundkonfiguration

############# Vorlaeufiges Ausschalten des IP Forwarding.
echo "0" > /proc/sys/net/ipv4/ip_forward

############# TCP-Syncookies, AbwehrmaÃahme gegen das SYN Flooding.
echo "1" > /proc/sys/net/ipv4/tcp_syncookies

############# Ignorieren von Echoauforderungen von icmp
############# AbwehrmaÃahme gegen Broadcast-Stuerme
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

############# Das Loggen ungueltiger ICMP-Pakete wird ausgeschaltet,
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

############# Schleife fuer alle Schnittstellen in $INTERFACES
for if in $INTERFACES;
do
##### IP-Spoof Protection
echo "1" > /proc/sys/net/ipv4/conf/$if/rp_filter

##### Keine Redirections
echo "0" > /proc/sys/net/ipv4/conf/$if/accept_redirects

##### Kein Source-Routing
echo "0" > /proc/sys/net/ipv4/conf/$if/accept_source_route

##### Kein Bootstrap Protokoll
echo "0" > /proc/sys/net/ipv4/conf/$if/bootp_relay

##### Ungueltige IP-Pakete werden geloggt.
echo "1" > /proc/sys/net/ipv4/conf/$if/log_martians
done
echo "Dynamische Kernelparameter gesetzt"

############ Alle Pakete der Grundeinstellung werden verworfen
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP

############ Alle eventuell noch vorhandenen Regeln werden geloescht

############ Loesche alle Regeln aus der Filter Tabelle
$IPTABLES -F

############ Loesche aller Regeln aus der NAT Tabelle
$IPTABLES -t nat -F

############ Loesche alle selbstdefinierten Regeln
$IPTABLES -X
echo "Alles verboten und alle Regeln geloescht"

############ Selbstdefinierte Regelkette zum Loggen wird erstellt
$IPTABLES -N TRASH
# Hier folgen Regeln fuer Pakete die nicht geloggt werden sollen als
# Schutz gegen ein ueberquellen der Logdateien
$IPTABLES -A TRASH -p UDP --dport 123 -j DROP
# IPP-Anfragen zur Druckereinstellungen muessen nicht geloggt werden
$IPTABLES -A TRASH -p UDP --dport 631 -j DROP
#$IPTABLES -A TRASH -p UDP --dport $NETBIOS_PORTS -j DROP
#$IPTABLES -A TRASH -p TCP --dport $NETBIOS_PORTS -j DROP
$IPTABLES -A TRASH -p TCP --dport 445 -j DROP
$IPTABLES -A TRASH -p TCP --dport 135 -j DROP
# Diese Pakete sollen geloggt werden
#$IPTABLES -A TRASH -p ICMP -j LOG --log-prefix "Abgelehnte-ICMP-Pakete "
#$IPTABLES -A TRASH -p UDP -j LOG --log-prefix "Abgelehnte-UDP-Pakete "
#$IPTABLES -A TRASH -p TCP -j LOG --log-prefix "Abgelehnte-TCP-Pakete "
#$IPTABLES -A TRASH -j DROP
#echo "Loggin eingeschaltet"

############ Bis hier ist alles verboten. Nun werden bestimmte
############ Pakete wieder akzeptiert

############ Lokale Prozesse auf dem Rechner akzeptieren ###############
$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A INPUT -i lo -j ACCEPT
echo "LOCALHOST.....................................ACCEPTED"

############ SSH Verbindungen vom internen Netz erlauben
$IPTABLES -A INPUT -i $INTERFACE_INT -s $LOCAL_NET -d $ROUTER_IP \
-p TCP --sport $PORTS_HIGH --dport ssh \
-m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $INTERFACE_INT -s $ROUTER_IP -d $LOCAL_NET \
-p TCP --dport $PORTS_HIGH --sport ssh \
-m state --state ESTABLISHED,RELATED -j ACCEPT
echo "SSH LAN->ROUTER...............................ACCEPTED"

########### Squid Verbindungen vom internen Netz erlauben
$IPTABLES -A INPUT -i $INTERFACE_INT -s $LOCAL_NET -d $ROUTER_IP \
-p TCP --sport $PORTS_HIGH --dport 3128 \
-m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $INTERFACE_INT -s $ROUTER_IP -d $LOCAL_NET \
-p TCP --dport $PORTS_HIGH --sport 3128 \
-m state --state ESTABLISHED,RELATED -j ACCEPT
echo "SQUID LAN->ROUTER.............................ACCEPTED"

########### Masquarading einschalten
$IPTABLES -t nat -A POSTROUTING -o $INTERFACE_EXT -j MASQUERADE

########### IP-Forwarding und DNAT einschalten
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
echo "MASQUERADING........................................ON"

########### Web-Anfragen werden auf internen Webserver umgelenkt
$IPTABLES -A PREROUTING -t nat -p tcp --dport $HTTP_PORT -i $INTERFACE_INT \
-j DNAT --to-destination $WEB_SERVER_IP
echo "PORTFORWARDING PORT:$HTTP_PORT->$WEB_SERVER_IP...............ON"

########### WEB-Anfragen zum Weiterleiten werden akzeptiert
$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT \
-d $WEB_SERVER_IP -m state \
--state NEW,ESTABLISHED,RELATED -p TCP \
--sport $PORTS_HIGH \
--dport http -j ACCEPT
$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \
-s $WEB_SERVER_IP -m state \
--state ESTABLISHED,RELATED -p TCP \
--sport http \
--dport $PORTS_HIGH -j ACCEPT
echo "HTTP $WEB_SERVER_IP<->WAN............................ON"

########### DNS Verbindungen erlauben
$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT -m state \
--state NEW,ESTABLISHED,RELATED -p UDP --sport $PORTS_HIGH \
--dport 53 -j ACCEPT
$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT -m state \
--state ESTABLISHED,RELATED -p UDP --sport 53 \
--dport $PORTS_HIGH -j ACCEPT
echo "DNS LAN->WAN..................................ACCEPTED"

########### DNS Verbindungen fuer Squid erlauben
$IPTABLES -A OUTPUT -o $INTERFACE_EXT -m state \
--state NEW,ESTABLISHED,RELATED -p UDP --sport $PORTS_HIGH \
--dport 53 -j ACCEPT
$IPTABLES -A INPUT -i $INTERFACE_EXT -m state \
--state ESTABLISHED,RELATED -p UDP --sport 53 \
--dport $PORTS_HIGH -j ACCEPT
echo "DNS SQUID->WAN................................ACCEPTED"

########### smtp Verbindungen erlauben
$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT -m state \
--state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH \
--dport smtp -j ACCEPT
$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT -m state \
--state ESTABLISHED,RELATED -p TCP --sport smtp \
--dport $PORTS_HIGH -j ACCEPT
echo "SMTP LAN->WAN.................................ACCEPTED"

########### http-Verbindungen fuer Squid erlauben
$IPTABLES -A OUTPUT -o $INTERFACE_EXT -m state \
--state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH \
--dport http -j ACCEPT
$IPTABLES -A INPUT -i $INTERFACE_EXT -m state \
--state ESTABLISHED,RELATED -p TCP --sport http \
--dport $PORTS_HIGH -j ACCEPT
echo "HTTP SQUID->WAN...............................ACCEPTED"

########### https-Verbindungen fuer Squid erlauben
$IPTABLES -A OUTPUT -o $INTERFACE_EXT -m state \
--state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH \
--dport https -j ACCEPT
$IPTABLES -A INPUT -i $INTERFACE_EXT -m state \
--state ESTABLISHED,RELATED -p TCP --sport https \
--dport $PORTS_HIGH -j ACCEPT
echo "HTTPS SQUID->WAN..............................ACCEPTED"

########### POP3 Verbindungen erlauben
$IPTABLES -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT -m state \
--state NEW,ESTABLISHED,RELATED -p TCP --sport $PORTS_HIGH \
--dport 110 -j ACCEPT
$IPTABLES -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT -m state \
--state ESTABLISHED,RELATED -p TCP --sport 110 \
--dport $PORTS_HIGH -j ACCEPT
echo "POP3 LAN->WAN.................................ACCEPTED"

########### Bestimmte ICMP Anfragen werden gestattet.
# Vom Netz ins Internet zur Diagnose nuetzlich
$IPTABLES -A FORWARD -p ICMP --icmp-type echo-request -j ACCEPT
$IPTABLES -A FORWARD -p ICMP --icmp-type echo-reply -j ACCEPT
echo "ICMP LAN->WAN.................................ACCEPTED"

# ROUTER_IP
$IPTABLES -A OUTPUT -p ICMP --icmp-type echo-request -j ACCEPT
$IPTABLES -A OUTPUT -p ICMP --icmp-type echo-reply -j ACCEPT
$IPTABLES -A OUTPUT -p ICMP --icmp-type redirect -j ACCEPT
$IPTABLES -A INPUT -p ICMP --icmp-type echo-request -j ACCEPT
$IPTABLES -A INPUT -p ICMP --icmp-type echo-reply -j ACCEPT
$IPTABLES -A INPUT -p ICMP --icmp-type redirect -j ACCEPT
echo "ICMP LAN<->ROUTER->WAN........................ACCEPTED"

############ Rest wird gesperrt und geloggt
$IPTABLES -A INPUT -j TRASH
$IPTABLES -A FORWARD -j TRASH
$IPTABLES -A OUTPUT -j TRASH
echo "FIREWALL............................................ON"


Ich hoffe es ist nicht so verkehrt... Bin natürlich für jeden Verbesserungsvorschlag dankbar!
Antworten