Hilfe zu iptables - Firewallscript für Netzwerk

Post Reply
Message
Author
godsdisciple
Posts: 3
Joined: 03. Apr 2009 14:57

Hilfe zu iptables - Firewallscript für Netzwerk

#1 Post by godsdisciple »

Hallo zusammen, ich hoffe bei euch ein bisschen Hilfe zu finden, da ich leider leicht überfordert bin, als relativer Linuxneuling, der dazu gaaanz komplizierte Terminalsachen nicht mag, ein Script aufzusetzen, welches das Netzwerk meiner Arbeit schützt. Vielleicht ein bisschen dazu, wie es bei uns aussieht: Wir haben ca. 15-20 Rechner (zumeist Windows, hoffentlich schaffen wir nach und nach den Wechsel) und leider nur eine Möglichkeit über Modem ins Internet zu kommen. Das Problem ist, dass der peruanische Anbieter, von dem wir abhängig sind, sehr unzuverlässig ist, sodass wir gerne einen Computer (unserer Linux Firewall-Router) aufsetzen wollen, der morgens mit 2 Modems sich einwählt und dann für den Tag das Internet bereitstellt und gleichzeitig noch unsere Rechner schützt. Nach vielem Suchen im Internet habe ich mir jetzt so einiges über iptables angelesen und bin mir immer noch ziemlich sicher es nicht verstanden zu haben. Was ich mit dem folgenden Script erreichen möchte, ist wie gesagt, dass die Computer, die sich über den Firewall-Router einwählen geschützt sind, jedoch normal im Internet arbeiten können. Ich würde mich freuen, wenn ihr mein Script mal durchsehen könnt (ist sehr zusammen gebastelt, kann also grobe Fehler enthalten) und mir sagt, was ich ändern muss, wie ich das realisieren kann und ob es sinnvoll ist, welche Ports ich öffne und welche nicht.

Code: Select all

# Firewallscript mit iptables
#
#!/bin/bash

INTERN=192.168.100.0/255
INTERN-DEV=eth0
EXTERN-DEV=ppp0
IPTABLES=/sbin/iptables

NAT_FORWARDING_TCP_PORT="21,25,80,110,143,443,993,5190,5222,6667,6668,1863"
INPUT_INTERNET_TCP_PORT="443,22"

case $1 in 
        start) 
                $0 stop 

$IPTABLES -F INPUT
$IPTABLES -F FORWARD
$IPTABLES -F OUTPUT

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

echo 1 > /proc/sys/net/ipv4/ip_forward
echo "5" >/proc/sys/net/ipv4/icmp_ratelimit
echo "1" > /proc/sys/net/ipv4/conf/$EXTERN-DEV/rp_filter

                #Defines the INPUT rules

$IPTABLES -t filter -A INPUT  -i lo -j ACCEPT
$IPTABLES -t filter -A INPUT -p icmp -j ACCEPT
$IPTABLES -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -t filter -A INPUT -s 0.0.0.0/0 -p tcp -m multiport --dport $INPUT_INTERNET_TCP_PORT -j ACCEPT
$IPTABLES -t filter -A INPUT -p tcp ! --syn -j ACCEPT #syn packages
$IPTABLES -t filter -A INPUT -i $EXTERN_DEV -s 195.58.160.0/16 -p udp -j ACCEPT          #Nameserver 
$IPTABLES -t filter -A INPUT -i $EXTERN_DEV -s 195.58.161.0/16 -p udp -j ACCEPT          #Nameserver 
$IPTABLES -t filter -A INPUT -i $EXTERN_DEV -p udp --dport 53 -j ACCEPT


                #Defines the OUTPUT rules 


$IPTABLES -t filter -A OUTPUT -p icmp  -j ACCEPT 
$IPTABLES -t filter -A OUTPUT -o lo -j ACCEPT
$IPTABLES -t filter -A OUTPUT -o $EXTERN_DEV -d 0.0.0.0/0 -p tcp -m multiport --dport $NAT_FORWARDING_TCP_PORT -j ACCEPT #Outgoing ftp
$IPTABLES -t filter -A OUTPUT -p tcp ! --syn -j ACCEPT #syn packages


                #Defines the NAT rules 

$IPTABLES -A POSTROUTING -t nat -p tcp -o $EXTERN_DEV -s $INTERN -j MASQUERADE 
$IPTABLES -A POSTROUTING -t nat -p udp -o $EXTERN_DEV -s $INTERN -j MASQUERADE 
$IPTABLES -A POSTROUTING -t nat -p icmp -o $EXTERN_DEV -s $INTERN -j MASQUERADE
$IPTABLES -A FORWARD -p tcp ! --syn -j ACCEPT
$IPTABLES -A FORWARD -i $INTERN_DEV -o $EXTERN_DEV -s $INTERN -p tcp -m multiport --dport $NAT_FORWARDING_TCP_PORT -j ACCEPT
$IPTABLES -A FORWARD -m state --state NEW -p icmp -j ACCEPT 
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -i $INTERN_DEV -o $EXTERN_DEV -s $INTERN -p tcp -j LOG --log-prefix "~~FILTER~~ FORWARD TCP! " --log-ip-options
$IPTABLES -A FORWARD -i $INTERN_DEV -o $EXTERN_DEV -s $INTERN -p udp -j LOG --log-prefix "~~FILTER~~ FORWARD UDP! " --log-ip-options



                echo "Firewall & Routing activated" 

        ;; 

        stop) 
                $IPTABLES -t filter -F INPUT 
                $IPTABLES -t filter -F OUTPUT 
                $IPTABLES -t filter -F FORWARD 
                $IPTABLES -t nat -F POSTROUTING 
        ;; 

        restart) 
                $0 start 
        ;; 

        *) 
                echo "Usage: $0 {startwd|stop|restart}" 
        ;; 

esac 
Vielen Dank für eure Hilfe. Könnt ihr mir ausserdem sagen, ob es möglich ist, dieses Script so abzuändern, dass es für 2 Modems gilt. Muss ich diese dann über die interfaces als z.B. ppp0 und ppp1 einrichten?

Liebe Grüsse God´s disciple

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

Re: Hilfe zu iptables - Firewallscript für Netzwerk

#2 Post by Janka »

Prinzipiell sieht das schon sehr vernünftig aus. Welche Distribution benutzt du?
godsdisciple wrote:

Code: Select all

# Firewallscript mit iptables
#
#!/bin/bash

INTERN=192.168.100.0/255
Das muss 192.168.100.0/24 heißen.

Code: Select all

INTERN-DEV=eth0
EXTERN-DEV=ppp0
IPTABLES=/sbin/iptables

NAT_FORWARDING_TCP_PORT="21,25,80,110,143,443,993,5190,5222,6667,6668,1863"
INPUT_INTERNET_TCP_PORT="443,22"

case $1 in 
        start) 
                $0 stop 

$IPTABLES -F INPUT
$IPTABLES -F FORWARD
$IPTABLES -F OUTPUT

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
Flushen der Regeln immer erst *nachdem* die Policy auf DROP gestellt wurde! Sonst gibt es eine kurze Lücke, in der die Firewall alles akzeptiert. Die Lücke kann auch verlängert werden, wenn man das Skript suspendiert oder der OOM-Killer zuschlägt.

Außerdem ist es sinnvoll, nicht nur die Filter-Chains sondern auch alle anderen Chains zu flushen, wenn man mit Masquerading/Mangling rumbaut.

Code: Select all

echo 1 > /proc/sys/net/ipv4/ip_forward
echo "5" >/proc/sys/net/ipv4/icmp_ratelimit
echo "1" > /proc/sys/net/ipv4/conf/$EXTERN-DEV/rp_filter

                #Defines the INPUT rules

$IPTABLES -t filter -A INPUT  -i lo -j ACCEPT
Sinnvoll.

Code: Select all

$IPTABLES -t filter -A INPUT -p icmp -j ACCEPT
ICMP zu akzeptieren ist sinnvoll, nur Nachrichten vom Typ "redirect" sollte man filtern, da dadurch die Routingtabellen von außen manipuliert werden können.

Code: Select all

$IPTABLES -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Sinnvoll.

Code: Select all

$IPTABLES -t filter -A INPUT -s 0.0.0.0/0 -p tcp -m multiport --dport $INPUT_INTERNET_TCP_PORT -j ACCEPT
Dies erlaubt alle Dienste, die oben in INPUT_INTERNET_TCP_PORT eingestellt sind. Diese Liste solltest du an die Dienste anpassen, die ihr zum Internet hin freigeben wollt. Es kann sinnvoll sein, ssh auf einem anderen Port als Port 22 laufen zu lassen, da hier relativ viele automatisierte Einbruchsversuche stattfinden. Generell den direkten root-Login per ssh abschalten, am besten Login per Kennwort generell verbieten, alles per Key machen.

Code: Select all

$IPTABLES -t filter -A INPUT -p tcp ! --syn -j ACCEPT #syn packages
Der Kommentar ist falsch. Diese Regel erlaubt alle *nicht*-SYN-Pakete, also alle Pakete, die zu einer bestehenden TCP-Verbindung gehören. Eigentlich ist das doppelt gemoppelt, denn zuvor werden ja über State-Matching ohnehin alle Pakete erlaubt, die zu einer bestehenden Verbindung gehören.

Code: Select all

$IPTABLES -t filter -A INPUT -i $EXTERN_DEV -s 195.58.160.0/16 -p udp -j ACCEPT          #Nameserver 
$IPTABLES -t filter -A INPUT -i $EXTERN_DEV -s 195.58.161.0/16 -p udp -j ACCEPT          #Nameserver 
$IPTABLES -t filter -A INPUT -i $EXTERN_DEV -p udp --dport 53 -j ACCEPT
Der Adressbereich des Nameservers ist Quark. Entweder muss das 195.58.160.0/24 oder 195.58.0.0/16 sein. der zweite entsprechend.
Die erste und zweite Regel erlaubt alle UDP-Pakete aus diesem Netzbereich, sollte man auf --dport 53 beschränken.
Außerdem erlaubt die dritte Regel Pakete von *allen* Rechnern überhaupt, solange diese nur auf UDP Port 53 kommen. Musst du streichen, sonst sind Regel 1 und 2 sinnlos.

Code: Select all

                #Defines the OUTPUT rules 

$IPTABLES -t filter -A OUTPUT -p icmp  -j ACCEPT 
$IPTABLES -t filter -A OUTPUT -o lo -j ACCEPT
$IPTABLES -t filter -A OUTPUT -o $EXTERN_DEV -d 0.0.0.0/0 -p tcp -m multiport --dport $NAT_FORWARDING_TCP_PORT -j ACCEPT #Outgoing ftp
$IPTABLES -t filter -A OUTPUT -p tcp ! --syn -j ACCEPT #syn packages
Es ist meist nicht sinnvoll, ausgehende Pakete zu filtern, es sei denn, du willst deine Benutzer gängeln -- und dann suchen und finden sie eine Lücke (z.B.via HTTPS-Proxy). Stell einfach die Output-Policy auf ACCEPT.

Code: Select all

                #Defines the NAT rules 

$IPTABLES -A POSTROUTING -t nat -p tcp -o $EXTERN_DEV -s $INTERN -j MASQUERADE 
$IPTABLES -A POSTROUTING -t nat -p udp -o $EXTERN_DEV -s $INTERN -j MASQUERADE 
$IPTABLES -A POSTROUTING -t nat -p icmp -o $EXTERN_DEV -s $INTERN -j MASQUERADE
Sinnvoll. Wobei der kanonische Weg eigentlich ist, einfach alle Protokolle zu masqueraden.

Code: Select all

$IPTABLES -A FORWARD -p tcp ! --syn -j ACCEPT
$IPTABLES -A FORWARD -i $INTERN_DEV -o $EXTERN_DEV -s $INTERN -p tcp -m multiport --dport $NAT_FORWARDING_TCP_PORT -j ACCEPT
$IPTABLES -A FORWARD -m state --state NEW -p icmp -j ACCEPT 
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Das ist jetzt wieder zu kompliziert und gleichzeitig lückenhaft. Grundproblem: Die Forward-Chain ist sowohl für Pakete vom Internet in das interne Netz als auch andersrum zuständig. Es wird hier nun aber zwischen rein und raus nur anhand der IP-Adresse und anderer Inhalte des Paketes unterschieden. Viel einfacher und wasserdichter ist es, das per Bindung an das Input-Interface (-i) zu machen. Und außerdem die Portregeln von innen nach außen wegwerfen, Benutzergängelung!

Code: Select all

$IPTABLES -A FORWARD -i $INTERN_DEV -o $EXTERN_DEV -s $INTERN -p tcp -j LOG --log-prefix "~~FILTER~~ FORWARD TCP! " --log-ip-options
$IPTABLES -A FORWARD -i $INTERN_DEV -o $EXTERN_DEV -s $INTERN -p udp -j LOG --log-prefix "~~FILTER~~ FORWARD UDP! " --log-ip-options
Musst du selbst wissen, ob du diese Logs überhaupt lesen willst. Da steht nur drin, ob ein Benutzer einen "verbotenen" Port benutzen wollte. Sinnlos.

Code: Select all

                echo "Firewall & Routing activated" 

        ;; 

        stop) 
                $IPTABLES -t filter -F INPUT 
                $IPTABLES -t filter -F OUTPUT 
                $IPTABLES -t filter -F FORWARD 
                $IPTABLES -t nat -F POSTROUTING 
Wieder dasselbe wie oben: Erst Policy einstellen, dann Chains flushen.

Code: Select all

        ;; 

        restart) 
                $0 start 
        ;; 

        *) 
                echo "Usage: $0 {startwd|stop|restart}" 
        ;; 

esac 
Vielen Dank für eure Hilfe. Könnt ihr mir ausserdem sagen, ob es möglich ist, dieses Script so abzuändern, dass es für 2 Modems gilt. Muss ich diese dann über die interfaces als z.B. ppp0 und ppp1 einrichten?
Sollen die zwei Modems alternativ benutzt werden oder gleichzeitig? Wenn letzteres, musst du auch noch die Kanalbündelung einrichten.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

godsdisciple
Posts: 3
Joined: 03. Apr 2009 14:57

Vielen Dank schonmal

#3 Post by godsdisciple »

Hey,
vielen Dak für deine Hilfe. Ich habe jetzt versucht deine änderungen umzusetzen und das Script neu geschrieben. Manchmal habe ich eine Anmerkung gemacht, wenn ich etwas nicht verstanden habe. Wenn du es nochmal durchsehen könntest und mir bei den unklaren Stellen helfen könntest und sagen könntest, ob ich sonst alles wichtige habe, wäre ich dir dankbar.
Benutze übrigens Ubuntu 8.10.
Kann man da irgendwie zwei Modemverbindungen (noch ne richtig schön langsame telefonleitung) bündeln, dass der Rechner die als eine Verbindung ansieht? Oder muss ich dann auch in dem Script alle regeln für zum Beispiel ppp0 und ppp1 aufstellen?

Code: Select all

# Firewallscript mit iptables
#
#!/bin/bash

INTERN=192.168.100.0/24
INTERN-DEV=eth0
EXTERN-DEV=ppp0
IPTABLES=/sbin/iptables

NAT_FORWARDING_TCP_PORT="21,25,80,110,143,443,993,5190,5222,6667,6668,1863"
INPUT_INTERNET_TCP_PORT="443,22"

case $1 in 
        start) 
                $0 stop 

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

$IPTABLES -F INPUT
$IPTABLES -F FORWARD
$IPTABLES -F OUTPUT
$IPTABLES -F PREROUTING
$IPTABLES -F POSTROUTING


echo 1 > /proc/sys/net/ipv4/ip_forward
echo "5" >/proc/sys/net/ipv4/icmp_ratelimit
echo "1" > /proc/sys/net/ipv4/conf/$EXTERN-DEV/rp_filter

                #Defines the INPUT rules

$IPTABLES -t filter -A INPUT  -i lo -j ACCEPT
$IPTABLES -t filter -A INPUT -p icmp -j ACCEPT 
# Wie schaffe ich es die Nachrichten vom Typ "redirect" zu filtern? - $IPTABLES -t filter -A INPUT -p redirect DROP - richtig?
$IPTABLES -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -t filter -A INPUT -s 0.0.0.0/0 -p tcp -m multiport --dport 
$INPUT_INTERNET_TCP_PORT -j ACCEPT

# "Es kann sinnvoll sein, ssh auf einem anderen Port als Port 22 laufen zu lassen,
# da hier relativ viele automatisierte Einbruchsversuche stattfinden.
# Generell den direkten root-Login per ssh abschalten, am besten Login per Kennwort generell verbieten,
# alles per Key machen."

# Diesen Kommentar verstehe ich nicht ganz, wie stelle ich ein, dass ssh über einen anderen Port läuft
# und dass man sich nicht direkt als root anmelden kann oder, dass man einen key braucht?


                #Defines the NAT rules 

$IPTABLES -A POSTROUTING -t nat -p tcp -o $EXTERN_DEV -s $INTERN -j MASQUERADE 
$IPTABLES -A POSTROUTING -t nat -p udp -o $EXTERN_DEV -s $INTERN -j MASQUERADE 
$IPTABLES -A POSTROUTING -t nat -p icmp -o $EXTERN_DEV -s $INTERN -j MASQUERADE

# Wie masquerade ich alle Protokolle, in dem ich nichts spezifiziere? - $IPTABLES -A POSTROUTING -t nat -p -o $EXTERN_DEV -s $INTERN -j MASQUERADE - richtig?

$IPTABLES -A FORWARD -p tcp ! --syn -j ACCEPT
$IPTABLES -A FORWARD -i $INTERN_DEV -o $EXTERN_DEV -s $INTERN -p tcp -m multiport --dport $NAT_FORWARDING_TCP_PORT -j ACCEPT
$IPTABLES -A FORWARD -m state --state NEW -p icmp -j ACCEPT 
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Das ist jetzt wieder zu kompliziert und gleichzeitig lückenhaft.
# Grundproblem: Die Forward-Chain ist sowohl für Pakete vom Internet in das interne Netz
# als auch andersrum zuständig. Es wird hier nun aber zwischen rein
# und raus nur anhand der IP-Adresse und anderer Inhalte des Paketes unterschieden.
# Viel einfacher und wasserdichter ist es, das per Bindung an das Input-Interface (-i) zu machen.
# Und außerdem die Portregeln von innen nach außen wegwerfen, Benutzergängelung!

# Kannst du mir die einfache und wasserdichte Regel grade so aufschreiben, versteh noch nicht ganz,
# wie sie aussehen müsste. Gerne auch mit Erklärung, man lernt ja gerne dazu.


                echo "Firewall & Routing activated" 

        ;; 

        stop) 
		$IPTABLES -P INPUT DROP
		$IPTABLES -P OUTPUT ACCEPT
		$IPTABLES -P FORWARD DROP

		$IPTABLES -F INPUT
		$IPTABLES -F FORWARD
		$IPTABLES -F OUTPUT
		$IPTABLES -F PREROUTING
		$IPTABLES -F POSTROUTING
                
        ;; 

        restart) 
                $0 start 
        ;; 

        *) 
                echo "Usage: $0 {startwd|stop|restart}" 
        ;; 

esac 


Liebe Grüsse
God´s disciple

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

Re: Vielen Dank schonmal

#4 Post by Janka »

godsdisciple wrote: Kann man da irgendwie zwei Modemverbindungen (noch ne richtig schön langsame telefonleitung) bündeln, dass der Rechner die als eine Verbindung ansieht?
Ja. Das muss die Gegenseite allerdings auch unterstützen. "Multilink PPP" heißt das Stichwort.
Oder muss ich dann auch in dem Script alle regeln für zum Beispiel ppp0 und ppp1 aufstellen?
Es gibt auch den Selektor ppp+, das passt dann auf alle ppp-Interfaces.

Code: Select all

# Firewallscript mit iptables
#
#!/bin/bash

INTERN=192.168.100.0/24
INTERN-DEV=eth0
EXTERN-DEV=ppp0
IPTABLES=/sbin/iptables

NAT_FORWARDING_TCP_PORT="21,25,80,110,143,443,993,5190,5222,6667,6668,1863"
INPUT_INTERNET_TCP_PORT="443,22"

case $1 in 
        start) 
                $0 stop 

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

$IPTABLES -F INPUT
$IPTABLES -F FORWARD
$IPTABLES -F OUTPUT
INTERN-DEV -> INTERN_DEV und entsprechend für extern.

Code: Select all

$IPTABLES -F PREROUTING
$IPTABLES -F POSTROUTING
Nein, da fehlt ein -t nat.

Code: Select all

echo 1 > /proc/sys/net/ipv4/ip_forward
echo "5" >/proc/sys/net/ipv4/icmp_ratelimit
echo "1" > /proc/sys/net/ipv4/conf/$EXTERN-DEV/rp_filter

                #Defines the INPUT rules

$IPTABLES -t filter -A INPUT  -i lo -j ACCEPT
Ok.

Code: Select all

$IPTABLES -t filter -A INPUT -p icmp -j ACCEPT 
# Wie schaffe ich es die Nachrichten vom Typ "redirect" zu filtern? - $IPTABLES -t filter -A INPUT -p redirect DROP - richtig?
Nein. Mit

Code: Select all

$IPTABLES -t filter -A INPUT -p icmp --icmp-type ! redirect -j ACCEPT

Code: Select all

$IPTABLES -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -t filter -A INPUT -s 0.0.0.0/0 -p tcp -m multiport --dport 
$INPUT_INTERNET_TCP_PORT -j ACCEPT
"Es kann sinnvoll sein, ssh auf einem anderen Port als Port 22 laufen zu lassen, da hier relativ viele automatisierte Einbruchsversuche stattfinden. Generell den direkten root-Login per ssh abschalten, am besten Login per Kennwort generell verbieten, alles per Key machen."
Diesen Kommentar verstehe ich nicht ganz, wie stelle ich ein, dass ssh über einen anderen Port läuft und dass man sich nicht direkt als root anmelden kann oder, dass man einen key braucht?
Das ist jetzt ein ganz weites Feld. Du musst viel mehr lesen. SSH auf einem anderen Port laufen zu lassen schafft man, indem man die Konfiguration des sshd ändert. Dort kann man auch direkte root-Logins abstellen. Dann muss man sich immer mit einem normalen Benutzernamen anmelden (der ja auch erst erraten werden müsste) und kann nach dem Login mit "su" zum root-Nutzer wechseln.

Zu SSH mit Keys gibt es auch gute Howtos. Suchen mit "ssh key" gibt viele brauchbare Treffer.

Code: Select all

                #Defines the NAT rules 

$IPTABLES -A POSTROUTING -t nat -p tcp -o $EXTERN_DEV -s $INTERN -j MASQUERADE 
$IPTABLES -A POSTROUTING -t nat -p udp -o $EXTERN_DEV -s $INTERN -j MASQUERADE 
$IPTABLES -A POSTROUTING -t nat -p icmp -o $EXTERN_DEV -s $INTERN -j MASQUERADE
Wie masquerade ich alle Protokolle, in dem ich nichts spezifiziere? - $IPTABLES -A POSTROUTING -t nat -p -o $EXTERN_DEV -s $INTERN -j MASQUERADE - richtig?
Ohne "-p".
$IPTABLES -A FORWARD -p tcp ! --syn -j ACCEPT
$IPTABLES -A FORWARD -i $INTERN_DEV -o $EXTERN_DEV -s $INTERN -p tcp -m multiport --dport $NAT_FORWARDING_TCP_PORT -j ACCEPT
$IPTABLES -A FORWARD -m state --state NEW -p icmp -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
[/code]
Das ist jetzt wieder zu kompliziert und gleichzeitig lückenhaft. Grundproblem: Die Forward-Chain ist sowohl für Pakete vom Internet in das interne Netz als auch andersrum zuständig. Es wird hier nun aber zwischen rein und raus nur anhand der IP-Adresse und anderer Inhalte des Paketes unterschieden.
Viel einfacher und wasserdichter ist es, das per Bindung an das Input-Interface (-i) zu machen. Und außerdem die Portregeln von innen nach außen wegwerfen, Benutzergängelung!
Kannst du mir die einfache und wasserdichte Regel grade so aufschreiben, versteh noch nicht ganz, wie sie aussehen müsste. Gerne auch mit Erklärung, man lernt ja gerne dazu.

Code: Select all

$IPTABLES -A FORWARD -i $INTERN_DEV -j ACCEPT
$IPTABLES -A FORWARD -i $EXTERN_DEV -m state --state NEW -p icmp -j ACCEPT 
$IPTABLES -A FORWARD -i $EXTERN_DEV -m state --state ESTABLISHED,RELATED -j ACCEPT

Code: Select all

                echo "Firewall & Routing activated" 

        ;; 

        stop) 
		$IPTABLES -P INPUT DROP
		$IPTABLES -P OUTPUT ACCEPT
		$IPTABLES -P FORWARD DROP

		$IPTABLES -F INPUT
		$IPTABLES -F FORWARD
		$IPTABLES -F OUTPUT
		$IPTABLES -F PREROUTING
		$IPTABLES -F POSTROUTING
                
        ;; 

        restart) 
                $0 start 
        ;; 

        *) 
                echo "Usage: $0 {startwd|stop|restart}" 
        ;; 

esac 
Wieder -t nat

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

godsdisciple
Posts: 3
Joined: 03. Apr 2009 14:57

#5 Post by godsdisciple »

Hey,
vielen vielen Dank.
Habs jetzt so abgeändert, war es richtig, dass -t nat hinter -F kommt beim flushen?
Genau, ich hoffe das ist jetzt gut so, werde mir dann mal noch viel über ports, ssh usw durchlesen und die Ports und dann auch die ssh einstellungen anpassen, aber soweit schonmal vielen Dank.
Wenn du sagst, dass ist gut so, gibt es hier die Regel, sein Thema als gelöst zu markieren?
Und gibt es eine Seite, an der ich mein Script testen kann?
Danke
Godsdisciple

Code: Select all


# Firewallscript mit iptables
#
#!/bin/bash

INTERN=192.168.100.0/24
INTERN_DEV=eth0
EXTERN_DEV=ppp+
IPTABLES=/sbin/iptables

NAT_FORWARDING_TCP_PORT="21,25,80,110,143,443,993,5190,5222,6667,6668,1863"
INPUT_INTERNET_TCP_PORT="443,22"

case $1 in 
        start) 
                $0 stop 

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

$IPTABLES -F INPUT
$IPTABLES -F FORWARD
$IPTABLES -F OUTPUT
$IPTABLES -F -t nat PREROUTING
$IPTABLES -F -t nat POSTROUTING


echo 1 > /proc/sys/net/ipv4/ip_forward
echo "5" >/proc/sys/net/ipv4/icmp_ratelimit
echo "1" > /proc/sys/net/ipv4/conf/$EXTERN-DEV/rp_filter

                #Defines the INPUT rules

$IPTABLES -t filter -A INPUT  -i lo -j ACCEPT
$IPTABLES -t filter -A INPUT -p icmp --icmp-type ! redirect -j ACCEPT
$IPTABLES -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -t filter -A INPUT -s 0.0.0.0/0 -p tcp -m multiport --dport 
$INPUT_INTERNET_TCP_PORT -j ACCEPT


                #Defines the NAT rules 

$IPTABLES -A POSTROUTING -t nat -o $EXTERN_DEV -s $INTERN -j MASQUERADE
$IPTABLES -A FORWARD -i $INTERN_DEV -j ACCEPT 
$IPTABLES -A FORWARD -i $EXTERN_DEV -m state --state NEW -p icmp -j ACCEPT 
$IPTABLES -A FORWARD -i $EXTERN_DEV -m state --state ESTABLISHED,RELATED -j ACCEPT


                echo "Firewall & Routing activated" 

        ;; 

        stop) 
		$IPTABLES -P INPUT DROP
		$IPTABLES -P OUTPUT ACCEPT
		$IPTABLES -P FORWARD DROP

		$IPTABLES -F INPUT
		$IPTABLES -F FORWARD
		$IPTABLES -F OUTPUT
		$IPTABLES -F -t nat PREROUTING
		$IPTABLES -F -t nat POSTROUTING
                
        ;; 

        restart) 
                $0 start 
        ;; 

        *) 
                echo "Usage: $0 {startwd|stop|restart}" 
        ;; 

esac 


Post Reply