Warum kann IPv6 in pf sowohl als "Protokoll" als auch als Adressfamilie angegeben werden?

716
Stilez

In der pf-Firewall gibt der Abschnitt "parameters" der pf.conf-Manpage an, dass "protocol"etwas ist /etc/protocols, und dass es sich von "address family"( "<af>") unterscheidet, das inet oder inet6 ist. /etc/protocolswiederum enthält "IPv6" als Protokoll, und in BSD-basierten Anwendungen wie der pfSense-Firewall wird IPv6 manchmal als Protokoll aufgeführt, im Unterschied zu einer IP-Familie (z. B. in NAT-Regeldefinitionen).

IPv6 ist jedoch kein Protokoll in dem Sinne, dass TCP / UDP / icmp sind. Es gibt einen klaren logischen und funktionalen Unterschied zwischen IPv4 / IPv6 als den beiden IP-Adressfamilien (dem zugrunde liegenden Transport) und den vielen Protokollen, die innerhalb von IPv4 / IPv6 transportiert werden.

(Wäre es dann
nat on em1 inet proto ipv6 from 1.2.3.4 to any -> 5.6.7.8 port 2000:2999und
block drop in inet proto ipv6 from 1.2.3.4 to any
wäre sinnvoll und vergleichbar mit
nat on em1 inet proto tcp from 1.2.3.4 to any -> 5.6.7.8 port 2000:2999und
block drop in inet proto tcp from 1.2.3.4 to any)

Wann ist IPv6 sinnvoll oder wird im Feld "Protokoll" in einer PF-Regel verwendet, anstatt es als Adressfamilie anzugeben? (Und könnte NAT fast immer nur für IPv4 verwendet werden, hat das etwas damit zu tun?)

2

1 Antwort auf die Frage

2
grawity

IPv6 ist ein Protokoll in dem Sinne, dass TCP / UDP / ICMP sind. Während sie auf verschiedenen Ebenen arbeiten, hindern Sie nichts daran, IP auf IP zu legen, um einen einfachen VPN-artigen Tunnel zu erhalten. (Vergleichen Sie dies mit IP in GRE innerhalb von IP.) Aus diesem Grund haben sowohl IPv4 als auch IPv6 Protokollnummernzuweisungen - ein verschachteltes IPv4-Paket ist "Protokoll 4", IPv6 ist "Protokoll 41".

Insbesondere ist IPv6-over-IPv4 auch als "6in4" oder "proto41" bekannt, ein üblicher Übergangsmechanismus, der zum Erhalten von IPv6-Konnektivität von einem Tunnelanbieter über ein IPv4-Netzwerk verwendet wird. (Hurricane Electric ist ein populärer; es gibt auch automatische "6to4" mit Anycast-Relais.)

pfSense hat eine Dokumentation für die Konfiguration eines solchen Tunnels - in FreeBSD würde dies über eine gif (4) -Schnittstelle erfolgen. unter Linux mit sit oder ipip . Der Tunnelanbieter verfügt über eine identische (aber gespiegelte) Konfiguration, die das innere IP-Paket entpackt und an das native IPv6-Netzwerk weiterleitet.

Dies ist nicht die idealste Tunnelmethode im Vergleich zu zB GRE, L2TP (nur ein Tunnel pro äußeres src / dst-Paar); oder FOU, GUE (viele Heimrouter erlauben keine Portweiterleitung, die nicht TCP oder UDP ist); oder spezielle VPN-Protokolle (keine Authentifizierung, keine Verschlüsselung). Es ist jedoch der einfachste mögliche Tunnel und einer mit dem geringsten Overhead (nur 20 Bytes).


Obligatorische "Inception" -Referenz: IPv4 erfordert eine Mindest-MTU von 68 Byte, während IPv6 es auf 1280 Byte aufstockt. Bei einer Standard-Ethernet-MTU von 1500 können Sie maximal 70 IPv4-Tunnel stapeln, für IPv6 ebenfalls etwa 5 Schichten.

Wenn dies der Grund war, hätte ich erwartet, dass es als "gekapseltes IPv6" bezeichnet wird, um es von dem zugrunde liegenden Transport zu unterscheiden. Es ist im Gegensatz zu Computerstandards, auf diese Weise Mehrdeutigkeit zu erzeugen. Bedeutet das also, dass durch das Filtern von inet proto ipv6 nur IPv6 erfasst wird, das über IPv4 _some_-Art gekapselt wurde? Stilez vor 8 Jahren 0
Nun, es ist _already_ als "gekapseltes IPv6" gekennzeichnet, basierend auf der Tatsache, dass "proto" immer mit dem Protokollfeld des (äußeren) IP-Headers und nicht mit dem Ethertyp des Ethernet-Headers übereinstimmt. Inet proto ipv6 ist also wirklich etwas, das Sie nur für 6to4-Tunnel verwenden würden. grawity vor 8 Jahren 0