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

Firewallskript bitte Korrektur lesen

Beppo

Member
Hallo Leute!

Nachdem ich mich mit unserem Router beschäftigen musste,
weil er veraltet und mir nicht mehr update fähig schien,
ein Buch über Firewalls, hier im Form fündig geworden bin,
habe ich mir ein Skript gebastelt.
Jetzt bin ich mir aber alles andere als sicher, dass ich alles richtig gemacht habe.
Wärt ihr so freundlich und würdet mal drüber schauen.
Ich hoffe es ist soweit kommentiert das ich es nicht weiter erklären
muss.
Den schlechten Zeilenumbruch bitte ich zu entschuldigen ...

danke im Voraus

Grüße Beppo



#!/bin/sh

# ------------------------------------------------------------------------
# Grundeinstellungen
# ------------------------------------------------------------------------

if test -x /sbin/iptables
then
R=/sbin/iptables
if test -x /usr/sbin/iptables
then
echo -en "${C_RED}${0}: ERROR: Es gibt 2 Programme iptables. "
echo -e "Breche ab! ${C_RESET}"
exit 1
fi
else
if test -x /usr/sbin/iptables
then
R=/usr/sbin/iptables
else
echo -en "${C_RED}${0}: ERROR: iptables nicht gefunden. "
echo -e "Breche ab! ${C_RESET}"
exit 1
fi
fi

# Ein paar grundsätzliche Daten

# - Externes Interface

EXTIP="192.168.2.2"
EXTIF="ppp0"

# - Internes Interface

INTIP="192.168.22.13"
INTIF="eth1"
INTBITS=24
INTNET="$INTIP"/"$INTBITS"

# - DNS Server

DNSSERVER=`cat /etc/resolv.conf | grep '^nameserver' | sed 's/nameserver//'`

# - Hohe Ports, die aus dem Internet nicht zugreifbar sein sollen

# - - TCP

TCPPROTECTED='3128 8000 8080'

# - - UDP

UDPPROTECTED=''

# ---------------------------------------------------------------------------
# Falls das Skript mit falschen Parametern aufgerufen wurde
# ---------------------------------------------------------------------------

case "$1" in
start)
echo "Starte die Firewall ..."
;;
stop)
echo "Beende die Vermittlung von Paketen ..."
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac


# ---------------------------------------------------------------------------
# Regeln, die immer gelten
# ---------------------------------------------------------------------------

# Alle Regeln löschen

$R -F INPUT
$R -F FORWARD
$R -F OUTPUT

# Alle Pakete, die nicht explizit erlaubt sind, sind verboten

$R -P INPUT DROP
$R -P FORWARD DROP
$R -P OUTPUT DROP

# Protokollierung gespoofter Pakete

$R -A INPUT -i ! "$INTIF" -s "$INTNET" -j LOG --log-level warning \
--log-prefix "$INTIF gespooft: "
$R -A INPUT -i ! "$INTIF" -s "$INTNET" -j DROP
$R -A INPUT -i ! lo -s 127.0.0.1 -j LOG --log-level warning \
--log-prefix "loopback gespooft: "
$R -A INPUT -i ! lo -s 127.0.0.1 -j DROP

$R -A FORWARD -i ! "$INTIF" -s "$INTNET" -j LOG --log-level warning \
--log-prefix "$INTIF gespooft: "
$R -A FORWARD -i ! "$INTIF" -s "$INTNET" -j DROP
$R -A FORWARD -i ! lo -s 127.0.0.1 -j LOG --log-level warning \
--log-prefix "loopback gespooft: "
$R -A FORWARD -i ! lo -s 127.0.0.1 -j DROP

# Ident

#$R -A INPUT -i "$EXTIF" -p tcp --dport 113 -j LOG --log-level info \
#--log-prefix "ident probe: "
$R -A INPUT -i "$EXTIF" -p tcp --dport 113 -j REJECT


# Unaufgeforderte Verbindungsaufbauten (NEW) und ungültige Pakete
# (INVALID) des externen Interfaces.

# - eine eigene Chain f"ur diese Tests

$R -N states
$R -F states

# - dorthin verzweigen

$R -A INPUT -i "$EXTIF" -j states
$R -A FORWARD -i "$EXTIF" -j states

# - die Regeln

$R -A states -m state --state NEW,INVALID -j LOG \
--log-prefix "Unerwuenschte Verbindung:"

$R -A states -m state --state NEW,INVALID -j DROP

# - Ruecksprung, falls noch nicht verworfen

# $R -A states -j RETURN


# lokale Pakete sind erlaubt

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


# NetBIOS über TCP/IP

$R -A INPUT -p UDP -s "$INTNET" --sport 137:139 -j DROP
$R -A INPUT -p UDP -s "$INTNET" --dport 137:139 -j DROP
$R -A INPUT -p TCP -s "$INTNET" --sport 137:139 -j DROP
$R -A INPUT -p TCP -s "$INTNET" --dport 137:139 -j DROP

$R -A FORWARD -p UDP -s "$INTNET" --sport 137:139 -j DROP
$R -A FORWARD -p UDP -s "$INTNET" --dport 137:139 -j DROP
$R -A FORWARD -p TCP -s "$INTNET" --sport 137:139 -j DROP
$R -A FORWARD -p TCP -s "$INTNET" --dport 137:139 -j DROP


case $1 in
# ---------------------------------------------------------------------------
# Die Firewall soll heruntergefahren werden
# ---------------------------------------------------------------------------
stop)

# Löschen der eigenen Chains

$R -F ext-in
$R -X ext-in
$R -F ext-fw
$R -X ext-fw
$R -F ext-out
$R -X ext-out
$R -F int-in
$R -X int-in
$R -F int-fw
$R -X int-fw
$R -F int-out
$R -X int-out

# Protokollierung ungewöhnlicher Pakete

$R -A INPUT -s 0.0.0.0/0 -j LOG --log-level notice \
--log-prefix "INPUT (default): "
$R -A INPUT -s 0.0.0.0/0 -j DROP
$R -A OUTPUT -s 0.0.0.0/0 -j LOG --log-level notice \
--log-prefix "OUTPUT (default): "
$R -A OUTPUT -s 0.0.0.0/0 -j DROP
$R -A FORWARD -s 0.0.0.0/0 -j LOG --log-level notice \
--log-prefix "FORWARD (default): "
$R -A FORWARD -s 0.0.0.0/0 -j DROP

;;

# ---------------------------------------------------------------------------
# Die Firewall soll ihre Arbeit aufnehmen
# ---------------------------------------------------------------------------
start)

# ICMP

$R -A INPUT -p icmp --icmp-type 0 -j ACCEPT
$R -A INPUT -p icmp --icmp-type 3 -j ACCEPT
$R -A INPUT -p icmp --icmp-type 8 -j ACCEPT
$R -A INPUT -p icmp --icmp-type 11 -j ACCEPT
$R -A INPUT -p icmp --icmp-type 12 -j ACCEPT
$R -A OUTPUT -p icmp -j ACCEPT

$R -I states -p icmp --icmp-type 8 -j RETURN


# Eigene Chains

# - Externes Interface

$R -N ext-in
$R -N ext-fw
$R -N ext-out

# - Internes Interface

$R -N int-in
$R -N int-fw
$R -N int-out

# - Verteilung der Pakete auf die Chains

$R -A INPUT -i "$INTIF" -s "$INTNET" -j int-in
$R -A INPUT -i "$EXTIF" -j ext-in
$R -A FORWARD -i "$INTIF" -o "$EXTIF" -s "$INTNET" -j int-fw
$R -A FORWARD -i "$EXTIF" -o "$INTIF" -j ext-fw
$R -A OUTPUT -o "$INTIF" -j int-out
$R -A OUTPUT -o "$EXTIF" -j ext-out


# Zugriffe auf Server der Firewall

# - TCP

for port in $TCPPROTECTED
do
$R -A ext-in -p tcp --dport $port -j LOG \
--log-prefix "Zugriff auf Port $port TCP"
$R -A ext-in -p tcp --dport $port -j DROP
done

# - UDP

for port in $UDPPROTECTED
do
$R -A ext-in -p udp --dport $port -j LOG \
--log-prefix "Zugriff auf Port $port UDP"
$R -A ext-in -p udp --dport $port -j DROP
done


# DNS
# - Server auf der Firewall

$R -A int-in -p udp -d "$INTIP" --dport 53 -j ACCEPT
$R -A int-out -p udp -s "$INTIP" --sport 53 -j ACCEPT
$R -A int-in -p tcp -d "$INTIP" --dport 53 -j ACCEPT
$R -A int-out -p tcp -s "$INTIP" --sport 53 ! --syn -j ACCEPT

# HTTP-Proxie Squid
# - Zugriff auf den Squid

$R -A int-in -p tcp --sport 1024:65535 -d "$INTIP" --dport 3128 \ -j ACCEPT
$R -A int-out -p tcp --dport 1024:65535 -s "$INTIP" --sport 3128 \ ! --syn -j ACCEPT

# VPN IPsec
# - Zugriff auf den Server
# IKE negotiations

$R -I ext-in -p udp --sport 500 --dport 500 -j ACCEPT
$R -I int-out -p udp --sport 500 --dport 500 -j ACCEPT

# ESP encryption and authentication

$R -I ext-in -p 50 -j ACCEPT
$R -I int-out -p 50 -j ACCEPT


# HTTPS
# - Zugriff auf den Server

$R -A ext-in -p tcp --dport 1024:65535 --sport 443 ! --syn \
-j ACCEPT
$R -A ext-out -p tcp --sport 1024:65535 --dport 443 -j ACCEPT

# - Forwarding durch die Firewall

$R -A int-fw -p tcp --sport 1024:65535 --dport 443 -j ACCEPT
$R -A ext-fw -p tcp --dport 1024:65535 --sport 443 -j ACCEPT


# SMTP
# - Zugriff auf den Server

$R -A ext-in -p tcp --dport 1024:65535 --sport 25 ! --syn \
-j ACCEPT
$R -A ext-out -p tcp --sport 1024:65535 --dport 25 -j ACCEPT

# - Forwarding durch die Firewall

$R -A int-fw -p tcp --sport 1024:65535 --dport 25 -j ACCEPT
$R -A ext-fw -p tcp --dport 1024:65535 --sport 25 -j ACCEPT


# POP3
# - Zugriff auf den Server

$R -A ext-in -p tcp --dport 1024:65535 --sport 110 ! --syn \
-j ACCEPT
$R -A ext-out -p tcp --sport 1024:65535 --dport 110 -j ACCEPT

# - Forwarding durch die Firewall

$R -A int-fw -p tcp --sport 1024:65535 --dport 110 -j ACCEPT
$R -A ext-fw -p tcp --dport 1024:65535 --sport 110 -j ACCEPT


# POP3S
# - Zugriff auf den Server

$R -A ext-in -p tcp --dport 1024:65535 --sport 995 ! --syn \
-j ACCEPT
$R -A ext-out -p tcp --sport 1024:65535 --dport 995 -j ACCEPT

# - Forwarding durch die Firewall

$R -A int-fw -p tcp --sport 1024:65535 --dport 995 -j ACCEPT
$R -A ext-fw -p tcp --dport 1024:65535 --sport 995 -j ACCEPT


# IMAP
# - Zugriff auf den Server

$R -A ext-in -p tcp --dport 1024:65535 --sport 143 ! --syn \
-j ACCEPT
$R -A ext-out -p tcp --sport 1024:65535 --dport 143 -j ACCEPT

# - Forwarding durch die Firewall

$R -A int-fw -p tcp --sport 1024:65535 --dport 143 -j ACCEPT
$R -A ext-fw -p tcp --dport 1024:65535 --sport 143 -j ACCEPT


# IMAPS
# - Zugriff auf den Server

$R -A ext-in -p tcp --dport 1024:65535 --sport 993 ! --syn \
-j ACCEPT
$R -A ext-out -p tcp --sport 1024:65535 --dport 993 -j ACCEPT

# - Forwarding durch die Firewall

$R -A int-fw -p tcp --sport 1024:65535 --dport 993 -j ACCEPT
$R -A ext-fw -p tcp --dport 1024:65535 --sport 993 -j ACCEPT


# NNTP
# - Zugriff auf den Server

$R -A ext-in -p tcp --dport 1024:65535 --sport 119 ! --syn \
-j ACCEPT
$R -A ext-out -p tcp --sport 1024:65535 --dport 119 -j ACCEPT

# - Forwarding durch die Firewall

$R -A int-fw -p tcp --sport 1024:65535 --dport 119 -j ACCEPT
$R -A ext-fw -p tcp --dport 1024:65535 --sport 119 -j ACCEPT


# FTP
# - Zugriff auf den Server --------------------------------
# - - Kontrollverbindung

$R -A ext-in -p tcp --dport 1024:65535 --sport 21 ! --syn \
-j ACCEPT
$R -A ext-out -p tcp --sport 1024:65535 --dport 21 -j ACCEPT

# - - aktives FTP

$R -A ext-in -p tcp --dport 1024:65535 --sport 20 -j ACCEPT
$R -A ext-out -p tcp --sport 1024:65535 --dport 20 ! --syn \
-j ACCEPT

# - - passives FTP

$R -A ext-in -p tcp --dport 1024:65535 --sport 1024:65535 \
! --syn -j ACCEPT
$R -A ext-out -p tcp --sport 1024:65535 --dport 1024:65535 \
-j ACCEPT

# - Forwarding durch die Firewall -------------------------
# - - Kontrollverbindung

$R -A int-fw -p tcp --sport 1024:65535 --dport 21 -j ACCEPT
$R -A ext-fw -p tcp --dport 1024:65535 --sport 21 ! --syn \
-j ACCEPT

# - - aktives FTP

$R -A int-fw -p tcp --sport 1024:65535 --dport 20 ! --syn \
-j ACCEPT
$R -A ext-fw -p tcp --dport 1024:65535 --sport 20 -j ACCEPT

# - - passives FTP

$R -A int-fw -p tcp --sport 1024:65535 --dport 1024:65535 \
-j ACCEPT
$R -A ext-fw -p tcp --dport 1024:65535 --sport 1024:65535 \
! --syn -j ACCEPT

# - Proxy auf der Firewall --------------------------------
# - - Kontrollverbindung

# $R -A int-in -p tcp --sport 1024:65535 -d "$INTIP" --dport 21 \
#-j ACCEPT
# $R -A int-out -p tcp --dport 1024:65535 -s "$INTIP" --sport 21 \
#! --syn -j ACCEPT

# - - aktives FTP

# $R -A int-in -p tcp --sport 1024:65535 -d "$INTIP" --dport 20 \
#! --syn -j ACCEPT
# $R -A int-out -p tcp --dport 1024:65535 -s "$INTIP" --sport 20 \
#-j ACCEPT

# - - passives FTP

# $R -A int-in -p tcp --sport 1024:65535 -d "$INTIP" --dport 1024:65535 \
#-j ACCEPT
# $R -A int-out -p tcp --dport 1024:65535 -s "$INTIP" --sport 1024:65535 \
#! --syn -j ACCEPT

# Webmin Port 9999
# - Zugriff auf den Webmin httpd

$R -A int-in -p tcp --sport 1024:65535 -d "$INTIP" --dport 9999 \ -j ACCEPT
$R -A int-out -p tcp --dport 1024:65535 -s "$INTIP" --sport 9999 \ ! --syn -j ACCEPT

# - Zugriff auf den ssh demon

$R -A int-in -p tcp --sport 1024:65535 -d "$INTIP" --dport 22 \ -j ACCEPT
$R -A int-out -p tcp --dport 1024:65535 -s "$INTIP" --sport 22 \ ! --syn -j ACCEPT


# Protokollierung ungewöhnlicher Pakete

$R -A INPUT -s 0.0.0.0/0 -j LOG --log-level notice \
--log-prefix "INPUT (default): "
$R -A OUTPUT -s 0.0.0.0/0 -j LOG --log-level notice \
--log-prefix "OUTPUT (default): "
$R -A FORWARD -s 0.0.0.0/0 -j LOG --log-level notice \
--log-prefix "FORWARD (default): "
$R -A int-in -s 0.0.0.0/0 -j LOG --log-level notice \
--log-prefix "int-in (default): "
$R -A int-out -s 0.0.0.0/0 -j LOG --log-level notice \
--log-prefix "int-out (default): "
$R -A int-fw -s 0.0.0.0/0 -j LOG --log-level notice \
--log-prefix "int-fw (default): "
$R -A ext-in -s 0.0.0.0/0 -j LOG --log-level notice \
--log-prefix "ext-in (default): "
$R -A ext-fw -s 0.0.0.0/0 -j LOG --log-level notice \
--log-prefix "ext-fw (default): "
$R -A ext-out -s 0.0.0.0/0 -j LOG --log-level notice \
--log-prefix "ext-out (default): "

$R -A INPUT -s 0.0.0.0/0 -j DROP
$R -A OUTPUT -s 0.0.0.0/0 -j DROP
$R -A FORWARD -s 0.0.0.0/0 -j DROP
$R -A int-in -s 0.0.0.0/0 -j DROP
$R -A int-out -s 0.0.0.0/0 -j DROP
$R -A int-fw -s 0.0.0.0/0 -j DROP
$R -A ext-in -s 0.0.0.0/0 -j DROP
$R -A ext-fw -s 0.0.0.0/0 -j DROP
$R -A ext-out -s 0.0.0.0/0 -j DROP



# Network Address Translation
# - Masquerading

$R -t nat -A POSTROUTING -o "$EXTIF" -j MASQUERADE

# - Umleitung von Webserverzugriffen (TCP 80) auf den lokalen squid
$R -t nat -A PREROUTING -i "$INTIF" -p tcp --dport 80 -j REDIRECT \
--to-port 3128


;;
esac
 

gaw

Hacker
Die stammt doch weitestgehend aus dem Buch von Andreas.G.Lessing:
http://www.oreilly.de/catalog/linuxfireger/

Schreib einfach die Änderungen auf, dann lässt sich das einfacher kontrollieren.

mfg
gaw
 
OP
B

Beppo

Member
Hallo gaw,

jau das ist richtig.

Hinzugefügt habe ich den Teil mit dem

# Webmin Port 9999
# - Zugriff auf den Webmin httpd
$R -A int-in -p tcp --sport 1024:65535 -d "$INTIP" --dport 9999 \ -j ACCEPT
$R -A int-out -p tcp --dport 1024:65535 -s "$INTIP" --sport 9999 \ ! --syn -j ACCEPT

# - Zugriff auf den ssh demon

$R -A int-in -p tcp --sport 1024:65535 -d "$INTIP" --dport 22 \ -j ACCEPT
$R -A int-out -p tcp --dport 1024:65535 -s "$INTIP" --sport 22 \ ! --syn -j ACCEPT

# VPN IPsec
# - Zugriff auf den Server
# IKE negotiations

$R -I ext-in -p udp --sport 500 --dport 500 -j ACCEPT
$R -I int-out -p udp --sport 500 --dport 500 -j ACCEPT

# ESP encryption and authentication

$R -I ext-in -p 50 -j ACCEPT
$R -I int-out -p 50 -j ACCEPT

Also wenn ich die FW testen will und das Script starte, dann sperrt
ich mich selber aus und komme über SSH und Webmin
nicht mehr an die Kiste ran.

Danke für die Hilfe

Beppo
 

gaw

Hacker
Das lässt sich aus der Ferne schlecht beantworten, da ich nicht weiß wie dein Rechner angebunden ist.
So ist erst einmal nichts zu erkennen. Nach den Regeln solltest du einen Rechner mit einer 192.168.22.x IP-ADDR haben. Übrigens wenn es zu irgendwelchen Syntaxfehler kommt kann sein, dass das Script ebenfalls abbricht und dann sind nur die ersten Regeln gültig. Ich würde nach jedem Abschnitt echo Meldungen in das Skript einführen und das ganze beim Aufruf in eine log-Datei umleiten.
firewall start > starten.log.
Zur Sicherheit kannst du den Befehl firewall stop (Oder wie immer der Names deines Skriptes lautet) mit at absetzen, so dass du nach der Ausführung wieder auf deinen Rechner zugreifen kannst. Also wenn es jetzt 16:00 ist könnte es so aussehen:

tux:/usr/sbin:# atd (falls noch nicht gestartet)
tux:/usr/sbin:# echo "firewall stop" | at 16:02
tux:/usr/sbin: # firewall start > starten.log

Selbst wenn du dich aussperrst wird um 16:02 die Firewall ausgeschaltet und du kannst wieder über ssh zugreifen. Danach kannst du in aller Ruhe in starten.log nachsehen ob alle iptables Befehle korrekt ausgeführt wurden und ziemlich schnell feststellen ob und ggf. an welcher Stelle sich das Skript aufhängt. Wenn du eigene echo-Meldngen an bestimmten Stellen im Skript absetzt lässt sich das noch einfacher handhaben.



mfg
gaw
 
OP
B

Beppo

Member
hall gaw,

habe mir nen Test Umgebung geschaffen und nen dritten Recher
als "Internet" an den Router gehangen.
Es tut soweit auch alles nur bei der Umleitung in den Squid
harkt es. Wenn ich mit Netcat auf dem "Internet" Rechner nen offenen
Port 80 simuliere, netcat -l -p 80 -v, und auf der LAN Seite, wie du schon richtig erkannt hast von meiner 192.168.22.2 die Seite mit Netcat anspreche, netcat -v 192.168.2.1 80, dann passiert nix...

die Regel dafür auf dem Router ist, wobei "$I_IF" die interne Netzwerkkarte ist:
iptables -t nat -A PREROUTING -i "$I_IF" -p tcp --dport 80 -j REDIRECT --to-port 3128

hast du dazu vielleicht auch ne Idee?
Das Skript läuft sauber durch...

Danke Grüße Beppo
 
OP
B

Beppo

Member
wo laden die Pakete den wenn der Squid die übernommen hat?
Müssen die noch mal getrennt durch gelassen werden?
:?:
Hab echt keinen Plan mehr wo die hängen bleiben sollen...

danke

Beppo
 

gaw

Hacker
Also da läuft etwas durcheinander, nur zum Verständnis, wieviele interne Netze besitzt du?
Eins mit 192.168.22.x und noch eins mit 192.168.2.x oder wie?

Normalerweise ist das so:

Privates LAN (z.B 192.168.22.1 -192.168.22.50)
|
|
|
eth0 z.B
192.168.22.128
Linux Router
ippp0 mit IP vpm Provider z.B
80.0.22.3.1
|
|
|
internet

Du arbeitest aber mit zwei verschiedenen privaten Netzen einmal 192.168.2.x und 192.168.22.x. Warum?


mfG
gaw
 
OP
B

Beppo

Member
Hi gaw,

das hab ich nur zum testen eingerichtet das 192.168.22.0/24
ist mein eigentliches Subnetz.

Der Rechner mit der 192.168.2.1 hängt nur an der externen Netzwerkkarte und Simuliert mir das "böse" Netz.
Ich mache das nur damit ich nicht den alten Router vom Netz nehmen muss, dann hätten 15 andere in dem Subnetz kein Internet mehr und ich wollte vorher gerne wissen ob die Firewall so arbeitet wie ich mir das vorstelle. :wink:

Grüße Beppo
 

gaw

Hacker
Das Problem ist, dass du für deinen Testrechner der das Internet simuliert eine private IP benutzt. Um Masquerading durchzuführen benötigst du aber eine öffentliche IP-Adresse. In einer Testumgebung ohne Internetanschluss lässt sich das auch ohne Probleme durchführen. Du gibts deinem externen Testrechner eine im Internet gültige Nummer, natürlich temporär und bitte ohne Internetanschluss. Dann sorgt das Masquerading für eine entsprechende Übersetzung. Mit ethereal kannst du das beobachten. So kannst du mit drei Rechnern die Firewall testen:
Testumgebung ohne Internetanschluss:

Client der privates Netz simuliert
192.168.2.45
|
|
192.168.2.128 (eth0)
Linuxbox
220.2.13.4 (eth1)
|
|
220.2.13.5
Client der das Internet simuliert

Das Masquerading funktioniert zwischen privaten Netzen nicht, du kannst es natürlich in S-NAT-Regeln umwandeln, aber dann testest du im Grunde eine andere Konfiguration.

Wenn du einen transparenten Proxy aufsetzt musst du neben dem Portforwarding den Verbindungsaufbau vom internen LAN auf die Firewall über den squid-Port zulassen und einen http Verbindungsaufbau von der Firewall ins Internet zulassen. Je nach Firewalldesign natürlich auch die Pakete die zurücklaufen und zu diesen Verbindungen gehören. Zusätzlich sind beim transparenten Proxy noch vier Variabeln in der squid.conf entsprechend zu setzen.


mfG
gaw
 
OP
B

Beppo

Member
Oh man das erklärt natürlich einiges...:idea:

Leider kann ich es erst Montag ausprobieren
:cry:
Ich danke dir für die Hilfe und melde mich wenn ich es ausprobiert habe

Schönes WoE

Beppo
 
OP
B

Beppo

Member
Moin moin,

leider blockiert die Firewall immer noch den Squid...
Ich probiere mal weiter.

Grüße Beppo
 
OP
B

Beppo

Member
Hallo gaw!

Ich hoffe das ich richtig liege mit Befehlen,
jedenfalls klappt jetzt das Surfen über Squid!


#Umleitung des Ports 80 auf Squid Port 3128 und zulassen von www Traffic

iptables -t nat -A PREROUTING -i $I_IF -p tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -A OUTPUT -o $E_IF -p TCP -d 0.0.0.0/0.0.0.0 --destination-port 80 -m state --state NEW -j ACCE
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Danke für die Hilfe

Grüße Beppo
 

gaw

Hacker
Das ist eine Möglichkeit. Ich bevorzuge eine andere Strategie in denen auch die rücklaufenden Pakete auf bestimmte Verbindungen beschränkt werden. Das ist etwas aufwendiger, weil man die Regeln für jeden Port paarweise aufstellen muss:
Beispiel:

Code:
iptables -t nat -A PREROUTING -i $I_IF -p tcp --dport 80 -j REDIRECT --to-ports 3128 

# http Zugang vom Server

iptables -A OUTPUT -o $E_IF -p TCP -dport 80 -sport 1024:65535 -m state --state NEW, ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i $E_IF -p TCP -sport 80 -dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT


# pop3 Zugang der Clients

iptables -A FORWARD -i $I_IF -o $E_IF -p TCP -dport 110  -sport 1024:65535 -m state --state NEW, ESTABLISHED,RELATED -j ACCEPT

iptables -A FORWARD -i $E_IF -o $I_IF -p TCP -sport 110 -dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

Der Unterschied besteht darin, dass in deinem Design grundsätzlich alle Pakete die zu bestehenden Verbindungen gehören erlaubt sind, während in meinem Design tatsächlich nur Pakete bestehender Verbindungen durchgelassen werden die den Quellport 80 (Router) bzw. den Quellport 110 (Clients) besitzen. Ich verfahre nach der Devise, möglichst nur Notwendiges zu erlauben.

mfG
gaw
 
OP
B

Beppo

Member
hi gaw,

hmm meinst du so wie ich es gemacht habe ist es nicht besonders sicher?
Die ausgehenden Pakete werden doch eigentlich schon mit
-m state markiert.

Hab jetzt 2 Wochen daran gebastelt... aber wenn du sagst es ist besser dann ändere ich es noch. :?

Grüße Beppo
 

gaw

Hacker
Hallo Beppo
Wenn du deine Tür abschließt und jemand anders legt zusätzlich eine Kette vor oder baut eine Stahltür ein, was ist dann sicherer?

Für viele Privatleute ist es übertrieben von aussen vergittere Fenster einbauen zu lassen. Es gibt aber durchaus Städte wo das der Fall ist. In Rio sind in vielen Wohngegenden die Fenster bis zum siebten Stock vergittert als Schutz vor Fassadenkletterern.

Natürlich ist es sicherer nur dezidierten Paketen zu erlauben die Firewall zu passieren. Ob dir der Aufwand gerechtfertigt erscheint, musst du selbst entscheiden. Letztendlich hängt es von der Bedeutung ab, die ein funktionierendes Netz hinter deiner Firewall besitzt und natürlich wie sensibel die Daten sind. Es ist nur eine von verschiedenen Strategien. Ich muss zum Beispiel nicht sicherstellen, dass neu ankommende Pakete aus dem Internet abgelehnt werden, weil grundsätzlich alles, was ich nicht ausdrücklich erlaube verbiete.
Die Strategie deny all, allow some ist meiner Ansicht nach besser zu händeln. Das bedeutet aber nicht, das andere Strategien nicht funktionieren.Der fli4 arbeitet zum Beispiel umgekehrt, dort müssen Ports aktiv gesperrt werden (allow all, deny someting). Im SuSE-Buch von Bartels wird eher eine Strategie angewendet, wie du sie praktizierst, mittels stateful inspection werden alle einkommenden Pakete die zu bestehenden Verbindungen gehören erlaubt während nur der Neuaufbau kontrolliert wird, während Lessing in großen Teilen ebenfalls paarweise Regeln festlegt. Schau dir dein Skript am Anfang einmal an, und versuch zu verstehen was da passiert. Lessing arbeitet in seinen fertigen Skripten gerne mit mehreren eigenen Ketten in denen er dann einen Teil des Verkehr umlenkt. In den einzelnen Ketten stellt er aber auch eher paarweise Regeln auf.

Wie auch immer, mir ging es darum dass du verschiedene Möglichkeiten kennenlernst. Der Paketfilter iptables ist lediglich ein Werkzeug mit dem sich nach ganz unterschiedlichen Strategien arbeiten lässt. Es ist also nicht sinnvoll Teile verschiedener iptables Skripte miteinander zu mischen dessen Strategie man nicht durchschaut.

Es gibt noch einen anderen Grund warum ich lieber mit Regelpaaren arbeite. Ich tüfftle im Moment daran meine Regeln zu flexibilisieren. So kann ich mit kleineren Skripten die ich via eigenen Befehl über webmin aufrufe die Firewall umstellen und Regeln entfernen oder zulassen. So kann ich per Button passives ftp über das contracking einschalten oder ebenfalls per button den http am transparenten proxy vorbeileiten.

Ebenfalls interessant ist die Möglichkeit per Zusatzskript den Verkehr von einem internen Webserver umzulenken, indem man die ursprüngliche Regel löscht und eine neue einblendet.

Dabei verwende ich lieber in sich abgeschlossene Regelkonstrukte um den Zustand der Firewall konsistent zu halten.

Wenn dein Skript funktioniert und du alles verstehst ist das sicher ein guter Grund erst einmal stolz zu sein. Die Mehrzahl der SuSE-Anwender wird das wohl nie versuchen. Ein Tipp, kommentiere die Befehle selber damit du in drei Wochen dein Skript immer noch verstehst. Und mache eine Sicherheitkopie davon, insbesondere wenn dich die Lust zum Basteln wieder überfällt. ;)


mfg
gaw
 
OP
B

Beppo

Member
Moin gaw,

ich denke du hast recht damit, ein Schloss mehr ist immer besser als eins zu wenig :wink:

Aber leider ist es bei mir im Moment noch ein reines Anwenden von erlernten und kein entwickeln...
Ich denke das Skript werde ich noch mal durch einander wühlen müssen, zudem ich noch einen VPN Server und einen Dante Socks5
aufsetzen und betreiben möchte.
Aber weiterhin gerne die Sicherheit hoch halten möchte.
Sensibele Daten sind es nicht unbedingt, da allzu oft die FW getunnelt wird, allerdings zu offiziellen Uni VPN-Servern um dort ins Intranet zu kommen.
Schwierig finde ich nur sich das Wissen über Iptables an zueignen,
wenn, wie auch hier im Forum,
Themen angefangen werden, aber leider viel zu selten zu ende diskutiert werden.
Dazu gehört halt auch sich noch mal zu melden, wenn die Hilfe des Forums auch gefruchtet hat und wie man das Problem gelöst hat.
Aber das nur am Rande :wink:

Grüße Beppo
 
Oben