Hilfe zu iptables - Firewallscript für Netzwerk

Antworten
Nachricht
Autor
godsdisciple
Beiträge: 3
Registriert: 03. Apr 2009 14:57

Hilfe zu iptables - Firewallscript für Netzwerk

#1 Beitrag von godsdisciple » 03. Apr 2009 15:23

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: Alles auswählen

# 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

Benutzeravatar
Janka
Beiträge: 3581
Registriert: 11. Feb 2006 19:10

Re: Hilfe zu iptables - Firewallscript für Netzwerk

#2 Beitrag von Janka » 03. Apr 2009 18:59

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

Code: Alles auswählen

# Firewallscript mit iptables
#
#!/bin/bash

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

Code: Alles auswählen

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: Alles auswählen

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: Alles auswählen

$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: Alles auswählen

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

Code: Alles auswählen

$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: Alles auswählen

$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: Alles auswählen

$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: Alles auswählen

                #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: Alles auswählen

                #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: Alles auswählen

$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: Alles auswählen

$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: Alles auswählen

                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: Alles auswählen

        ;; 

        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
Beiträge: 3
Registriert: 03. Apr 2009 14:57

Vielen Dank schonmal

#3 Beitrag von godsdisciple » 06. Apr 2009 14:26

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: Alles auswählen

# 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

Benutzeravatar
Janka
Beiträge: 3581
Registriert: 11. Feb 2006 19:10

Re: Vielen Dank schonmal

#4 Beitrag von Janka » 07. Apr 2009 12:23

godsdisciple hat geschrieben: 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: Alles auswählen

# 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: Alles auswählen

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

Code: Alles auswählen

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: Alles auswählen

$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: Alles auswählen

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

Code: Alles auswählen

$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: Alles auswählen

                #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: Alles auswählen

$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: Alles auswählen

                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
Beiträge: 3
Registriert: 03. Apr 2009 14:57

#5 Beitrag von godsdisciple » 07. Apr 2009 23:49

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: Alles auswählen


# 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 


Antworten