ip6tables ignoriert ipv6-icmp state

Gemeinsam ins Internet mit Firewall und Proxy.
fkit
Beiträge: 17
Registriert: 21.11.2004 20:23:09

ip6tables ignoriert ipv6-icmp state

Beitrag von fkit » 29.11.2016 10:57:49

Hallo,

ich bin mir nicht sicher, ob das eine Kernel Frage zum Kernelmodul nf_conntrack_ipv6 ist, oder ip6tables betrifft. Ich erkläre das was mir aufgefallen ist am Besten erstmal durch die Auflistung der aktuellen IPv6 Regeln:

Code: Alles auswählen

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:ext-fw - [0:0]
:fw-ext - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -m state --state INVALID,NEW -j ext-fw
-A INPUT -j LOG --log-prefix "Firewall input "
-A INPUT -j DROP
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -m state --state INVALID,NEW -j fw-ext
-A OUTPUT -j LOG --log-prefix "Firewall output "
-A OUTPUT -j DROP
-A ext-fw -j ACCEPT
-A fw-ext -j ACCEPT
COMMIT
Es werden also 2 benutzerdefinierte Chains ext-fw und fw-ext erstellt, in welche alle neu ankommenden, oder ungültigen Pakete, geleitet werden. In diesen wird dann der einfachheit halber für dieses Beispiel alles akzeptiert. Wenn ich jetzt einen IPv6 ping auf einen anderen Host im selben Netzwerk absetzte, so sollte dieser landen in:

Code: Alles auswählen

-A OUTPUT -o eth0 -m conntrack --ctstate INVALID,NEW -j fw-ext
Das macht er aber nicht, sondern das ip6-icmp Paket bleibt in der OUTPUT Chain, wo es dann geblockt wird:

Code: Alles auswählen

~# ping6 -c 1 -I eth0 fe80::230:18ff:fead:3bfb
PING fe80::230:18ff:fead:3bfb(fe80::230:18ff:fead:3bfb) from fe80::dacb:8aff:fe31:a544 eth0: 56 data bytes
From fe80::dacb:8aff:fe31:a544 icmp_seq=1 Destination unreachable: Address unreachable

--- fe80::230:18ff:fead:3bfb ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

Code: Alles auswählen

Nov 29 10:49:44 ork kernel: [11469.396938] Firewall output IN= OUT=eth0 SRC=fe80:0000:0000:0000:dacb:8aff:fe31:a544 DST=ff02:0000:0000:0000:0000:0001:ffad:3bfb LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0
Ich habe das alles auch schon statt dem "state" Module mit dem "conntrack" Modul getestet, ohne Erfolg. Mit einem tcp4 ICMP Ping klappt das Setup problemlos.

Wenn ich ipv6-icmp explizit zulasse, dann geht der ipv6 Ping auch durch. Aber ich möchte den Ping gerne in einer benutzerdefinierten Chain, abhängig vom Interface haben.

Hat jemand eine Idee ob das so gewollt ist, oder ist es ein Bug?

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von rendegast » 29.11.2016 12:19:36

Das heißt doch nur, daß der ipv6-Ping nicht mit dem Filter '-m state --state INVALID,NEW' zu beschreiben ist.

Du könntest ein wenig mit dem LOG-Target spielen, in der Art

Code: Alles auswählen

...
-A OUTPUT -o eth0 -m state --state INVALID,NEW -j fw-ext
-A OUTPUT -j LOG --log-prefix "FOinv " -d zielhost -m state --state INVALID
-A OUTPUT -j LOG --log-prefix "FOnew " -d zielhost -m state --state NEW
-A OUTPUT -j LOG --log-prefix "FOping " -d zielhost -p icmp
-A OUTPUT -j LOG --log-prefix "Firewall output "
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

fkit
Beiträge: 17
Registriert: 21.11.2004 20:23:09

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von fkit » 29.11.2016 12:35:57

Danke fürs Lesen!
rendegast hat geschrieben:Das heißt doch nur, daß der ipv6-Ping nicht mit dem Filter '-m state --state INVALID,NEW' zu beschreiben ist.
Ganz genau, wie der Betreff dieses Threads schon zu beschreiben versucht. Funktioniert auch ebensowenig mit dem Filter '-m conntrack --ctstate INVALID,NEW'

Du könntest ein wenig mit dem LOG-Target spielen, in der Art

Code: Alles auswählen

...
-A OUTPUT -o eth0 -m state --state INVALID,NEW -j fw-ext
-A OUTPUT -j LOG --log-prefix "FOinv " -d zielhost -m state --state INVALID
-A OUTPUT -j LOG --log-prefix "FOnew " -d zielhost -m state --state NEW
-A OUTPUT -j LOG --log-prefix "FOping " -d zielhost -p icmp
-A OUTPUT -j LOG --log-prefix "Firewall output "
Ok, habe versucht:

Code: Alles auswählen

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:ext-fw - [0:0]
:fw-ext - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -m state --state INVALID,NEW -j ext-fw
-A INPUT -j LOG --log-prefix "Firewall input "
-A INPUT -j DROP
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -m state --state INVALID,NEW -j fw-ext
-A OUTPUT -d fe80::230:18ff:fead:3bfb/128 -m state --state INVALID -j LOG --log-prefix "FOinv "
-A OUTPUT -d fe80::230:18ff:fead:3bfb/128 -m state --state NEW -j LOG --log-prefix "FOnew "
-A OUTPUT -d fe80::230:18ff:fead:3bfb/128 -p ipv6-icmp -j LOG --log-prefix "FOping "
-A OUTPUT -j LOG --log-prefix "Firewall output "
-A OUTPUT -j DROP
-A ext-fw -j ACCEPT
-A fw-ext -j ACCEPT
COMMIT
Der ipv6 Ping wird nicht mit den Log Präfixen "FO..." geloggt, sondern mit "Firewall output" und wird wie oben gedroppt.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von rendegast » 29.11.2016 13:02:45

... -p ipv6-icmp -j LOG --log-prefix "FOping "
...
Der ipv6 Ping wird nicht mit den Log Präfixen "FO..." geloggt, sondern mit "Firewall output" und wird wie oben gedroppt.
Nach manpage gibt es
-p icmp
-p icmpv6
EDIT Sorry "ipv6-icmp" aus /etc/protocols ist ja auch erlaubt.


Also das Suchmuster erweitern

Code: Alles auswählen

...
-A OUTPUT -j LOG --log-prefix "FOping " -d zielhost -p icmp
-A OUTPUT -j LOG --log-prefix "FOping6 " -d zielhost -p icmpv6
...
Wie ist es dann mit einem 'ping6 zielhost'?



... DST=ff02:0000:0000:0000:0000:0001:ffad:3bfb ...
<->
-A OUTPUT -d fe80::230:18ff:fead:3bfb/128 ...
Kann das so funktionieren? (habe fehlendes Grundlagenwissen ipv6)
Das '-d zielhost' sollte erstmal nur die Logmenge einschränken,
wenn dadurch jedoch der Test systematisch beeinträchtigt wird, dann einfach weglassen.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

fkit
Beiträge: 17
Registriert: 21.11.2004 20:23:09

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von fkit » 29.11.2016 13:13:00

rendegast hat geschrieben:Nach manpage gibt es
EDIT Sorry "ipv6-icmp" aus /etc/protocols ist ja auch erlaubt.
Stimmt, da geht beides.
Also das Suchmuster erweitern

Code: Alles auswählen

...
-A OUTPUT -j LOG --log-prefix "FOping " -d zielhost -p icmp
-A OUTPUT -j LOG --log-prefix "FOping6 " -d zielhost -p icmpv6
...
Wie ist es dann mit einem 'ping6 zielhost'?
Selbes Ergebniss. Das Paket wird nicht mit den Präfixen geloggt. Offenbar ist ein ICMPv6 Ping stateless...

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von rendegast » 29.11.2016 13:16:57

rendegast hat geschrieben:
... DST=ff02:0000:0000:0000:0000:0001:ffad:3bfb ...
<->
-A OUTPUT -d fe80::230:18ff:fead:3bfb/128 ...
Kann das so funktionieren? (habe fehlendes Grundlagenwissen ipv6)
Das '-d zielhost' sollte erstmal nur die Logmenge einschränken,
wenn dadurch jedoch der Test systematisch beeinträchtigt wird, dann einfach weglassen.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

fkit
Beiträge: 17
Registriert: 21.11.2004 20:23:09

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von fkit » 29.11.2016 13:36:43

rendegast hat geschrieben:
rendegast hat geschrieben:
... DST=ff02:0000:0000:0000:0000:0001:ffad:3bfb ...
<->
-A OUTPUT -d fe80::230:18ff:fead:3bfb/128 ...
Kann das so funktionieren? (habe fehlendes Grundlagenwissen ipv6)
Das '-d zielhost' sollte erstmal nur die Logmenge einschränken,
wenn dadurch jedoch der Test systematisch beeinträchtigt wird, dann einfach weglassen.
Ja, Du hast Recht. Es ist mir im Moment auch unverständlich, daß hier beim ping6 auf fe80::230:18ff:fead:3bfb im Kernel Log ff02:0000:0000:0000:0000:0001:ffad:3bfb erscheint. Hierbei handelt es sich wohl um eine Multicast Adresse:
https://www.iana.org/assignments/ipv6-m ... sses.xhtml

Wenn ich den zielhost weglasse habe ich endlich ein entsprechendes Log:

Code: Alles auswählen

ping6 -c 1 -I eth0 fe80::230:18ff:fead:3bfb
PING fe80::230:18ff:fead:3bfb(fe80::230:18ff:fead:3bfb) from fe80::dacb:8aff:fe31:a544 eth0: 56 data bytes
From fe80::dacb:8aff:fe31:a544 icmp_seq=1 Destination unreachable: Address unreachable

--- fe80::230:18ff:fead:3bfb ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

Code: Alles auswählen

Nov 29 13:34:27 ork kernel: [19950.722733] FOping6 IN= OUT=eth0 SRC=fe80:0000:0000:0000:dacb:8aff:fe31:a544 DST=ff02:0000:0000:0000:0000:0001:ffcd:da76 LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0 
Heißt also für mich, daß icmpv6 stateless ist.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von rendegast » 29.11.2016 14:05:50

Aber gewaltig stört mich
ping6 ... fe80::230:18ff:fead:3bfb

... DST=ff02:0000:0000:0000:0000:0001:ffcd:da76 ...
Wird da gewürfelt?
Wie kann nachvollzogen werden, daß
ff02:0000:0000:0000:0000:0001:ffcd:da76
dem Host
fe80::230:18ff:fead:3bfb
entspricht???

Da kann das Loggen ja gleich nach /dev/null entsorgt werden.
MitM, kommen Sie bitte herein.


In einem kürzlichen Thread wurde schonmal dargelegt,
daß das klassische firewall-konzept unter ipv6 ohnehin sinnlos wäre.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

mludwig
Beiträge: 793
Registriert: 30.01.2005 19:35:04

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von mludwig » 29.11.2016 15:26:10

Das Paket mit Multicast-Adresse ff02xxxxx ist Teil des IPv6, und wird für NDP benutzt. Das entspricht weitgehend dem ARP aus IPv4, dient also der Ermittlung der MAC-Adresse. Ist ja bei einem Ping im lokalen Netz nicht unwichtig, erstmal die MAC des Gegenüber zu ermitteln, um das Paket auf Layer 2 korrekt adressieren zu können.

das cd:da:76 dürfte Teil der MAC vom Absender sein ... äh, falsch, wird aus den letzten Bytes der Empfänger-Adresse "berechnet", wie auch immer ...

mludwig

fkit
Beiträge: 17
Registriert: 21.11.2004 20:23:09

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von fkit » 29.11.2016 16:30:35

Da hatte ich wohl die falsche Zeile gepostet, sorry.

ping6 -c 1 -I eth0 fe80::230:18ff:fead:3bfb

Code: Alles auswählen

Nov 29 13:41:34 ork kernel: [20377.612046] FOping6 IN= OUT=eth0 SRC=fe80:0000:0000:0000:dacb:8aff:fe31:a544 DST=ff02:0000:0000:0000:0000:0001:ffad:3bfb LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0 
Nov 29 13:41:34 ork kernel: [20377.612061] Firewall output IN= OUT=eth0 SRC=fe80:0000:0000:0000:dacb:8aff:fe31:a544 DST=ff02:0000:0000:0000:0000:0001:ffad:3bfb LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0 

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von rendegast » 29.11.2016 17:09:55

mludwig hat geschrieben: das cd:da:76 dürfte Teil der MAC vom Absender sein ... äh, falsch, wird aus den letzten Bytes der Empfänger-Adresse "berechnet", wie auch immer ...
Erwischt,
aus falschen Daten gemischt mit solidem Halbwissen eine falsche Aussage (haltlose Vermutung?) provoziert und dem Mythos ipv6 Nahrung geliefert.



Aber
ping6 -c 1 -I eth0 fe80::230:18ff:fead:3bfb

... DST=ff02:0000:0000:0000:0000:0001:ffad:3bfb ...
paßt ja auch nur auf den letzten 3 Byte.
Zuletzt geändert von rendegast am 29.11.2016 17:19:53, insgesamt 1-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

mludwig
Beiträge: 793
Registriert: 30.01.2005 19:35:04

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von mludwig » 29.11.2016 17:13:53

minus mal minus ist plus, also passt es wieder ... :roll:

TomL

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von TomL » 29.11.2016 21:29:55

Ich finde es jetzt wahnsinnig schwer, Eurer Diskussion zu folgen, aber ich denke, dass das Abhandeln der Pings gemäß Deiner Regeln
fkit hat geschrieben:Das macht er aber nicht, sondern das ip6-icmp Paket bleibt in der OUTPUT Chain, wo es dann geblockt wird:
meines Erachtens völlig richtig ist. Ich denke, jeder ausgehende Ping versackt hier:
-A OUTPUT -j DROP

Und jeder eingehende Ping findet hier sein Ende:
-A INPUT -j DROP

Warum? Weil der Ping-State meiner Meinung nach nicht "invalid" ist, sondern mit dem SYN-FLag der Conntrack-State immer "NEW" ist. Ich würde das Ping-Handling wie folgt lösen:

Code: Alles auswählen

ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -s $isp_prefix::/64 -j ACCEPT       # Allow local ping type  = "Echo" from LAN
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -j REJECT                           # Reject pings from WWW
ip6tables -A OUTPUT -p ipv6-icmp -j ACCEPT                                            # Allow all outgoing icmp
Das kannst Du natürlich auch in eigene Chains umleiten.

fkit
Beiträge: 17
Registriert: 21.11.2004 20:23:09

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von fkit » 30.11.2016 07:51:40

TomL hat geschrieben: meines Erachtens völlig richtig ist. Ich denke, jeder ausgehende Ping versackt hier:
-A OUTPUT -j DROP
Und jeder eingehende Ping findet hier sein Ende:
-A INPUT -j DROP
Warum? Weil der Ping-State meiner Meinung nach nicht "invalid" ist, sondern mit dem SYN-FLag der Conntrack-State immer "NEW" ist.
Genau. Deswegen steht da INVALID,NEW. Heißt INVALID oder NEW:

Code: Alles auswählen

-A INPUT -i eth0 -m state --state INVALID,NEW -j ext-fw
Das Problem ist, daß das nicht funktioniert, weil wie hier rausgefunden, der ipv6 Ping wohl stateless ist und somit nicht mit dem "conntrack" oder "state" Modul funktioniert.
Ich würde das Ping-Handling wie folgt lösen:

Code: Alles auswählen

ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -s $isp_prefix::/64 -j ACCEPT       # Allow local ping type  = "Echo" from LAN
ip6tables -A INPUT -p ipv6-icmp --icmpv6-type 128 -j REJECT                           # Reject pings from WWW
ip6tables -A OUTPUT -p ipv6-icmp -j ACCEPT                                            # Allow all outgoing icmp
Das kannst Du natürlich auch in eigene Chains umleiten.
Danke für Deinen Vorschlag. Es belibt hier nur die Möglichkeit das in INPUT und OUTPUT Chain zu regeln. Dein Setup ist aber nicht generell gültig und abhängig von den Gegebenheiten.

TomL

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von TomL » 30.11.2016 15:36:10

fkit hat geschrieben:Das Problem ist, daß das nicht funktioniert, weil wie hier rausgefunden, der ipv6 Ping wohl stateless ist und somit nicht mit dem "conntrack" oder "state" Modul funktioniert.
Nein, ICMP mit "echo request" und "echo reply" ist nicht stateless.... 'request' ist NEW, 'reply' ist ESTABLISHED.
Es belibt hier nur die Möglichkeit das in INPUT und OUTPUT Chain zu regeln.
Nein, auch das ist falsch. Du kannst das problemlos in eigenen Chains lösen, genau so, wie Du das vorgesehen hast.
Dein Setup ist aber nicht generell gültig und abhängig von den Gegebenheiten.
Das verstehe ich nicht. Bitte erkläre mir, bei welchen Gegebenheiten man zwar ein Ping-Handling in der Firewall erreichen möchte, aber keine ICMP-Identifikation durchführen kann.

Ganz nebenbeibemerkt halte ich den Ansatz generell für nicht durchdacht, weil ICMP unter IPv6 eine andere Bedeutung hat, als unter IPv4. ICMP hat hier eine "höherwertigere" Paketbedeutung, als normale TCP-Pakete und steuert auch den TCP-Pakete-Verkehr. Unter IPv6 ist es falsch, ICMP generell zu blocken. Mehr Infos dazu findest Du in der RFC 4890. So sollten generell die Fehlernachrichten 1-4 explitzit erlaubt werden, ebenso wie das Router- und Neighbour-Advertisement 133-136 (z.B. für SLAAC), dazu noch ein paar weitere Codes.

Und zur Behebung Deines Problems müsstest Du noch kontrollieren, ob das Kernel-Modul "ip_conntrack" überhaupt geladen ist. Aber wie gesagt, der richtige Lösungsansatz ist es, ICMP-Pakete korrekt zu matchen und dann wie gewünscht darauf zu reagieren.

https://tools.ietf.org/html/rfc4890

fkit
Beiträge: 17
Registriert: 21.11.2004 20:23:09

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von fkit » 30.11.2016 16:53:37

TomL hat geschrieben: Nein, ICMP mit "echo request" und "echo reply" ist nicht stateless.... 'request' ist NEW, 'reply' ist ESTABLISHED.
Du redest vom Design von ICMP und ich rede vom ip6tables state/conntrack Modul in Bezug auf ICMPv6. Und wie dieser Thread und die Versuche zeigen ist dieser ICMPv6 eben stateless im Sinne der ip6tables Module sonst könnte ich ihn unter Verwendung dieser anhand des jeweiligen Zustandes (NEW,INVALID) in benutzerdefinierte Chains leiten.
Es belibt hier nur die Möglichkeit das in INPUT und OUTPUT Chain zu regeln.
Nein, auch das ist falsch. Du kannst das problemlos in eigenen Chains lösen, genau so, wie Du das vorgesehen hast.
Ja das ist richtig, da habe ich mich falsch ausgedrückt. Ich wollte damit nochmal aufzeigen, daß diese Pakete stateless sind und nicht mit state/conntrack abgefangen werden können.
Dein Setup ist aber nicht generell gültig und abhängig von den Gegebenheiten.
Das verstehe ich nicht. Bitte erkläre mir, bei welchen Gegebenheiten man zwar ein Ping-Handling in der Firewall erreichen möchte, aber keine ICMP-Identifikation durchführen kann.
Die Beantwortung deiner Frage gibst Du Dir im nächsten Absatz selber. In Deinem Setup hattest Du nur icmpv6-type 128 erlaubt. Das ist u.U zuwenig:
Ganz nebenbeibemerkt halte ich den Ansatz generell für nicht durchdacht, weil ICMP unter IPv6 eine andere Bedeutung hat, als unter IPv4. ICMP hat hier eine "höherwertigere" Paketbedeutung, als normale TCP-Pakete und steuert auch den TCP-Pakete-Verkehr. Unter IPv6 ist es falsch, ICMP generell zu blocken. Mehr Infos dazu findest Du in der RFC 4890. So sollten generell die Fehlernachrichten 1-4 explitzit erlaubt werden, ebenso wie das Router- und Neighbour-Advertisement 133-136 (z.B. für SLAAC), dazu noch ein paar weitere Codes.
Und zur Behebung Deines Problems müsstest Du noch kontrollieren, ob das Kernel-Modul "ip_conntrack" überhaupt geladen ist. Aber wie gesagt, der richtige Lösungsansatz ist es, ICMP-Pakete korrekt zu matchen und dann wie gewünscht darauf zu reagieren.
nf_conntrack_ipv6 ist geladen, hilft aber nichts bei ICMPv6. Beim Testen und Lesen zu IPv6 ist mir aber klar geworden, daß dieses Protokoll sehr viel mehr beinhaltet als das bei ICMPv4 der Fall war. So wie Du es gerade eben ja auch beschrieben hast. Ein Vorposter hat das ja auch schon erwähnt, daß hier auch ARP dadurch ersetzt wird. Da wird dann schnell klar, daß es hier nicht stateful geht. Danke für die ganzen Anregungen hier!

TomL

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von TomL » 30.11.2016 17:02:52

Nein, ich speche nicht vom Design, sondern vom Connection-Tracking. Sowohl der Ping-Pong durch Request-Replay wie auch TimeStamp-Request haben den Tracking-State genau so, wie ich das gesagt habe, request ist NEW, reply ist ESTABLISHED. ICMP ist generell kein Stateful-Stream, aber diese 2 Paare erzeugen Rückkehrpakete, also funktioniert auch der Tracking-State. Aber das hierüber zu matchen ist meiner Meinung nach der falsche Weg.

So sieht das bei mir in der INPUT-Chain aus:

Code: Alles auswählen

   42  4368 ACCEPT     icmpv6    *   *   2003:xx:xxx:xxxx::/64 ::/0    ipv6-icmptype 128
    0     0 REJECT     icmpv6    *   *   ::/0                  ::/0    ipv6-icmptype 128 reject-with icmp6-port-unreachable
    0     0 ACCEPT     icmpv6    *   *   ::/0                  ::/0    ipv6-icmptype 1
    0     0 ACCEPT     icmpv6    *   *   ::/0                  ::/0    ipv6-icmptype 2
    0     0 ACCEPT     icmpv6    *   *   ::/0                  ::/0    ipv6-icmptype 3
    0     0 ACCEPT     icmpv6    *   *   ::/0                  ::/0    ipv6-icmptype 4
    0     0 ACCEPT     icmpv6    *   *   ::/0                  ::/0    ipv6-icmptype 133
   33  5016 ACCEPT     icmpv6    *   *   ::/0                  ::/0    ipv6-icmptype 134
   43  3096 ACCEPT     icmpv6    *   *   ::/0                  ::/0    ipv6-icmptype 135
   54  3480 ACCEPT     icmpv6    *   *   ::/0                  ::/0    ipv6-icmptype 136
    0     0 ACCEPT     icmpv6    *   *   ::/0                  ::/0    ipv6-icmptype 137
    0     0 ACCEPT     icmpv6    *   *   ::/0                  ::/0    ipv6-icmptype 141
    0     0 ACCEPT     icmpv6    *   *   ::/0                  ::/0    ipv6-icmptype 142
    0     0 ACCEPT     icmpv6    *   *   fe80::/10             ::/0    ipv6-icmptype 130
    0     0 ACCEPT     icmpv6    *   *   fe80::/10             ::/0    ipv6-icmptype 131
    0     0 ACCEPT     icmpv6    *   *   fe80::/10             ::/0    ipv6-icmptype 132
    0     0 ACCEPT     icmpv6    *   *   fe80::/10             ::/0    ipv6-icmptype 143
    0     0 ACCEPT     icmpv6    *   *   ::/0                  ::/0    ipv6-icmptype 148
    0     0 ACCEPT     icmpv6    *   *   ::/0                  ::/0    ipv6-icmptype 149
    0     0 ACCEPT     icmpv6    *   *   fe80::/10             ::/0    ipv6-icmptype 151
    0     0 ACCEPT     icmpv6    *   *   fe80::/10             ::/0    ipv6-icmptype 152
    0     0 ACCEPT     icmpv6    *   *   fe80::/10             ::/0    ipv6-icmptype 153

fkit
Beiträge: 17
Registriert: 21.11.2004 20:23:09

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von fkit » 30.11.2016 17:23:13

TomL hat geschrieben:Nein, ich speche nicht vom Design, sondern vom Connection-Tracking. Sowohl der Ping-Pong durch Request-Replay wie auch TimeStamp-Request haben den Tracking-State genau so, wie ich das gesagt habe, request ist NEW, reply ist ESTABLISHED. ICMP ist generell kein Stateful-Stream, aber diese 2 Paare erzeugen Rückkehrpakete, also funktioniert auch der Tracking-State.

Aber das hierüber zu matchen ist meiner Meinung nach der falsche Weg.
Es war mir kein Anliegen falsch oder richtig zu klären, sondern zu fragen ob in meinem System eine Fehlkonfiguration vorliegt, da ich ICMPv6 nicht mit state/conntrack Modul behandeln kann. Wie sich herausgestellt hat, sind die ICMPv6 Pakete die zur Zuweisung von IPv6 Adressen und/oder echo-request, echo-reply notwendig sind im Sinne von ip6tables stateless. Gerne lasse ich mich aber eines besseren belehren, wenn Du mir zeigen kannst, wie Du ein icmpv6 Paket mittels conntrack in eine benutzerdefinierte Chain bekommst.

TomL

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von TomL » 30.11.2016 18:04:40

fkit hat geschrieben: Wie sich herausgestellt hat, sind die ICMPv6 Pakete die zur Zuweisung von IPv6 Adressen und/oder echo-request, echo-reply notwendig sind im Sinne von ip6tables stateless.
Du hörst einfach nicht zu, was ich sage.... echo-replay sowie der Timer-Request IST NICHT STATELESS.... warum das bei Dir nicht geht, weiss ich nicht, aber die sind NICHT STATELESS. Bei mir landen die mit Conntrack-State genau da, wo sie landen sollen. Nur denke ich, dass diese Lösung 'daneben' ist. Ich würde das nicht auf diese Weise lösen.
Gerne lasse ich mich aber eines besseren belehren, wenn Du mir zeigen kannst, wie Du ein icmpv6 Paket mittels conntrack in eine benutzerdefinierte Chain bekommst.
Wenn Du mir erklärst, warum Du unbedingt einen echo-Request auf "NEW" abfragen musst oder willst... ein echo-Request ist IMMER NEW. Es gibt da keine Variationen, weil es keinen Stream gibt, nur ein Rückkehrpaket.... ein Ping ist immer NEW, ein Reply ist immer ESTABLISHED. Warum reicht es nicht einfach aus, auf den ICMP-Code 128 zu reagieren...?.... wenn er im Output steht, ist er NEW, weil Du ihn gesendet hast. Wenn er im Input landet, ist er NEW, weil jemand anders Deine Maschine gepingt hat. Warum muss man den denn über den Conntrack-State identifizieren? Das ist doch völlig unsinnig... vor allem, weil sich das ICMP-Paket auch vom TCP-Paket unterscheidet und man da ja eigentlich keine unerwünschten Wechselwirkungen haben möchte.... das heisst: besser ist es eindeutig zu matchen.

Du kannst ganz einfach meine Regel aus dem ersten Posting verwenden und damit wie gehabt in deine eigene Chain -j'umpen'. BTW, zeige mal die Ausgabe von:

Code: Alles auswählen

lsmod | grep conntrack

fkit
Beiträge: 17
Registriert: 21.11.2004 20:23:09

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von fkit » 30.11.2016 18:23:37

TomL hat geschrieben:Bei mir landen die mit Conntrack-State genau da, wo sie landen sollen.
Genau das interessiert mich. Bitte um ein Beispiel wie Du das mit dem ip6tables conntrack Moudl umsetzen konntest.
Gerne lasse ich mich aber eines besseren belehren, wenn Du mir zeigen kannst, wie Du ein icmpv6 Paket mittels conntrack in eine benutzerdefinierte Chain bekommst.
Wenn Du mir erklärst, warum Du unbedingt einen echo-Request auf "NEW" abfragen musst ...
Habe ich vorher erklärt. Ich wollte rausfinden, ob ich wie ich es schon mit ICMPv4 mache auch mit ICMPv6 ein solches Paket mit dem ip6tables state/conntrack Modul abfangen kann.
Du kannst ganz einfach meine Regel aus dem ersten Posting verwenden und damit wie gehabt in deine eigene Chain -j'umpen'.
In dieser Regel aus Deinem ersten Posting arbeitest Du nicht mit dem state/conntrack Modul. Doch darum geht es hier in diesem Thread bzw. das war mein Anliegen.

TomL

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von TomL » 30.11.2016 19:30:27

fkit hat geschrieben:In dieser Regel aus Deinem ersten Posting arbeitest Du nicht mit dem state/conntrack Modul. Doch darum geht es hier in diesem Thread bzw. das war mein Anliegen.
Ich habe Deine Regel genommen und bei mir funktioniert sie mit dem Conntrack-State auf Anhieb. Ich kann Dir auch nicht mehr weiter helfen. Das ist mir jetzt echt zu anstrengend, alles immer 2 oder 3 mal wiederholen zu müssen. Ich hatte Dich einmal gebeten das Kernel-Modul zu checken, dann noch mal um eine lsmod-Ausgabe gebeten, und jetzt ein drittes Mal? Und das vor dem Hintergrund, dass das Ziel ein ICMP-Paket allein über den Conntrack-State zu identifizieren mehr als zweifelhaft ist.

Tut mir leid... mein Laptop-Akku ist am Ende.... ich muss mich jetzt leider ausklinken.....

HIer ist mein Beispiel... ich habe mich auch nur auf die Output-Chain beschränkt, weil Du ja bemerkt hast, dass es gar nicht erst rausgeht.

Code: Alles auswählen

#!/bin/bash

/sbin/ip6tables -N HANDLERNEW
/sbin/ip6tables -N HANDLERDROP

/sbin/ip6tables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/ip6tables -A OUTPUT -o eth0 -m state --state NEW -j HANDLERNEW
/sbin/ip6tables -A OUTPUT -j HANDLERDROP

/sbin/ip6tables -A HANDLERNEW -j LOG --log-prefix "HANDLERNEW: "
/sbin/ip6tables -A HANDLERNEW -j ACCEPT

/sbin/ip6tables -A HANDLERDROP -j LOG --log-prefix "HANDLERDROP: "
/sbin/ip6tables -A HANDLERDROP -j DROP
Ein zweites Terminalfenster mit journalctl -f zeigt im gleichen Moment, wo der Ping behandelt wird. Aber wie gesagt, die Lösung ist zweifelhaft.... und imho nicht ratsam. Aber egal....

fkit
Beiträge: 17
Registriert: 21.11.2004 20:23:09

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von fkit » 02.12.2016 10:38:17

TomL hat geschrieben:Ich hatte Dich einmal gebeten das Kernel-Modul zu checken, dann noch mal um eine lsmod-Ausgabe gebeten, und jetzt ein drittes Mal?
Ich hatte doch geschrieben, daß das entsprechende conntrack Modul geladen ist. Aber bitte:

Code: Alles auswählen

~# lsmod|grep conntrack
nf_conntrack_ipv6      13605  0 
nf_defrag_ipv6         33358  1 nf_conntrack_ipv6
nf_conntrack_ipv4      18448  2 
nf_defrag_ipv4         12483  1 nf_conntrack_ipv4
xt_conntrack           12681  1 
nf_conntrack           87424  7 ipt_MASQUERADE,nf_nat,nf_nat_ipv4,xt_conntrack,iptable_nat,nf_conntrack_ipv4,nf_conntrack_ipv6
x_tables               27399  11 ip6table_filter,xt_CHECKSUM,ip_tables,xt_tcpudp,ipt_MASQUERADE,xt_conntrack,xt_LOG,iptable_filter,ipt_REJECT,iptable_mangle,ip6_tables
Tut mir leid... mein Laptop-Akku ist am Ende.... ich muss mich jetzt leider ausklinken.....
Jetzt wo es interessant wird, geht dein Akku aus, das ist schade.
HIer ist mein Beispiel... ich habe mich auch nur auf die Output-Chain beschränkt, weil Du ja bemerkt hast, dass es gar nicht erst rausgeht.

Code: Alles auswählen

#!/bin/bash

/sbin/ip6tables -N HANDLERNEW
/sbin/ip6tables -N HANDLERDROP

/sbin/ip6tables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/ip6tables -A OUTPUT -o eth0 -m state --state NEW -j HANDLERNEW
/sbin/ip6tables -A OUTPUT -j HANDLERDROP

/sbin/ip6tables -A HANDLERNEW -j LOG --log-prefix "HANDLERNEW: "
/sbin/ip6tables -A HANDLERNEW -j ACCEPT

/sbin/ip6tables -A HANDLERDROP -j LOG --log-prefix "HANDLERDROP: "
/sbin/ip6tables -A HANDLERDROP -j DROP
Ok, danke für den Vorschlag. Mir fehlt hier daß die alten Regeln vorher gelöscht werden und die Standard Policy erstmal auf DROP steht. Ich habe das also zu Beginn eingefügt und dann Dein Beispiel verwendet:

Code: Alles auswählen

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:HANDLERDROP - [0:0]
:HANDLERNEW - [0:0]
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -m state --state NEW -j HANDLERNEW
-A OUTPUT -j HANDLERDROP
-A HANDLERDROP -j LOG --log-prefix "HANDLERDROP: "
-A HANDLERDROP -j DROP
-A HANDLERNEW -j LOG --log-prefix "HANDLERNEW: "
-A HANDLERNEW -j ACCEPT
COMMIT

Code: Alles auswählen

ping6 -I eth0 fe80::230:18ff:fead:3bfb

Dec  1 07:37:01 ork kernel: [ 1460.487658] HANDLERNEW: IN= OUT=eth0 SRC=fe80:0000:0000:0000:dacb:8aff:fe31:a544 DST=fe80:0000:0000:0000:0230:18ff:fead:3bfb LEN=104 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=128 CODE=0 ID=7570 SEQ=1 
Dec  1 07:37:01 ork kernel: [ 1460.487678] HANDLERDROP: IN= OUT=eth0 SRC=fe80:0000:0000:0000:dacb:8aff:fe31:a544 DST=ff02:0000:0000:0000:0000:0001:ffad:3bfb LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0
Das Beispiel funktioniert nicht, hast Du das überhaupt ausprobiert?

mludwig
Beiträge: 793
Registriert: 30.01.2005 19:35:04

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von mludwig » 02.12.2016 10:48:16

Code: Alles auswählen

ping6 -I eth0 fe80::230:18ff:fead:3bfb

Dec  1 07:37:01 ork kernel: [ 1460.487658] HANDLERNEW: IN= OUT=eth0 SRC=fe80:0000:0000:0000:dacb:8aff:fe31:a544 DST=fe80:0000:0000:0000:0230:18ff:fead:3bfb LEN=104 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=128 CODE=0 ID=7570 SEQ=1 
Dec  1 07:37:01 ork kernel: [ 1460.487678] HANDLERDROP: IN= OUT=eth0 SRC=fe80:0000:0000:0000:dacb:8aff:fe31:a544 DST=ff02:0000:0000:0000:0000:0001:ffad:3bfb LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0
Das Beispiel funktioniert nicht, hast Du das überhaupt ausprobiert?
Sieht ja erstmal gut aus: die erste Zeile deines Logs ist aus HANDLENEW, wird dort also von der Log-Zeile erfasst und sollte in der nächsten Zeile deiner Regeln akzeptiert werden. Was mir hier fehlt ist die entsprechende Regel, das Anwortpaket zu akzeptieren (deine INPUT-Policy ist drop, es gibt aber keine definierten Regeln irgendwas zu aktezptieren bzw. in die HANDLE-Ketten zu nehmen.)

Die zweite Zeile des Logs ist das schon angesprochene NDP (Neighbor Discovery Protocol aka ARP), welches in HANDLEDROP erfasst wird. Hier scheint also das mit den States nicht zu greifen.

fkit
Beiträge: 17
Registriert: 21.11.2004 20:23:09

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von fkit » 02.12.2016 11:19:19

Danke fürs Reindenken!
mludwig hat geschrieben: Sieht ja erstmal gut aus: die erste Zeile deines Logs ist aus HANDLENEW, wird dort also von der Log-Zeile erfasst und sollte in der nächsten Zeile deiner Regeln akzeptiert werden. Was mir hier fehlt ist die entsprechende Regel, das Anwortpaket zu akzeptieren (deine INPUT-Policy ist drop, es gibt aber keine definierten Regeln irgendwas zu aktezptieren bzw. in die HANDLE-Ketten zu nehmen.)
Stimmt, das sieht erstmal nicht schlecht aus. Trotzdem wandert das Paket gleich weiter in HANDLERDROP wie Du ja auch geschrieben hast. Also doch nicht stateful. Ich habe die Regeln jetzt nochmal um wegen INPUT ergänzt, es kommt aber dasselbe Ergebnis raus:

Code: Alles auswählen

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:HANDLERDROP - [0:0]
:HANDLERNEW - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -m state --state INVALID,NEW -j HANDLERNEW
-A INPUT -j HANDLERDROP
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -m state --state INVALID,NEW -j HANDLERNEW
-A OUTPUT -j HANDLERDROP
-A HANDLERDROP -j LOG --log-prefix "HANDLERDROP: "
-A HANDLERDROP -j DROP
-A HANDLERNEW -j LOG --log-prefix "HANDLERNEW: "
-A HANDLERNEW -j ACCEPT
COMMIT

Code: Alles auswählen

~# ping6 -c 1 -I eth0 fe80::230:18ff:fead:3bfb
PING fe80::230:18ff:fead:3bfb(fe80::230:18ff:fead:3bfb) from fe80::dacb:8aff:fe31:a544 eth0: 56 data bytes
From fe80::dacb:8aff:fe31:a544 icmp_seq=1 Destination unreachable: Address unreachable

--- fe80::230:18ff:fead:3bfb ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

Dec  2 11:08:39 ork kernel: [12760.953676] HANDLERNEW: IN= OUT=eth0 SRC=fe80:0000:0000:0000:dacb:8aff:fe31:a544 DST=fe80:0000:0000:0000:0230:18ff:fead:3bfb LEN=104 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=128 CODE=0 ID=30594 SEQ=1 
Dec  2 11:08:39 ork kernel: [12760.953693] HANDLERDROP: IN= OUT=eth0 SRC=fe80:0000:0000:0000:dacb:8aff:fe31:a544 DST=ff02:0000:0000:0000:0000:0001:ffad:3bfb LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0 
Dec  2 11:08:40 ork kernel: [12761.952046] HANDLERDROP: IN= OUT=eth0 SRC=fe80:0000:0000:0000:dacb:8aff:fe31:a544 DST=ff02:0000:0000:0000:0000:0001:ffad:3bfb LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0 
Dec  2 11:08:41 ork kernel: [12762.952067] HANDLERDROP: IN= OUT=eth0 SRC=fe80:0000:0000:0000:dacb:8aff:fe31:a544 DST=ff02:0000:0000:0000:0000:0001:ffad:3bfb LEN=72 TC=0 HOPLIMIT=255 FLOWLBL=0 PROTO=ICMPv6 TYPE=135 CODE=0 
Die zweite Zeile des Logs ist das schon angesprochene NDP (Neighbor Discovery Protocol aka ARP), welches in HANDLEDROP erfasst wird. Hier scheint also das mit den States nicht zu greifen.
Das sieht so aus, richtig. Für einen ping6 bekomme ich 4 Logfileeinträge...

mludwig
Beiträge: 793
Registriert: 30.01.2005 19:35:04

Re: ip6tables ignoriert ipv6-icmp state

Beitrag von mludwig » 02.12.2016 11:29:19

Dein System schickt einen Ping, der geht auch raus (HANDLERNEW), da er dort keine Antwort erhält, versucht er dann doch nochmal die MAC zu ermitteln (mit NDP) was aber wegen der Firewallregeln nicht gelingt --> er muss also aufgeben. Meiner Meinung nach wird das Ping (deine erste Log-Zeile) nicht gedroppt, in der Kette wird ja danach alles akzeptiert.

Ergo würde ich a) rausfinden, warum auf das erste Ping keine Anwort kommt, es steht auch nix im Log --> INPUT Kette um eine Logzeile wie bei HANDLENEW erweitern! und b) die Regeln so erweitern, dass NDP funktioniert. z. B. indem ICMPv6 Type 135 erlaubt wird. NDP wird sowieso nur im lokalen Netz gemacht, dass sollte eigentlich auch sicherheitsmäßig unkritisch sein, gleichzeitig ist es eigentlich elementar wichtig. Dein Gegenüber (der PC den du anpingen möchstest), schickt bestimmt auch ein NDP, um die MAC von dir rauszufinden. Die bleibt vielleicht auch schon im INPUT hängen.

Antworten