Was beachten bei IPv6 Firewall?

27/07/2009 - 19:38 von Peter Mairhofer | Report spam
Hi,

Gegeben ist ein Router mir > 2 Interfaces. Dort oben làuft für IPv4 die
eingebaute Firewall von OpenWRT. Ebenfalls ist dort ein IPv6 Tunnel von
Sixxs installiert. Bis jetzt habe ich eine IPv6 Firewall immer
rausgeschoben obwohl es doch so wichtig wàre (offizielle Adressen im
internen LAN). Richtig erschwert wird dies durch:
* Kernel 2.4., d.h. /kein/ conntrack für IPv6
* Kein anstàndiges OOTB Script

Nun stellt sich für mich die Frage auf was ich achten muss bei so einem
Firewall Script? Ich habe zwar einige gefunden aber ich möchte nicht
einfach mittels (un-)priviligierten Ports filtern sondern "more
sophisticated". Nur: Wie tun?

Das externe Interface ist "sixxs" (der 6to4 Tunnel). Dann gibt es noch
folgende Interfaces:
* eth0.1: Kein IPv6, also kein (v6-)Routing
* eth0.2: Internes LAN -> $LAN1
* eth0.3: DMZ (und externes IPv4 Netz) -> $DMZ
* eth0.4: Weiteres internes LAN -> $LAN2

Mein Ansatz:

1.) INPUT, FORWARD: DROP-Policy
2.) OUTPUT: ACCEPT-Policy
3.) ICMP akzeptieren (in allen 3 Chains).
Uneingeschrànkt allen ICMP akzeptieren?
4.) lo Interface akzeptieren

5.) In allen 3 Chains ff00::/8 (multicast) ACCEPTen?!
6.) In INPUT/OUTPUT fe80::/10 (link local) ACCEPTen?!

7.) Im FORWARD: Alle Pakete nach "sixxs" ACCEPTen.
Pakete von $LAN1 nach $LAN2 uneingeschrànkt erlauben
und umgekehrt.
Alle Pakete von $LAN1 nach $DMZ ACCEPTen.

Beim FORWARD in die internen Netze wird es schwierig.
Für TCP:

8.) Alle !syn-Pakete: ACCEPT
9.) SYN-Pakete: In FORWARD ACCEPT nur wenn -o sixxs
ODER ( -o $DMZ und -i $LAN1/$LAN2)

Für UDP: Da es nichtmal einen expliziten Verbindungsaufbau gibt: Wie
mache ich das hier?!

Und falls das getan ist zu guter Letzt: Erlaubte Services vom Internet
(sixxs) in die $DMZ:

10.) FORWARD: --dport {80,443,...} -i sixxs -o $DMZ -j ACCEPT

Und bestimmte Dienste von der DMZ ins interne LAN erlauben (z.B. LDAP):

11.) FORWARD: --dport ldap -i $DMZ -o $LAN


Könnte das so passen? Hab ich was vergessen? Ist meine Vorgehensweise
gut oder gibt es bessere Ansàtze?

Für Kommentare und Vorschlàge, vor allem zu UDP wàre ich sehr dankbar!

lg,
Peter
 

Lesen sie die antworten

#1 Peter Mairhofer
04/08/2009 - 16:01 | Warnen spam
Peter Mairhofer schrieb:
Hi,

Gegeben ist ein Router mir > 2 Interfaces. Dort oben làuft für IPv4 die
eingebaute Firewall von OpenWRT. Ebenfalls ist dort ein IPv6 Tunnel von
Sixxs installiert. Bis jetzt habe ich eine IPv6 Firewall immer
rausgeschoben obwohl es doch so wichtig wàre (offizielle Adressen im
internen LAN). Richtig erschwert wird dies durch:
* Kernel 2.4., d.h. /kein/ conntrack für IPv6
* Kein anstàndiges OOTB Script

Nun stellt sich für mich die Frage auf was ich achten muss bei so einem
Firewall Script? Ich habe zwar einige gefunden aber ich möchte nicht
einfach mittels (un-)priviligierten Ports filtern sondern "more
sophisticated". Nur: Wie tun?

Das externe Interface ist "sixxs" (der 6to4 Tunnel). Dann gibt es noch
folgende Interfaces:
* eth0.1: Kein IPv6, also kein (v6-)Routing
* eth0.2: Internes LAN -> $LAN1
* eth0.3: DMZ (und externes IPv4 Netz) -> $DMZ
* eth0.4: Weiteres internes LAN -> $LAN2

Mein Ansatz:

1.) INPUT, FORWARD: DROP-Policy
2.) OUTPUT: ACCEPT-Policy
3.) ICMP akzeptieren (in allen 3 Chains).
Uneingeschrànkt allen ICMP akzeptieren?
4.) lo Interface akzeptieren

5.) In allen 3 Chains ff00::/8 (multicast) ACCEPTen?!
6.) In INPUT/OUTPUT fe80::/10 (link local) ACCEPTen?!

7.) Im FORWARD: Alle Pakete nach "sixxs" ACCEPTen.
Pakete von $LAN1 nach $LAN2 uneingeschrànkt erlauben
und umgekehrt.
Alle Pakete von $LAN1 nach $DMZ ACCEPTen.

Beim FORWARD in die internen Netze wird es schwierig.
Für TCP:

8.) Alle !syn-Pakete: ACCEPT
9.) SYN-Pakete: In FORWARD ACCEPT nur wenn -o sixxs
ODER ( -o $DMZ und -i $LAN1/$LAN2)

Für UDP: Da es nichtmal einen expliziten Verbindungsaufbau gibt: Wie
mache ich das hier?!

Und falls das getan ist zu guter Letzt: Erlaubte Services vom Internet
(sixxs) in die $DMZ:

10.) FORWARD: --dport {80,443,...} -i sixxs -o $DMZ -j ACCEPT

Und bestimmte Dienste von der DMZ ins interne LAN erlauben (z.B. LDAP):

11.) FORWARD: --dport ldap -i $DMZ -o $LAN


Könnte das so passen? Hab ich was vergessen? Ist meine Vorgehensweise
gut oder gibt es bessere Ansàtze?

Für Kommentare und Vorschlàge, vor allem zu UDP wàre ich sehr dankbar!



Hmm, schade :-( Hat wirklich noch keiner eine IPv6 Firewall gebaut?

Ich habe aus meinem Ansatz nun folgende Firewall aufgebaut. Da OpenWRT
leider keine Stateful Inspection kann muss ich diese wie gesagt
"simulieren":

# Internet
EXT=sixxs
# DMZ with Mail-, NS- and Webserver
DMZ=eth0.3
# intern LAN
LAN=eth0.2
# Interner Server im LAN mit LDAP, apt-proxy, DNS & Co auf
# den Rechner in DMZ zugreifen können muss
INT_SERV=...

# IPs der Server in der DMZ
NS_SERV=...
MX_SERV=...
WEB_SERV=...

#####################################
# setup
#####################################

# Flush & default
ip6tables -F INPUT
ip6tables -F OUTPUT
ip6tables -F FORWARD
ip6tables -F
ip6tables -X

# Set the default policy to drop everything
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP

# Dieser Chain akzeptiert alle Antworten und macht beim
# Rest: RETURN
# Akzeptiert sofort wenn Pakete Antworten sind
# UDP: Ports > 32768
# TCP: Alle Pakete die nicht SYN sind
ip6tables -N answers
ip6tables -A answers -p udp --dport 32768:60999 -j ACCEPT
ip6tables -A answers -p tcp ! --syn -j ACCEPT

# Disable processing of any RH0 packet
# Which could allow a ping-pong of packets
#ip6tables -A INPUT -m rt --rt-type 0 -j DROP
#ip6tables -A OUTPUT -m rt --rt-type 0 -j DROP
#ip6tables -A FORWARD -m rt --rt-type 0 -j DROP

# Allow anything on the local link
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A OUTPUT -o lo -j ACCEPT

# Allow Link-Local addresses
ip6tables -A INPUT -s fe80::/10 -j ACCEPT
ip6tables -A OUTPUT -s fe80::/10 -j ACCEPT

# Allow multicast
ip6tables -A INPUT -s ff00::/8 -j ACCEPT
ip6tables -A OUTPUT -s ff00::/8 -j ACCEPT
ip6tables -A FORWARD -s ff00::/8 -j ACCEPT

# Allow ICMP
ip6tables -A INPUT -p icmpv6 -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 -j ACCEPT
ip6tables -A FORWARD -p icmpv6 -j ACCEPT


#####################################
# <--> Firewall
#####################################
# Raus darf alles
ip6tables -A OUTPUT -j ACCEPT
# Antwortpakete dürfen von überall rein
ip6tables -A INPUT -j answers

# Lokales Netz darf uneingeschraenkt rein
ip6tables -A INPUT -i ${LAN} -j ACCEPT
# Und SSH darf von überall rein
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT


#####################################
# LAN <--> DMZ
#####################################
# LAN --> DMZ
ip6tables -A FORWARD -i ${LAN} -o ${DMZ} -j ACCEPT
ip6tables -A FORWARD -i ${DMZ} -o ${LAN} -j answers

# DMZ --> LAN
# Alle: Interner DNS Server, syslog, apt-proxy
ip6tables -A FORWARD -i ${DMZ} -o ${LAN} -d $INT_SERV -p tcp --dport 53
-j ACCEPT
ip6tables -A FORWARD -i ${DMZ} -o ${LAN} -d $INT_SERV -p udp --dport 53
-j ACCEPT
ip6tables -A FORWARD -i ${DMZ} -o ${LAN} -d $INT_SERV -p tcp --dport
9999 -j ACCEPT
ip6tables -A FORWARD -i ${DMZ} -o ${LAN} -d $INT_SERV -p udp --dport 514
-j ACCEPT
# [...]

#####################################
# Internet <--> DMZ
#####################################
# DMZ --> Internet
ip6tables -A FORWARD -i ${DMZ} -o ${EXT} -j ACCEPT
ip6tables -A FORWARD -i ${EXT} -o ${DMZ} -j answers

#####################################
# Internet <--> LAN
#####################################
# LAN --> Internet
ip6tables -A FORWARD -i ${LAN} -o ${EXT} -j ACCEPT
ip6tables -A FORWARD -i ${EXT} -o ${LAN} -j answers

#####################################
# public services (DMZ)
#####################################
# ns: 1984, 53
ip6tables -A FORWARD -d $NS_SERV -p tcp --dport 1984 -j ACCEPT
ip6tables -A FORWARD -d $NS_SERV -p tcp --dport 53 -j ACCEPT
ip6tables -A FORWARD -d $NS_SERV -p udp --dport 53 -j ACCEPT
# mail: 1984, 25, 465, 993
ip6tables -A FORWARD -d $MX_SERV -p tcp --dport 1984 -j ACCEPT
ip6tables -A FORWARD -d $MX_SERV -p tcp --dport 25 -j ACCEPT
ip6tables -A FORWARD -d $MX_SERV -p tcp --dport 465 -j ACCEPT
ip6tables -A FORWARD -d v -p tcp --dport 993 -j ACCEPT
# web: 1984, 21, 80, 443
ip6tables -A FORWARD -d $WEB_SERV -p tcp --dport 1984 -j ACCEPT
ip6tables -A FORWARD -d $WEB_SERV -p tcp --dport 80 -j ACCEPT
ip6tables -A FORWARD -d $WEB_SERV -p tcp --dport 443 -j ACCEPT
ip6tables -A FORWARD -d $WEB_SERV -p tcp --dport 21 -j ACCEPT

#####################################
# Catchall
#####################################
ip6tables -A FORWARD -j LOG --log-prefix "FORWARD:REJ:"
ip6tables -A FORWARD -j DROP


Die letzte Regel würde ich sehr gerne REJECT machen, aber OpenWRT hat
das Modul leider nicht.

Die Regeln mit den RH0-Paketen funktionieren leider auch nicht. Wie
schlimm ist das bzw. für was sind die überhaupt?

Ist in diesem Anwendungsfall die explizite Behandlung der
link-local/multicast Pakete überhaupt noch notwendig?

Ist es schlecht wenn ich generisch alle ICMP von überall passieren
lasse? Oder sollte man hier noch feiner granulieren und wenn ja, wie?

Passt die Behandlung der Antwortpakete für UDP nun oder gibts da bessere
Lösungen?

Fàllt sonst noch was auf?

lg,
Peter

Ähnliche fragen