Im Zuge meiner Unitymedia Umstellung habe ich auch native IPv6 Konnektivität (via DHCPv6 + Prefix Delegation) erhalten, welche ich zuvor mit einem Tunnel von Hurricane Electric realisiert hatte. Auf der Fritzbox selbst funktioniert die Dual-Stack Adressierung logischerweise out-of-the-box. Ich nutze allerdings den Bridge-Modus, um meine eigene Firewall hinter der Fritzbox zu betreiben. Dies geht allerdings nur in Business-Verträgen, wie ich neulich festgestellt habe.

Klemme ich mein Linux Notebook an diesen Bridge-Port, bekomme ich ebenfalls sofort eine Dual Stack Adressierung. JunOS verhält sich dabei aber deutlich anders als andere Router/Firewalls.

IPv6 flow mode aktivieren

IPv6 ist ebenfalls wie MPLS und das ISO Protokoll per default deaktiviert. Falls es noch nicht aktiv ist, muss es natürlich eingeschaltet werden. Dabei verwende ich den Flow-Mode, da das Gerät bei mir die Funktion der stateful Firewall übernimmt.

set security forwarding-options family inet6 mode flow-based

Systemdefaults setzen

system {
    host-name Resistance;
    domain-name commander1024.de;
    domain-search commander1024.de;
    time-zone Europe/Berlin;
    no-redirects;
    no-redirects-ipv6;
    internet-options {
        path-mtu-discovery;
        no-source-quench;
        tcp-drop-synfin-set;
        no-ipv6-reject-zero-hop-limit;
    }

DHCPv6 Client konfigurieren

Bei der Konfiguration des DHCPv6 Clients gilt es unbedingt zu beachten, dass die SRX Branch Series (3xx) maximal 3 ‘update router-advertisement’ Statements beinhalten darf. Mehr als 3 Netze/VLANs können mit einer kleinen SRX also nicht mit dynamischer IPv6 Adressierung ausgestattet werden. Eine dieser komplett sinnlosen, künstlichen Beschränkungen, denen mein ganzer Hass sicher ist.

interfaces {
    ge-0/0/0 {
        description "WAN @Unitymedia";
        unit 0 {
            family inet {
                dhcp-client {
                    client-identifier {
                        prefix {
                            host-name;
                        }
                    }
                    retransmission-attempt 6;
                    retransmission-interval 5;
                    vendor-id ether;
                }
            }
            family inet6 {
                dhcpv6-client {
                    client-type stateful;
                    client-ia-type ia-na;
                    client-ia-type ia-pd;
                    rapid-commit;
                    prefix-delegating {
                        preferred-prefix-length 59;
                    }
                    update-router-advertisement {
                        interface ae0.100 {
                            other-stateful-configuration;
                        }
                    }
                    client-identifier duid-type duid-ll;
                    update-server;
                    retransmission-attempt 6;
                }
            }
        }
    }

Der wichtigste Punkt – meiner Meinung – ist, dass der router-advertisement Client so konfiguriert werden muss, wie er die Einstellungen vom Server erwartet. Weicht die config von den Servereinstellungen ab, schlägt die Adressvergabe fehl. Zumindest bin ich hieran fast verzweifelt.

protocols {
    router-advertisement {
        interface ge-0/0/0.0 {
            managed-configuration;
            other-stateful-configuration;
            current-hop-limit 64;
            default-lifetime 1800;
        }
    }

Ob Konflikte zwischen erwarteter und gelieferter Konfiguration bestehen, lässt sich mit ‘show ipv6 router-advertisement conflicts’ anzeigen. Gibt es keine, bleibt die Ausgabe leer. Natürlich lassen sich auch alle RA-Infos (aller Interfaces) ausgeben. Hier drin schlummert auch die link-lokale Adresse des Routers, die ich später noch konfigurieren muss.

Commander1024@Resistance> show ipv6 router-advertisement              
Interface: ge-0/0/0.0
  Advertisements sent: 1535, last sent 00:02:50 ago
  Solicits received: 0
  Advertisements received: 197752
  Solicited router advertisement unicast: Disable
  Advertisement from fe80::201:5cff:fe79:a846, heard 00:00:02 ago
    Managed: 1
    Other configuration: 1
    Reachable time: 3600000 ms
    Default lifetime: 1800 sec
    Retransmit timer: 2000 ms
    Current hop limit: 0
Commander1024@Resistance> show dhcpv6 client binding detail     

Client Interface/Id: ge-0/0/0.0
     Hardware Address:             f4:a7:39:22:94:00
     State:                        BOUND(DHCPV6_CLIENT_STATE_BOUND)
     ClientType:                   STATEFUL
     Lease Expires:                2019-08-11 10:09:34 CEST
     Lease Expires in:             1114292 seconds
     Lease Start:                  2019-07-28 10:09:34 CEST
     Bind Type:                    IA_NA IA_PD
     Preferred prefix length       59
     Sub prefix length             64
     Client DUID:                  LL0x3-f4:a7:39:22:94:00
     Rapid Commit:                 On
     Server Identifier:            fe80::201:5cff:fe79:a846
     Update Server                 Yes
     Client IP Address:            2a02:908:d00:8:d4bf:31b9:ba8e:510b/128
     Client IP Prefix:             2a02:908:d8a:cea0::/59

DHCP options:
    Name: server-identifier, Value: LL_TIME0x1-0x15b982b6-00:21:28:c0:a9:35

Update RA interfaces:
     Interface: ae0.100
            RA Prefix:      2a02:908:d8a:cea0::/64
     Interface: ae0.254
            RA Prefix:      2a02:908:d8a:cea1::/64
     Interface: ge-0/0/3.0
            RA Prefix:      2a02:908:d8a:cea2::/64

Interne Interfaces konfigurieren

IPv6 muss auf den internen Interfaces nicht konfiguriert werden, da die Prefixes bereits durch den DHCPv6 Client zugeteilt wurden:

Commander1024@Resistance# show interfaces ae0 unit 100 
description "trusted LAN";
vlan-id 100;
family inet {
    address 192.168.122.1/24;
}

Default route hinzufügen

Ich habe es nicht hinbekommen, dass die vom DHCPv6 Server gelernte Default Route auch wirklich in die Routingtabelle eingetragen wird. Ich musste sie daher händisch setzen. Als Next-Hop verwendet ich die link-lokale Adresse des “entfernten” Unitymedia Routers. Das kann freilich nur so lange funktionieren, wie die sich nicht ändert.

routing-options {
    rib inet6.0 {
        static {
            route ::/0 {
                qualified-next-hop fe80::201:5cff:fe79:a846 {
                    interface ge-0/0/0.0;
                }
            }
        }
    }

Firewall konfigurieren

        security-zone untrust {
            screen untrust-screen;
            interfaces {
                ge-0/0/0.0 {
                    host-inbound-traffic {
                        system-services {
                            dhcp;
                            dhcpv6;
                            ssh;
                            ping;
                            ike;
                            https;
                            ident-reset;
                        }
                        protocols {
                            router-discovery;
                        }
                    }
                }
            }
        }
   policies {
        from-zone trust to-zone untrust {
            policy deny-untrust-dns {
                description "Deny direct communication with external DNS server";
                match {
                    source-address any;
                    destination-address any;
                    application [ junos-dns-udp junos-dns-tcp ];
                }
                then {
                    reject;
                }
            }
            policy trust-to-untrust {
                match {
                    source-address any;
                    destination-address any;
                    application any;
                }
                then {
                    permit;
                    count;
                }
            }
        }
    }