• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Probleme mit der Einrichtung des Routers

Spacecop

Newbie
Hallo Forengemeinde,

vielleicht kann mir von euch einer helfen, ich bin mit meinem Latein langsam am Ende, obwohl ich hier schon seit Tagem die Hilfefunktion genutzt hab, komm ich nicht wirklich weiter.

Ich hab mein Suse 9.1 Prof. als Router eingerichtet. Das Skript heißt routerd und und ist mit Runlevel 2,3,5 eingerichtet.
Nach dem Router sollen 2 WinXP Rechner ins Internet können.
eth0 hat 192.168.2.1 und ist mit dem DSL Modem verbunden. Mit dem Linux PC kann ich ins Internet, also die Verbindung steht.
Alle 3 PC's sind mit einem Switch verbunden.
eth1 hat 192.168.1.12 für das lokale Netzwerk.
XP PC 1 hat 192.168.1.10, XP PC 2 hat 192.168.1.11, Subnet im lokalen Netz ist 255.255.255.0.
Bei den XP Pc's kann ich alle IP's im lokalen Netzwerk anpingen, nur ins Internet kann ich nicht.
Firewall ist noch abgeschalten. Hab es auch schon mit Firewall probiert, IP Forward war eingeschaltet. Ging aber auch nicht.

In der resolv.conf hab ich die Nameserver eingetragen.

Die IP von eth1 (192.168.1.12) ist als Gateway bei den XP PC eingetragen. T-Online Nameserver als DNS.

Hier das Skript der routerd:

#!/bin/sh

rcnamed start

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


iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/16 -d 0/0 -j MASQUERADE

iptables -A FORWARD -i ppp0 -d 192.168.1.0/24 -j ACCEPT


iptables -A FORWARD -o ppp0 -p TCP --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

iptables -A INPUT -i ppp0 -p TCP --dport 25 -j DROP
iptables -A INPUT -i ppp0 -p TCP --dport 111 -j DROP
iptables -A INPUT -i ppp0 -p TCP --dport 135 -j DROP
iptables -A INPUT -i ppp0 -p TCP --dport 139 -j DROP
iptables -A INPUT -i ppp0 -p TCP --dport 445 -j DROP
iptables -A INPUT -i ppp0 -p TCP --dport 631 -j DROP
iptables -A INPUT -i ppp0 -p TCP --dport 953 -j DROP

iptables -t nat -A PREROUTING -i ppp0 -p UDP --dport 20000:20050 -j DNAT --to-destination 192.168.1.3
iptables -t nat -A PREROUTING -i ppp0 -p UDP --dport 22222:22232 -j DNAT --to-destination 192.168.1.3
iptables -t nat -A PREROUTING -i ppp0 -p TCP --dport 8396 -j DNAT --to-destination 192.168.1.3

iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

iptables -t nat -A PREROUTING -i ppp0 -p TCP --dport 4662 -j DNAT --to-destination 192.168.1.10
iptables -t nat -A PREROUTING -i ppp0 -p TCP --dport 80 -j DNAT --to-destination 192.168.1.10
iptables -t nat -A PREROUTING -i ppp0 -p UDP --dport 5662 -j DNAT --to-destination 192.168.1.10
iptables -t nat -A PREROUTING -i ppp0 -p TCP --dport 24500:24505 -j DNAT --to-destination 192.168.1.10

iptables -t nat -A PREROUTING -i ppp0 -p TCP --dport 4662 -j DNAT --to-destination 192.168.1.11
iptables -t nat -A PREROUTING -i ppp0 -p UDP --dport 5662 -j DNAT --to-destination 192.168.1.11
iptables -t nat -A PREROUTING -i ppp0 -p TCP --dport 24500:24505 -j DNAT --to-destination 192.168.1.11
iptables -t nat -A PREROUTING -i ppp0 -p TCP --dport 80 -j DNAT --to-destination 192.168.1.11

iptables -t nat -A PREROUTING -i ppp0 -p TCP --dport 4662 -j DNAT --to-destination 192.168.1.13
iptables -t nat -A PREROUTING -i ppp0 -p UDP --dport 5662 -j DNAT --to-destination 192.168.1.13
iptables -t nat -A PREROUTING -i ppp0 -p TCP --dport 24500:24505 -j DNAT --to-destination 192.168.1.13
iptables -t nat -A PREROUTING -i ppp0 -p TCP --dport 80 -j DNAT --to-destination 192.168.1.13

iptables -A FORWARD -j DROP

Was mach ich falsch, wo ist mein Denkfehler?
Vielen Dank schon im Voraus für eurer Bemühen.
 

gaw

Hacker
Da sind gleich mehrere (Denk)Fehler zu erkennen.

Der erste und wichtigste sind die ganzen PREROUTING-Anweisungen, die sind völlig überflüssig.

Schmeiß die alle raus und dann gibst du stattdessen Befehle der folgenden Art ein:

INTERFACE_EXT="ppp0" # bei DSL
INTERFACE_INT="ethx" # Hier musst du deine Schnittstelle zum heimischen Netz eintragen

## Regelsatz für den http Verkehr aus dem lokalen Netz:

/usr/sbin/iptables -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \
-m state \
--state NEW,ESTABLISHED,RELATED -p TCP --sport 1024:65535 \
--dport http -j ACCEPT

/usr/sbin/iptables -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT \
-m state \
--state ESTABLISHED,RELATED -p TCP --sport http \
--dport 1024:65535 -j ACCEPT


Pakete der anderen Rechner aus deinem Netz müssen über die FORWARD Kette laufen. Forwarding bedeutet in diesem Zusammenhang Weiterleitung, der eigentlich korrekte Ausdruck für das, was die meisten Routen nennen, das eigentliche Routen ist nämlich noch was anderes.
Also die Kette FORWARD ist für die Weiterleitung der Pakete zuständig. Ein Prerouting ist dazu nicht notwendig. Oben steht ein Beispiel einer Regel die den http-Verkehr aus deinem internen Netz ins Internet und zurück mit statefull inspection erlaubt.
Beim TCP-3 Wegehandschlag zum Verbindungsaufbau wird ein bestimmtes Bit gesetzt, das einem Rechner im Internet, auf dem ein Webserver läuft signalisiert, dass eine Verbindung gewünscht wird. Mit der syntax "-m state --state NEW,ESTABLISHED,RELATED" erlaube ich das ein solcher Verbindungsaufbau stattfinden darf.
Umgekehrt darf aber kein Verbindungsaufbau aus dem Internet stattfinden. Es dürfen nur Pakete durchgelassen werden die zu bestehenden oder ruhenden Verbindungen gehören. Daher fehlt dem rücklaufenden Verkehr das NEW in der zweiten Regel. Für diese zurückkehrenden Pakete müssen natürlich die oberen Ports frei sein. Es gibt nun unterschiedliche Designs einer Firewall, manche geben diese Ports generell frei, andere formulieren dezidierte Regeln so dass auch nur die Pakete angenommen werden, dessen Quellport übereinstimmt. So einen Regelsatz habe ich dir hier hingeschrieben.

Nebenbei fehlt deinem Script noch einiges an Sicherheitsfeatures, die du zusätzlich einschalten solltest:

echo "0" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

Und für jedes deiner gültigen Schnittstellen auch dieser Satz:

# Bedeutung siehe oben
INTERFACES="$INTERFACE_EXT $INTERFACE_INT"

for if in $INTERFACES;
do
echo "1" > /proc/sys/net/ipv4/conf/$if/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/$if/accept_redirects
echo "0" > /proc/sys/net/ipv4/conf/$if/accept_source_route
echo "0" > /proc/sys/net/ipv4/conf/$if/bootp_relay
echo "1" > /proc/sys/net/ipv4/conf/$if/log_martians
done

Das schützt den Rechner und andere vor Brodcaststürmen, spoofing, verhindert andere böse Attacken, schaltet das überflüssige Loggin von icmp-Pakete ab und das von ungültigen IP-Paketen ein.

Natürlich ist das nicht alles, zum Schluss nachdem du alle Regeln aufgesetzt hast, solltest du den Rest sperren:

/usr/sbin/iptables -A INPUT -j DROP
/usr/sbin/iptables -A FORWARD -j DROP
/usr/sbin/iptables -A OUTPUT -j DROP

Das ist einfacher als alles einzeln abzuwehren. Du erlaubst nur die Ports die du durch explizite Regeln definierts. Der Rest wird abgeblockt. Diese Strategie ist besser als alles zu erlauben und nur bestimmte Ports zu verbieten. Du hängst dann immer der aktuellen Entwicklung von Trojanern hinterher die bestimmte Ports öffnen.

Das ist natürlich noch kein komplettes Firewall-Skript. Es fehlen noch die lokalen Prozesse, und anderes. Aber es hilft dir vielleicht dein eigenes Skript aufzusetzen. Für den Verkehr des Routers ins Internet (INPUT/OUTPUT über INTERFACE_EXT) solltest du den Port 53 und icmp echo/request Anfragen freigeben. Was du den Rechnern im Netz erlaubst ist natürlich deine Sache.

Die Kette PREROUTING brauchst du erst dann, wenn du DNAT oder portforwarding einsetzen willst. Das ist dann notwendig, wenn du einen eigenen Webserver, einen transparenten Proxy, ident, dcc oder emule & co laufen läßt, also immer dann wenn ein Rechner aus dem Internet durch die Firewall hindurch einen deiner Rechner neu kontaktieren darf. Diese Regeln sind aber stets Löcher in deiner Firewall und sollten vorsichtig angewendet werden, vielleicht temporär über verschiedene Skripte oder über ein Skript mit Parametern.


mfG
gaw
 
OP
Spacecop

Spacecop

Newbie
sorry, daß ich mich erst jetzt melde, war beruflich etwas eingespannt und konnte die Antwort erst jetzt lesen.

Ich werd das Skript mal nach Deinen Ratschöägen modifizieren und bei auftretenden Schwierigkeiten nochmals nachfragen.

Vielen Dank (!!!!) erstmal im Voraus.

Gruß
Space
 

-ntfs-

Newbie
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/16 -d 0/0 -j MASQUERADE

außerdem solltest du aus der /16 ne /24 machen.

mfg timo
 
OP
Spacecop

Spacecop

Newbie
Tach,

im Moment sitz ich leider nicht an meinem PC, aber ich hab mir mal ein neues Skript zusammen geschrieben (unter Einbindung eurer Hilfen)

Könnte das nun so funktionieren?

#!/bin/sh

rcnamed start

echo "0" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

INTERFACES="$INTERFACE_EXT $INTERFACE_INT"

INTERFACE_EXT="ppp0"
INTERFACE_INT="eth1"
for if in $INTERFACES;
do
echo "1" > /proc/sys/net/ipv4/conf/$if/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/$if/accept_redirects
echo "0" > /proc/sys/net/ipv4/conf/$if/accept_source_route
echo "0" > /proc/sys/net/ipv4/conf/$if/bootp_relay
echo "1" > /proc/sys/net/ipv4/conf/$if/log_martians
done

iptables -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \ -m state \
--state NEW,ESTABLISHED,RELATED -p TCP --sport 1024:65535 \
--dport http -j ACCEPT for if in $INTERFACES;
do

echo "1" > /proc/sys/net/ipv4/conf/$if/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/$if/accept_redirects
echo "0" > /proc/sys/net/ipv4/conf/$if/accept_source_route
echo "0" > /proc/sys/net/ipv4/conf/$if/bootp_relay
echo "1" > /proc/sys/net/ipv4/conf/$if/log_martians
done

iptables -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \ -m state \
--state NEW,ESTABLISHED,RELATED -p TCP --sport 1024:65535 \
--dport http -j ACCEPT

iptables -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT \ -m state \
--state ESTABLISHED,RELATED -p TCP --sport http \
--dport 1024:65535 -j ACCEPT

iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.1.0/24 -d 0/0 -j MASQUERADE

iptables -A FORWARD -i ppp0 -d 192.168.1.0/24 -j ACCEPT

iptables -A FORWARD -o ppp0 -p TCP --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

iptables -A INPUT -i ppp0 -p TCP --dport 25 -j DROP
iptables -A INPUT -i ppp0 -p TCP --dport 111 -j DROP
iptables -A INPUT -i ppp0 -p TCP --dport 135 -j DROP
iptables -A INPUT -i ppp0 -p TCP --dport 139 -j DROP
iptables -A INPUT -i ppp0 -p TCP --dport 445 -j DROP
iptables -A INPUT -i ppp0 -p TCP --dport 631 -j DROP
iptables -A INPUT -i ppp0 -p TCP --dport 953 -j DROP

iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP
iptables -A OUTPUT -j DROP

Gruß
Space
 

gaw

Hacker
Hier ist etwas doppelt:

Code:
sport 1024:65535 \ 
--dport http -j ACCEPT for if in $INTERFACES; 
do  

echo "1" > /proc/sys/net/ipv4/conf/$if/rp_filter 
echo "0" > /proc/sys/net/ipv4/conf/$if/accept_redirects 
echo "0" > /proc/sys/net/ipv4/conf/$if/accept_source_route 
echo "0" > /proc/sys/net/ipv4/conf/$if/bootp_relay 
echo "1" > /proc/sys/net/ipv4/conf/$if/log_martians 
done

In deinem Script ist die zweite Regel überflüssig, weil du am Anfang allen Paketen erlaubt hast zurückzukehren. In einem solchen Design musst du den http-Paketen dass nicht noch extra erlauben


Code:
iptables -A FORWARD -i $INTERFACE_INT -o $INTERFACE_EXT \ -m state \ 
--state NEW,ESTABLISHED,RELATED -p TCP --sport 1024:65535 \ 
--dport http -j ACCEPT 

iptables -A FORWARD -i $INTERFACE_EXT -o $INTERFACE_INT \ -m state \ 
--state ESTABLISHED,RELATED -p TCP --sport http \ 
--dport 1024:65535 -j ACCEPT




Die nächste Zeile konterkarriert deine ganze Firewall dadurch öffnest du sämrliche Ports. Du versuchst hier verschiedene Designformen zu mischen. Schmeiss die Zeile enfach raus

Code:
iptables -A FORWARD -i ppp0 -d 192.168.1.0/24 -j ACCEPT



Folgende Regeln sind teils ganz zu löschen. Dein Design sieht jetzt anders aus. Durch die Letzten Regeln verbietest du den Rest, daher ist es unnötig einzelne Pakete noch extra löschen zu wollen, die später sowieso verworfen werden, das verlängert nur die Aufenthaltszeit im Kernelspace.

Code:
iptables -A INPUT -i ppp0 -p TCP --dport 25 -j DROP 
iptables -A INPUT -i ppp0 -p TCP --dport 111 -j DROP 
iptables -A INPUT -i ppp0 -p TCP --dport 135 -j DROP 
iptables -A INPUT -i ppp0 -p TCP --dport 139 -j DROP 
iptables -A INPUT -i ppp0 -p TCP --dport 445 -j DROP 
iptables -A INPUT -i ppp0 -p TCP --dport 631 -j DROP 
iptables -A INPUT -i ppp0 -p TCP --dport 953 -j DROP


Dafür gehören relativ an den Anfang deines Scriptes noch diese Regeln:
Code:
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT  -i lo -j ACCEPT

Es kommunizieren manche lokale Prozesse auf deinem Rechner über die Netzwerkschnittstelle lo.
Das solltest du schon gestatten;)

Es ist nicht sehr empfehlenswert verschiedene Konzepte zu mischen. Du solltest versuchen die Regeln zu verstehen, nicht einfach zu kopieren. Ansonsten ist es besser eine fertige Firewall zu benutzen.

Es gibt grundsätzlich verschiedene Herangehensweisen:
1. Erlaube alles und verbiete das ausdrücklich was du nicht willst (allow, deny)
2. Verbiete alles grundsätzlich und erlaube nur das was du willst (deny allow).

Das erste Prinzip ist aber unsicherer, weil jeder offene Port ein Sicherheitsrisiko für Backdoor und Trojaner sein kann. Es kann hilfreich sein sich die Ketten aufzuzeichnen und den Weg der Pakete im Kernel nachzuvollziehen. Vielleicht liest du dir noch einmal grundsätziches über iptables durch. Zu empfehlen sind:
http://www.oreilly.de/catalog/linuxfireger/
das Oreilly auch als kostenlose Download Version im Latexformat anbietet
http://www.oreilly.de/german/freebooks/linuxfireger/index.html
sowie das sehr gute Buch von Wolfgang Barth:
http://www.suse.de/de/private/products/books/3_899900_44_8/index.html
Sowie folgende Quellen:
http://www.linuxsecurity.com/resource_files/firewalls/IPTables-Tutorial/iptables-tutorial.html
Und nicht zu vergessen die Übersetzungen der original Rusty-Tutorials
http://www.netfilter.org/documentation/HOWTO/de/networking-concepts-HOWTO.html
http://www.netfilter.org/documentation/HOWTO/de/packet-filtering-HOWTO.html


mfg
gaw
 
OP
Spacecop

Spacecop

Newbie
Vielen Dank erstmal für Deine/Eure Hilfe.

Die Ratschläge mit der Literatur werde ich mir zu Herzen nehmen. Hab zwar schon das eine oder andere gelesen (mehr hier im Form, als aus Büchern), aber ich bin da mehr der Learning by Doing-Typ.

Angefangen hab ich mit der 20 min Router Erstellung aus dem Forum hier, aber das hat nicht so geklappt.

Vielleicht hab ich mich auch etwas übernommen. Das lokale Netzwerk steht und alle Rechner sind untereinander anzupingen. Aber mit den XP Clients komm ich eben nicht ins Internet.

Gruß
Space
 

gaw

Hacker
Der nächste Schritt besteht im Masquerading. Das sind drei Zeilen auf dem Router:
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
/usr/sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

Dann müsste zumindestens der Zugang zum Internet laufen.


mfG
gaw
 
Oben