IPv6 in Jails

crotchmaster

happy BSD user
Ein Hallo in die Runde!

Vorweg muss ich sagen, dass ich in Sachen IPv6 ein noob bin, speziell das routing finde ich doch etwas undurchsichtig.
Die ganzen Dienste, die es diesbezüglich gibt und auch dass das Gateway außerhalb des Subnetzes liegen kann, vereinfachen die Materie nicht gerade.

Ich habe einen Server mit FreeBSD 11.0 laufen, auf dem 5 Jails rennen. Der Server hat zwei öffentliche IPv4 Adressen und
eine Menge IPv6 Adressen. Ich habe vom Provider einen Netzbereich mit der prefixlen 96 bekommen (2001:1b60:aaaa:bbbb:cccc:101::/96).

Die Jails verwalte ich mit ezjail und sie haben die Interfaces lo1 bis lo5 mit den IP-Adressen 127.0.1.1 bis 127.0.5.1.
Eingehende Verbindungen werden per rdr in die Jails umgeleitet, während ausgehende Verbindungen per nat raus gehen.
Das funktioniert soweit.

Auf dem Host habe ich IPv6 wie folgt eingerichtet:

/etc/rc.conf

Code:
ipv6_default_interface="em0"
ifconfig_em0_ipv6="inet6 2001:1b60:aaaa:bbbb:cccc:101::1 prefixlen 64"
ipv6_defaultrouter="fe80::225:90ff:fe34:52e7%em0"

Ich kann vom Host mittels ping6 andere Hosts anpingen.

Eine ezjail config sieht so aus:

/usr/local/etc/ezjail/webserver1

Code:
export jail_webserver1_hostname="webserver1"
export jail_webserver1_ip="lo1|127.0.1.1,lo1|2001:1b60:aaaa:bbbb:cccc:101:1:1"
export jail_webserver1_rootdir="/jails/webserver1"
export jail_webserver1_exec_start="/bin/sh /etc/rc"
export jail_webserver1_exec_stop=""
export jail_webserver1_mount_enable="YES"
export jail_webserver1_devfs_enable="YES"
export jail_webserver1_devfs_ruleset="devfsrules_jail"
export jail_webserver1_procfs_enable="YES"
export jail_webserver1_fdescfs_enable="YES"
export jail_webserver1_image=""
export jail_webserver1_imagetype="zfs"
export jail_webserver1_attachparams=""
export jail_webserver1_attachblocking=""
export jail_webserver1_forceblocking=""
export jail_webserver1_zfs_datasets=""
export jail_webserver1_cpuset=""
export jail_webserver1_fib=""
export jail_webserver1_parentzfs="zroot/jails"
export jail_webserver1_parameters=""
export jail_webserver1_post_start_script=""
export jail_webserver1_retention_policy=""

Vom Host kann ich die IPv6-Adresse des Jails anpingen und umgekehrt, allerdings kann ich vom Jail aus keine externen Hosts anfingen, weder mit aktiviertem noch mit deaktiviertem pf. Auch das Pingen auf die Jail IPv6-Adresse von außerhalb schlägt fehl.

Meine IPv6 Regeln in der /etc/pf.conf sehen zur Zeit so aus.

Code:
extIf="em0"
jailIpv6="{ 2001:1b60:aaaa:bbbb:cccc:101::1/96 }"

scrub in all
antispoof for { $extIf }
block in log all
pass in quick inet6 proto icmp6 from any to any
pass out on $extIf inet6 proto { tcp, udp, icmp6 } from any to any

Ich hoffe, ich könnt mit den Infos etwas anfangen. Wenn nicht, liefere ich weitere Infos nach.

Ich freue mich auf Euere Antworten. Vielen Dank schon mal für das Lesen.
 
Du musst die Jail IPv6 Adressen schon auf dem externen Interface liegen haben. Wenn du zwei Interfaces mit den selben Netzen darauf hast, wird zwischen denen nicht geroutet. Ist ja bei IPv4 auch nicht anders.
Alternativ kannst du auch ULAs für die Jails verwenden, das sind die Pendants zu den privaten Adressbereichen in IPv4. Und dann analog zu deinem IPv4 Setup per redirect rein und NAT rausgehen.

dass das Gateway außerhalb des Subnetzes liegen kann
Das ist so nicht richtig. Das Gateway muss schon im selben Subnetz liegen oder im Link-Lokalen Bereich fe80::/10. Link-Lokal ist quasi das Pendant zu den MAC Adressen, die man bei v4 noch per ARP auflösen musste. Also ganz vereinfacht gesagt und daher natürlich nicht ganz richtig, aber das ist der Gedanke dahinter.
 
Ich möchte kurz über den Stand der Dinge berichten. Es funktioniert nun. Was habe ich gemacht?

Ich habe wie empfohlen die IPv6-Adressen an das externe Interface gebunden und anschließend die ezjail config bearbeitet, da beim Start der Jails eine Fehlermeldung aufpopte.

Die wichtige Zeile ist diese:

vorher
Code:
export jail_webserver1_ip="lo1|127.0.1.1,lo1|2001:1b60:aaaa:bbbb:cccc:101:1:1"

jetzt
Code:
export jail_webserver1_ip="127.0.1.1,2001:1b60:aaaa:bbbb:cccc:101:1:1"

Das war mir nicht bekannt, dass ich auch nur die IP angeben kann, um den Jails die IP-Adresse(n) mitzugeben.

Bei meiner ganzen Rumprobiererei, habe ich auch die pf.conf bearbeitet, so dass es immer noch nicht ging. Bei deaktiviertem Filter ging alles, was für ein Problem mit der Firewall sprach. Auch für einige Minuten nach reaktiviertem Paketfilter, gefühlt 10-15 Minuten, ging alles. Dann aber irgendwann nicht mehr. So hatte ich also in meinem Wahn, die Schotten dicht zumachen, ausgehendes icmp6 nur von meinem Netz aus erlaubt. Das war ein Fehler. Ich habe nun folgende Regel als Ausgangsregel für icmp6:

Code:
icmp6_types_extIf = "{ echoreq, echorep, unreach, toobig, timex, paramprob, neighbradv, neighbrsol, routeradv, routersol }"
...
pass out inet6 proto icmp6 from any to any icmp6-type $icmp6_types_extIf keep state

Damit habe ich wohl Antwortpakete auf router solicitation oder neighbor discovery Anfragen verboten, die scheinbar von link local ausgehen. Mit der Regel geht es nun. Aber ich muss mir noch etwas mehr Wissen zu IPv6 anlesen.

@KobRheTilla
Das das IPv4 Gateway außerhalb des eigenen Subnetzen sein kann war mir klar und hatte ich so etwas in der Vergangenheit auch schon im Einsatz. Nur musste man die Route händisch dafür setzen, während es beim IPv6 irgendwie elektrisch geht. Das war mir neu und für mich unerwartet.

Danke noch mal an Euch!

Gruß c.
 
Nur musste man die Route händisch dafür setzen, während es beim IPv6 irgendwie elektrisch geht.
Es unterscheidet sich überhaupt nicht vom Verhalten zu IPv4. Link-local ist für den Betrieb von IPv6 in der Regel zwingend, daher konfiguriert das OS auf allen IPv6-aktiven Interfaces grundsätzlich eine solche Adresse. Wenn dies geschieht (ifconfig) wird natürlich auch eine Routeninformation angelegt, nämlich dass fe80::%<interfacename>/64 über <interface> geroutet wird, somit ist die Route zum GW bekannt, wenn es via link-local angesprochen wird.

Rob
 
Zurück
Oben