NAT64/DNS64 mit OpenBSD, pf und unbound

NAT64/DNS64 mit OpenBSD, pf und unbound

Übersicht

NAT64 ist eine Technologie, um IPv4 Adressen per IPv6 erreichbar zu machen. Dabei macht man eine 1:1 Abbildung der IPv4-Adressen auf IPv6-Adressen. Im RFC6052 ist dafür 64:ff9b::/96 vorgesehen. Das NAT-Gateway übersetzt dann wiederum von der 1:1-abgeildeten IPv6-Adresse die Anfrage in IPv4. Das NAT64 benötigt hier für eine IPv4-Quelladresse zur Abbildung.

Damit NAT64 genutzt werden kann, benötigt man als Hilfsdienst DNS64. Bei DNS64 ergänzt der Resolver eine fehlende AAAA-Record um einen Fake-Record, der einer Abbildung des A-Records in das oben genannte NAT64-Präfix entspricht. Wir nutzen für DNS64 unbound und lassen diesen mit auf den NAT64-Gateways laufen.

Für die Redundanz bietet es sich an, zwei NAT64-Gateways zu betreiben. Die Gateways announcen via BGP beide das IPv6 Präfix und die DNS64-Adresse. Einerseits soll damit Redundanz erreicht werden. Andererseits die Übersetzung möglichst nahe am Client statt finden.

Umsetzung

Als NAT64-Gateway hat sich OpenBSD bewährt, da die Firewall-Kernel-Implementierungen von Linux derzeit noch kein NAT64 unterstützen. Die Firewalltechnik pf von OpenBSD beherrscht hingegen NAT64 und führt diese im Kernelspace sehr performant aus.

Dazu wird zuerst OpenBSD installiert. Dabei kann ein Standard-Setup gewählt werden (SSH, kein X-Server), Netzwerkeinstellungen können nach dem Setup vorgenommen werden.

Nach erfolgreichem Setup müssen die folgenden Einstellungen vorgenommen werden:

Resolver in /etc/resolv.conf konfigurieren:

nameserver 2001:db8::53:1
nameserver 2001:db8::53:2

Standard-Gateways für IP und IPv4 in /etc/mygate konfigurieren:

2001:db8::1
203.0.113.1

Die Interface-Adressen werden in /etc/hostname.ifname konfiguriert. ifname wird dabei durch den namen des entsprechenden Interfaces ersetzt, z.B. vmx0:

inet <ipv4> <ipv4-netmask> NONE
inet6 <ipv6> 64

Nun wird nat64 in der firewall aktiviert, /etc/pf.conf. hierbei ifname wieder ersetzem:

set skip on lo

block return    # block stateless traffic
pass            # establish keep-state

# By default, do not permit remote connections to X11
block return in on ! lo0 proto tcp to port 6000:6010

# Port build user does not need network
block return out log proto {tcp udp} user _pbuild

pass in on ifname inet6 from any to 64:ff9b::/96 af-to inet from <ipv4 nat source>

Nun werden die Loopback-Adressen für die lokal laufenden resolver in /etc/hostname.lo53 konfiguriert:

description "DNS64 Addresses"
inet6 2001:db8::64:1 128
inet6 2001:db8::64:2 128 

Der DNS64 resolver wird in /var/unbound/etc/unbound.conf konfiguriert:

server:
        interface: 127.0.0.1
        interface: ::1
        interface: 2001:db8::64:1
        interface: 2001:db8::64:2

        access-control: 0.0.0.0/0 refuse
        access-control: 127.0.0.0/8 allow
        access-control: ::0/0 refuse
        access-control: ::1 allow
        access-control: 2001:db8::/32 allow

        hide-identity: yes
        hide-version: yes

        qname-minimisation: yes

        # Uncomment to enable DNSSEC validation.
        #
        auto-trust-anchor-file: "/var/unbound/db/root.key"

        # DNS64 options, synthesizes AAAA records for hosts that don't have
        # them. For use with NAT64 (PF "af-to").
        #
        module-config: "dns64 validator iterator"
        #dns64-prefix: 64:ff9b::/96     # well-known prefix (default)
        #dns64-synthall: no

remote-control:
        control-enable: yes
        control-use-cert: no
        control-interface: /var/run/unbound.sock

forward-zone:
        name: "."
        forward-addr: 2001:db8::53:1
        forward-addr: 2001:db8::53:2

Weiterhin die daemon flags für unbound in /etc/rc.conf.local setzen:

unbound_flags=

Abschließend wird bgpd konfiguriert, sodass der NAT64-Präfix und die Loopback-Adressen announced werden:

AS 64496
router-id <router-id>
connect-retry 5
log updates

prefix-set nat64networks { 64:ff9b::/64, <nat-src>/32 }
prefix-set dns64networks { 2001:db8::64:1/128, 2001:db8::64:1/128 }

network prefix-set nat64networks
network prefix-set dns64networks
#network inet6 connected

group "backbone" {
    neighbor <ipv6-neighbor> {
        remote-as 64511
    }
    neighbor <ipv4-neighbor> {
        remote-as 64511
    }
}

allow to any prefix-set nat64networks
allow to any prefix-set dns64networks

Auch für bgpd werden die daemon flags in /etc/rc.conf.local gesetzt:

bgpd_flags=

Zum Abschluss einen Reboot durchführen.

Weitere Schritte

Nach erfolgter Installation sollten weitere Dienste konfiguriert werden, z.B. SSH, SMTP sowie der NTP-Client.