iptables: --dport 22 ACCEPT geht, --dport 80 ACCEPT nicht

Gemeinsam ins Internet mit Firewall und Proxy.
Antworten
habam
Beiträge: 72
Registriert: 04.04.2002 13:12:07
Wohnort: Vorarlberg
Kontaktdaten:

iptables: --dport 22 ACCEPT geht, --dport 80 ACCEPT nicht

Beitrag von habam » 04.08.2002 15:44:40

Hy,

Habe mich ein wenig mit IPtables beschäftigt und mein Ziel ist es, einzelne Ports zu sperren. Bei ssh geht das gut, bei http und ftp gehts nicht so gut :) Ich weiss nicht was ich falsch mache, poste schnell ein Teil vom Skript Script:

[...]

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


### FORWARD

IPTABLES -A FORWARD -i $LAN_IFACE -o $INET_IFACE -p tcp --dport 80 -j ACCEPT
IPTABLES -A FORWARD -i $LAN_IFACE -o $INET_IFACE -p tcp --dport 22 -j ACCEPT
IPTABLES -A FORWARD -i $INET_IFACE -o $LAN_IFACE -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

[...]

WIe gesagt, bei "--dport 22" gehts, also wenn ich da auf ACCEPT umschalte, lässt er ssh durch, nur wenn ich "--dport 80" auf ACCEPT schlate, lässt er nichts durchkommen.
Nun meine Frage, was mach ich da falsch ? Bitte um Hilfe,
Mit freundlichen Grüßen,
Daniel

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 04.08.2002 16:00:36

Hmmm... Da die beiden Zeilen für SSH und WWW identisch sind, sollten die auch identisch tun.

Nur zur Sicherheit: Du testest nicht SSH vom Router aus, und WWW von einem anderen LAN Rechner aus? 8O

Wenn Du an einem Dial-Up hängst (auch DSL) brauchst Du mit 99.9%iger Sicherheit Masquerading. Ist das aktiviert? Wenn ja: check 'mal die IPTABLES Doku, ob Du mit den Accept Regeln nicht irgendwie das Masquerading aushebelst (-J MASQUERADE statt -J ACCEPT). Manche Protokolle funktionieren irgendwie scheinbar auch ohne richtiges Masquerading (wenigstens scheinbar).

FTP ist da eh' eine andere Geschichte wegen dem Rückkanal...

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

habam
Beiträge: 72
Registriert: 04.04.2002 13:12:07
Wohnort: Vorarlberg
Kontaktdaten:

Beitrag von habam » 04.08.2002 16:04:46

nein, ich teste alles vom gleichen rechner aus - ein LAN Rechner, der hinter der Firewall steht.

Habe Kabel, Masquerading habe ich eingeschaltet.

Was muss man bei FTP beachten ?
... und wieso geht mein http-forward immer noch nicht ? :)

Mfg,
Daniel

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 04.08.2002 16:57:37

Für ftp brauchst Du das ftp_conntrack Modul.
IPTABLES -A FORWARD -i $LAN_IFACE -o $INET_IFACE -p tcp --dport 80 -j ACCEPT
Sehe ich das richtig, dass Du abgehende Verbindungen blocken willst? Also Verbindungen zu externen Webservern z.B.?

Check 'mal die Regeln, die Wirklich in der Firewall sind (iptables -L).

Hast Du sonst eine funktionierende Firewall? Also ein Konfig mit der alle Rechner ins Netz kommen?

Was willst Du überhaupt erreichen?

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

habam
Beiträge: 72
Registriert: 04.04.2002 13:12:07
Wohnort: Vorarlberg
Kontaktdaten:

Beitrag von habam » 04.08.2002 17:56:42

Hy,

An den Modulen scheiterts eher nicht, hab alles in den Kernel eingebunden (alle Module)

Naja, so hab ich es gedacht, ja. Aber ist egal, mich würden beide Seiten interessieren, also einmal die ausgehenden blocken, einmal die reinkommenden.
Ich will einzelne Ports von einzelnen Computern sperren und freigeben. Aber dazu muss es erst bei einem einzelnen funktionieren :)

Mfg,
Daniel

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 04.08.2002 22:19:33

Tja, da steh' ich jetzt aber auch etwas auf dem Schlauch...

Versuch's 'mal mit dem unten stehenden Skript, das ich hier eine Zeitlang als Firewall verwendet habe...
Das Skript ist allerdings für DSL (pppoe) ausgelegt, daher ist ppp0 das Inet-Interface. Der Regelsatz erlaubt Port 22 und 80 inbound (WWW und SSH), und alles outbound bis auf Port 80 (WWW).

Die Konfiguration ist so: outbound grundsätzlich erlaubt, ausser explizit ausgenommen, inbound grundsätzlich alles verboten, ausser explizit ausgenommene.

Die Regel "clamp-mss-to-pmtu" bracuht man nur für pppoe Interfaces, damit auch alle Sites erreichbar sind.

Outbound blocking ist auch etwas tricky, weil man da schnell was vergisst (UDP Port53 (DNS) z.B.)

Code: Alles auswählen

#
# Enable Masquerading and IP forwarding
#
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

#
# Enable Firewalling
#
iptables -A INPUT -i ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allowed inbound traffic
iptables -A INPUT -i ppp0 -p tcp -m state --state NEW --dport 22 -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp -m state --state NEW --dport 80 -j ACCEPT
#Allowed inbound traffic end

iptables -A INPUT -i ppp0 -j DROP
iptables -P INPUT ACCEPT
iptables -A OUTPUT -o ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Prohibited outbound traffic
iptables -A OUTPUT -o ppp0 -p tcp -m state --state NEW --dport 80 -j DROP
# Prohibited outbound end

iptables -A OUTPUT -o ppp0 -p tcp -m state --state NEW -j ACCEPT
iptables -A OUTPUT -o ppp0 -j DROP
iptables -I FORWARD -j TCPMSS -o ppp0 --clamp-mss-to-pmtu -p tcp --tcp-flags SYN,RST SYN
Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

habam
Beiträge: 72
Registriert: 04.04.2002 13:12:07
Wohnort: Vorarlberg
Kontaktdaten:

Beitrag von habam » 05.08.2002 20:48:45

Ich habs grad versucht mit deinem Skript und es für meine Netzwerkinterfaces umgeschrieben. Nur es ist genau das passiert was ich befürchtet habe:

Wenn ich dein Skript ausführe, gehts soweit, dass er ssh Verbindungen durchlässt, http Verbindungen nicht.
Soda, jetzt müsste man denken, wenn man in der Zeile:
[...]
# Prohibited outbound traffic
iptables -A OUTPUT -o ppp0 -p tcp -m state --state NEW --dport 80 -j DROP
# Prohibited outbound end
[...]
--dport auf 22 setzt müsste es umgekehrt sein (ssh wird geblockt, http müsste gehen) Tut es aber nicht (http wird auch geblockt). Muss ich bei http (wie bei FTP) was bestimmtes im Auge behalten, weil bei ssh funktionierts immer wie es sollte, nur bei http und ftp nicht.

Mfg, bitte um weitere Hilfe - danke.
Daniel

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 05.08.2002 23:46:24

Sach' mal...

Wenn Du mit den Skripten rumexperimentierst, dann löschst Du doch bevor Du so ein Skript neu ausfrufst jedesmal auch alle FW Regeln oder???
Ich habe diese kleine Skript von mir hier nämlich gerade nochmal getestet, und es funktioniert einwandfrei, wie von mir behauptet. ;-)
Worauf ich hinaus will: der Fehler muss also irgendwo anders sein, und (ohne böse Unterstellung) tippe ich fast schon auf einen Pilotenfehler... :?

Firewallregeln im Kernel sind kumulativ, d.h. wenn Du mein Skript 2mal aufrufst (mit der Änderung), dann hast Du jede Regel 2mal drin, und das gibt dann Unsinn.

Nimm 'mal mein Skript von oben, und blocke abgehendes WWW. Dann führ das kleine Skript von unten aus, das alle Regeln der Firewall restlos wegschiesst, und alles auf default setzt. Dann nimm wieder mein Skript von oben, und blockiere aber diesmal abgehendes SSH. Geht's dann?

clear_firewall.sh:

Code: Alles auswählen

#!/bin/sh
#
# Configurations
#
IPTABLES="/sbin/iptables"

#
# reset the default policies in the filter table.
#
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT

#
# reset the default policies in the nat table.
#
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT

#
# reset the default policies in the mangle table.
#
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT

#
# flush all the rules in the filter and nat tables.
#
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
#
# erase all chains that's not default in filter and nat table.
#
$IPTABLES -X
$IPTABLES -t nat -X
$IPTABLES -t mangle -X
Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

habam
Beiträge: 72
Registriert: 04.04.2002 13:12:07
Wohnort: Vorarlberg
Kontaktdaten:

Beitrag von habam » 06.08.2002 20:14:55

Hy,

Ja, also ich hab iptables immer neu gestartet (mit -f -X usw.) Habs trotzdem auch mit deinem Neustartskript versucht, klappe auch nicht.

Habe dein firewallskript nochmal komplett neu überarbeitet und ich bin sicher, ich hab nichts übersehen.
Ist es möglich das es was mit dem DHCP-Client zu tun den ich am laufen habe, das es nicht tut ? Hab mit meinem Netzwerksniffer geschaut, da kommen als einzige ausgehende (nicht ankommende) Verbindungen DHCP-Protokolle. Wieso funktioniert dann aber ssh wenn ich es nicht blocke und nicht auch http ?

Weitere Vörschläge ? :)
Bin um jede Hilfe froh.
Daniel

PS: Anbei der Teil von deinem - von mir geänderten - Skript

Code: Alles auswählen


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



### MASQUERADING

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


#
# Enable Firewalling
#
$IPTABLES -A INPUT -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allowed inbound traffic
$IPTABLES -A INPUT -i $INET_IFACE -p tcp -m state --state NEW --dport 22 -j ACCEPT
$IPTABLES -A INPUT -i $INET_IFACE -p tcp -m state --state NEW --dport 80 -j ACCEPT
#Allowed inbound traffic end

$IPTABLES -A INPUT -i $INET_IFACE -j DROP
$IPTABLES -P INPUT ACCEPT
$IPTABLES -A OUTPUT -o $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

# Prohibited outbound traffic
$IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m state --state NEW --dport 22 -j DROP
# Prohibited outbound end

$IPTABLES -A OUTPUT -o $INET_IFACE -p tcp -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -o $INET_IFACE -j DROP

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 06.08.2002 20:47:36

Also gut... jetzt hat's mich gepackt, und ich will's wissen...

Ich habe Dein Skript genommen, und 2 Versionen gemacht: eine die abgehenden Post 22 blockt und eine die abgehnden Port 80 blockt.

Wenn ich das auf der Firewall teste, dann funktioniert alles, wie es soll. Abgehender Port 80 geblockt: SSH funktioniert, WWW nicht (nur von der Firewall aus!!!) Abgehender Port 22 geblockt: WWW funktioniert, SSH nicht (wiederum nur auf der Firewall getestet).

Von einem Client im Netz aus geht GAR NICHTS! (Wahrscheinlich weil FORWARD auf DROP Policy steht) Ausserdem geht alles (von der Firewall aus nur mit IP Adressen, weil DNS (UDP/TCP Port 53) geblockt ist.

Nur so als kleine Zwischeninfo. Ich experimentiere hier jetzt weiter, und lasse Dich wissen, was ich finde...

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

habam
Beiträge: 72
Registriert: 04.04.2002 13:12:07
Wohnort: Vorarlberg
Kontaktdaten:

Beitrag von habam » 06.08.2002 21:38:48

Soda, jetzt ist mir vorhin grad n Gedanke gekommen:

Was wenn sich die vielen ACCEPTs nicht "vertragen" ? (also wenn ich die POLICY auf ACCEPT setze und dann nochmal eine Regel aufstelle die ebenfalls auf -j ACCEPT rausläuft - wie in dem Skript ja der Fall bei OUTPUT) Hab es vorhin probiert, kurzzeitig funktionierts (kommt wohl daher das die Verbindungen anschliessend immer noch ESTABLISHED sind) aber vielleicht auch nicht, wer weiss ...

Morgen schau ich mal weiter.
Danke für deine Hilfe mal so nebenbei ...
Wär nett, wenn mir dann von deinen neuen Erkenntnissen erzählen könntest.

Daniel

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 06.08.2002 22:18:15

Nein, an den ACCEPTS liegt es nicht... wohl schon eher daran, dass ich mich nicht mehr richtig daran erinnert habe wofür ich die Konfig damals benutzt habe :oops: (Damals hatte ich keinen Router)

Okay... Ich habe eine komplett neue (und von allen Seiten getestete) Konfig gemacht, und siehe da... es funktioniert. Erklärung folgt unten:

Code: Alles auswählen

#!/bin/sh

# Konfiguration
IPTABLES=/sbin/iptables
INET_IFACE=ppp0
INTERNAL_NET=192.168.0.0/24

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

### MASQUERADING

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

#
# Enable Firewalling
#
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


#
# Hier wird die Firewall selbst geschützt (aus dem Internet kommender Traffic)
# Regeln für die Firewall/den Router selbst
#
# WWW ist OK
$IPTABLES -A INPUT -i $INET_IFACE -m state --state NEW -p tcp --dport 80 -j ACCEPT
# SSH ist OK
$IPTABLES -A INPUT -i $INET_IFACE -m state --state NEW -p tcp --dport 22 -j ACCEPT
# Alles andere aus dem Internet ist für den Router NICHT OK
$IPTABLES -A INPUT -i $INET_IFACE -j DROP

# die FW darf kein abgehendes WWW machen
$IPTABLES -A OUTPUT -o $INET_IFACE -m state --state NEW -p tcp --dport 80 -j DROP
# ansonsten darf die FW beliebig ins Netz senden
$IPTABLES -A OUTPUT -o $INET_IFACE -m state --state NEW -j ACCEPT

##########################################################################
# An diesem Punkt können alle Maschinen des internen Netzes ins Internet #
# und man kann aus dem Internet WWW und SSH auf dem Router erreichen     #
# Ausserdem sind alle internen Maschinen durch das MASQ geschützt, da    #
# sie nicht erreichbar sind (privates Netz, siehe unten)                 #
# Das habe ich mit nmap getestet!!!                                      #
##########################################################################

#
# Hier sind die Regeln für das interne Netz. Alles in die FORWARD Chain,
# wobei man masquerading einfach ignorieren kann.
# Die internen Hosts muss man nicht explizit vor dem Internet schützen,
# wenn sie Adressen aus einem privaten Subnetz haben (192.168.*.* 10.*.*.* 172.16.*.* bis 172.31.*.*)
# weil diese Adressen nicht im Internet gerouted werden
# Explizite Schutzregeln der internen Hosts machen mehr Probleme, als dass sie nützen!
#

# Abgehendes SSH ist für alle internen Rechner verboten
$IPTABLES -A FORWARD -o $INET_IFACE -p tcp --dport 22 -m state --state NEW --source $INTERNAL_NET -j DROP
# 192.168.0.3 darf auch kein WWW
$IPTABLES -A FORWARD -o $INET_IFACE -p tcp --dport 80 -m state --state NEW --source 192.168.0.3 -j DROP
Das Problem war, dass durch die "ungünstigen" Policies (insbesondere FORWARD = DROP) bestimmter Netzwerk Traffic (u.a. DNS) nicht geforwardet wurde. Allgemein habe ich meine Firewalls immer so konstriert, dass die Policies alle auf ACCEPT stehen, und jede Chain eine explizite Regel am Ende hat, die unerwünschten Traffic blockt.

Bei FORWARD existiert keine solche Regel, da die Rechner schon durch MASQ geschützt sind. Jeder Versuch eine solche Regel einzubauen führte bei mir dazu, dass es sofort nicht mehr funktionierte...

Aus Rusty's unreliable Iptables Guide habe ich folgendes Diagramm:

Code: Alles auswählen

                          _____
Incoming                 /     \         Outgoing
       -->[Routing ]--->|FORWARD|------->
          [Decision]     \_____/        ^
               |                        |
               v                       ____
              ___                     /    \
             /   \                   |OUTPUT|
            |INPUT|                   \____/
             \___/                      ^
               |                        |
                ----> Local Process ----
                      (Firewall)
Damit war's dann (fast) ganz einfach... ;-)

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

habam
Beiträge: 72
Registriert: 04.04.2002 13:12:07
Wohnort: Vorarlberg
Kontaktdaten:

Beitrag von habam » 08.08.2002 16:20:24

Hy,

Wie das mit Forward funktioniert wusste ich schon, danke.

Dank deiner Hilfe funktioniert jetzt aber auch meine Firewall so wie sie soll (im Moment zumindest noch) Habs zwar noch nicht in mein eigenes Skript eingebunden, bin aber zuversichtlich das es klappt.

Danke nochmal für deine Hilfe.
Mfg,
Daniel

Antworten