Hurricane Electric 6in4-Tunnel unter FreeBSD einrichten

Besitzt ein Server keine IPv6-Anbindung kann hierfür ein 6in4-Tunnel eingesetzt werden, dabei werden IPv6-Pakete über IPv4 verschickt werden.

Inhalt

  1. Einmalige Einrichtung
  2. Dauerhafte Einrichtung
  3. Keepalive-Dienst

Ein Anbieter dafür ist der amerikanische ISP Hurricane Electric (HE) mit dem kostenlosen Dienst tunnelbroker.net können nach der Registrierung bis zu 5 Tunnel erzeugt werden. Zwar stellt HE Konfigurationsbeispiele für die meisten Betriebssysteme bereit, jedoch sind diese nicht permanent und müssen somit nach jedem Neustart neu angewandt werden.

Einmalige Einrichtung

Zur einmaligen Einrichtung (für FreeBSD) stellt HE ein Skript bereit, dabei werden die in Großbuchstaben geschriebenen Namen durch die jeweiligen IP-Adressen ersetzt, die in den Tunneldetails unter "IPv6 Tunnel Endpoints" steht.

#!/bin/sh

ifconfig gif0 create
ifconfig gif0 tunnel CLIENT_IPV4 SERVER_IPV4
ifconfig gif0 inet6 CLIENT_IPV6 SERVER_IPV6
route -n add -inet6 default SERVER_IPV6
ifconfig gif0 up

Durch das Skript wird ein generisches Tunnelinterface (gif0) zuerst angelegt und konfiguriert, anschließend die IPv6-Serveradresse von HE zur Routingtabelle hinzugefügt. Schließlich wird der Tunnel aktiviert.

Dauerhafte Einrichtung

Zur dauerhaften Einrichtung müssen die Netzwerkeinstellungen in die /etc/rc.conf bzw. in die /etc/rc.conf.local eingetragen werden:

cloned_interfaces="gif0"
ifconfig_gif0="tunnel CLIENT_IPV4 SERVER_IPV4 mtu 1480"
ifconfig_gif0_ipv6="inet6 CLIENT_IPV6 SERVER_IPV6 prefixlen 128"

# vtnet0 durch das Hauptnetzwerkinterface ersetzen
ifconfig_vtnet0_ipv6="inet6 SERVER_IPV6"

ipv6_defaultrouter="SERVER_IPV6"
ipv6_gateway_enable="YES"

rtadvd_enable="YES"

Dabei muss vtnet0 durch das eigentlich verwendete Hauptnetzwerkinterface ersetzt werden! Die MTU kann bei HE netzwerkabhängig auf einen kleineren Wert eingestellt werden.

Nach einem Neustart sollten die Einstellungen angewendet sein. Die Ausgabe von ifconfig sollte dann ähnlich aussehen:

ifconfig
vtnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
    options=6c07bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
    ether 11:22:33:44:55:66
    hwaddr 11:22:33:44:55:66
    inet6 2001:DB8:0:1::1 prefixlen 64
    inet6 fe80::11:22:33ff:fe:44:55:66%vtnet0 prefixlen 64 scopeid 0x1
    inet 1.2.3.4 netmask 0xffffffc0 broadcast 79.133.35.127
    nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
    media: Ethernet 10Gbase-T <full-duplex>
    status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
    options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
    inet6 ::1 prefixlen 128
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
    inet 127.0.0.1 netmask 0xff000000
    nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
    groups: lo
gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1480
    options=80000<LINKSTATE>
    tunnel inet 1.2.3.4 --> 216.0.0.0
    inet6 2001:DB8:0:1::2 --> 2001:DB8:0:1::1  prefixlen 128
    inet6 fe80::11:22:33ff:fe:44:55:66%gif0 prefixlen 64 scopeid 0x1
    nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
    groups: gif

Keepalive-Dienst

Der 6in4-Tunnel wird automatisch getrennt, wenn dieser nicht mehr genutzt wird. Als Keepalive-Dienst kann ein im Hintergrund laufender Ping-Prozess über IPv6 verwendet werden.

Damit der Hintergrundprozess verwaltbar bleibt wird ein Dienst eingerichtet (ping6keepalive):

/usr/local/etc/rc.d/ping6keepalive:

#!/bin/sh
#
# PROVIDE: ping6keepalive
# REQUIRE: networking

. /etc/rc.subr

name="ping6keepalive"
desc="Ping6 daemon for keepalive"
rcvar="${name}_enable"

load_rc_config ${name}

: ${ping6keepalive_enable:="NO"}

pidfile="/var/run/${name}.pid"
procname="/sbin/ping6"
command="/usr/sbin/daemon"
command_args="-u nobody -p ${pidfile} ${procname} -i 30 freebsd.org < /dev/null >> /dev/null 2>&1"

run_rc_command "$1"

Download: ping6keepalive

Der Dienst wird unter /etc/rc.conf bzw. /etc/rc.conf.local aktiviert:

ping6keepalive_enable="yes"

Anschließend wird der Dienst ausführbar gemacht und gestartet:

chmod +x /usr/local/etc/rc.d/ping6keepalive
service ping6keepalive start
Starting ping6keepalive.
service ping6keepalive status
ping6keepalive is running as pid 16649