Multi-homed: Telekom, Vodafone and Hetzner

Problem

I refined my network configuration a bit, because there was a problem: When I pinged the Vodafone IPv6 address of hadante from my new, shiny Hetzner box, it wouldn’t answer, because I got the policy routing wrong.

Initially I routed everyting to Hetzner via the Vodafone interface, but that’s plain wrong. This way hadante even sent packets originating from Telekom IP’s via the Vodafone interface, with the Telekom IP as source. What I really wanted:

  1. answer requests to the Vodafone interface via Vodafone
  2. make Telekom the default route

Answer requests to the Vodafone IP

The solution was easy: create a rule to send everything from the Vodafone interface out there. Unfortunately, nothing is as easy as it seems. Because the Vodafone-IPv6-Prefix is semi-static, systemd-networkd policy routing doesn’t work. The routing table can be filled automatically:

[Match] 
Name=ext 

[Network] 
DHCP=yes 
IPv6Token=::dead:b0a1 

[DHCP] 
RouteMetric=4096 
RouteTable=199 

[IPv6AcceptRA] 
RouteTable=199

The RouteTable directive adds the routes acquired by DHCP and Router Announcments to the routing table 199 (aka kd, see /etc/iproute2/rt_tables), but without a rule it doesn’t do anything. The IPv6Token directive sets the IPv6 address to <prefix>::dead:b0a1, by the way.

The rule is added by a perl script written by yours truly. It does something like this (pseudo perl code):

...
$old = <old IPv6 address>;
$new = <new IPv6 address>;
# match old prefix
$old =~ m#^([[:xdigit:]]{1,4}:[[:xdigit:]]{1,4}:[[:xdigit:]]{1,4}:[[:xdigit:]]{1,4}:)#;
# delete old rule
system("/usr/bin/ip -6 rule dele from $1:/64 table kd");
# match new prefix
$new =m#^([[:xdigit:]]{1,4}:[[:xdigit:]]{1,4}:[[:xdigit:]]{1,4}:[[:xdigit:]]{1,4}:)#;
# add new rule
system("/usr/bin/ip -6 rule add from $1:/64 lookup kd");
...

This way both the Telekom IP and the Vodafone IP work from anywhere. As a bonus, IPv6 requests to Hetzner from the delegated Telekom IPv6 network now work, too 🙂

Configuring the Telekom interface

During my network configuration spree I tried to configure the Telekom interface with systemd-networkd instead of dhcpcd, but that didn’t work, unfortunately. I couldn’t get the prefix delegation to the internal interface to work. Supposedly systemd-networkd can do it, but the documentation is, let’s say, sparse at best. After several attempts I gave up and reverted to dhcpcd, as described in this post.

Telekom und IPv6 – Total tell, Todd!

Zuvörderst…

… muss man IPv6 Konnektivität herstellen. Wie das geht, habe ich in diesem Artikel beschrieben.

Wenn man aber mehr will…

… wie z. B. ein geroutetes /56er, dann muss man sich weiter anstrengen.

Das geroutete Netz bekommt man nur via DHCPv6. Am einfachsten geht das mit dhcpcd6 und einer dafür gemachten Konfiguration. Davon ausgehend, dass ppp0 das PPPoE-Interface der Telekom ist, muss sie so aussehen:

duid 
noipv6rs 
waitip 6 
ipv6only 
interface ppp0 
ipv6rs 
iaid 1 
ia_pd 1 int
  • iaid ist lediglich ein Identifier, den man referenzieren kann/muss
  • die letzte Zeile “ia_pd 1 int” ist interessant: “int” ist der Name des Netzwerk-Interfaces, dem ein Prefix zugeteilt werden soll.  Standardmäßig bekommt das Teil ein /64-Prefix mit der IP-Adresse Prefix::1/64

ACHTUNG: DHCPv6 läuft über UDP/ipv6, Port 546 ausgehend. Sonst geht gar nix! Hier die Iptables-Regel, wenn die INPUT-Policy Drop heißt:

ip6tables -I INPUT -i ppp0 -p udp -m udp --dport 546 -j ACCEPT

Wenn nix geht, zum Testen die Policies auf “ACCEPT” setzen und dann mit tcpdump schnüffeln.

Wenn man ein Prefix bekommen hat, sollte man…

RADVD installieren…

Und zwar mit folgender Config:

interface int { 
        AdvSendAdvert on; 
        MinRtrAdvInterval 3; 
        MaxRtrAdvInterval 10; 
        prefix ::/64 { 
                AdvOnLink on; 
                AdvAutonomous on; 
                AdvRouterAddr on; 
        }; 
};

“int” ist wiederum das Interface, welches das geroutete Prefix bekommen hat und irgendwie im LAN ist. Wenn an den angeschlossenen Geräten IPv6-Autokonfiguration aktiviert ist, sollten alle glücklich sein 🙂

Nachteile

Mit SLAAC (also Autokonfiguration) und NetworkManager kann zumindest im GUI keine statischen IPv6-Adressen vergeben, da hilft nur IPv4, aber das kriege ich auch noch geregelt 🙂

Telekom VDSL2 100/40

Bestellung und Auslieferung

Am 27.04.2016 habe ich via Internet Magenta Zuhause L bestellt (100/40 Mbit). Als Neukunde hat man sich geradezu rührend um mich gekümmert. Am 09.05.2016 wurde ich angerufen, um die Details der Installation abzuklären. War ganz gut so, denn aus den zahlreichen E-Mails habe ich nicht erkennen können, ob ein Techniker kommen muss oder nicht.

Es musste ein Techniker kommen. Das Zeitfenster war grandios: zwischen 8 und 16 Uhr. Allerdings hat er angerufen, bevor er losgefahren ist und angekündigt, dass er in 20 bis 30 Minuten vor Ort sei. So war es dann auch.

Als Erstes hat er ein Gerät an die TAE in der Wohnung angenöppelt, danach ging es in den Keller zum Hausanschluss. Dort hat er zwei Drähte rausgerupft und zwei andere aufgelegt. Wieder in der Wohnung hat der den Anschluss durchgemessen: 109Mbit/s Downstream. YEAH!

Das war Kundenservice par Exellence, muss ich sagen. Kann mich nicht beschweren!

Hartware

Da ich einen Router wollte, den man als Modem betreiben kann, habe ich den angebotenen Speedport-Trum nicht bestellt, da die Telekom den Modem-Modus aus der Firmware entfernt hat. Nach ein wenig F&E hat sich das Draytek Vigor 130 als Waffe der Wahl herausgestellt. Kostenpunkt: 103,92 € bei Amazon.

Laut Beschreibung vectoring-fähig, hat allerdings nur einen LAN-Anschluss. Egal, Karl. Hadante soll es routen 🙂

Voller Erwartung habe ich das Teil also angenöppelt und auf den Sync gewartet. Als er denn endlich da war, kam die große Enttäuschung: Lediglich 16Mbit/s, es sprach nur ADSL2+ 🙁 Also noch mehr F&E…

Dabei stellte sich heraus, dass ich eine spezielle Firmware benötige, damit das Teil VDSL spricht. Die bekommt man hier: Vigor130_v3.7.9_modem7.zip ist das Archiv der Wahl. Das ist die Version für G.Vectoring. Nach dem Firmware-Update hatte ich endlich die erwarteten 100/40 Mbit, Juchuu!

Modem-Betrieb

Um das Teil als Modem zu betreiben, muss man folgende Einstellungen vornehmen:

Internet Access -> General Setup
DSL Mode: Auto
VLAN Tag insertion (ADSL): Disable
VLAN Tag insertion (VDSL2): Enable
 Tag value: 7
 Priority: 0

PPPoE läuft auf VLAN 7, VLAN 8 ist IPTV, AFAIK. Abspeichern + Reboot des Modems. Dann:

Internet Access -> MPoA / Static or dynamic IP
MPoA (RFC1483/2684): Enable
Bridge Mode: "Enable Bridge Mode"

Abspeichern und obligatorischer Reboot des Modems. Danach darf man den “Roaring Penguin” bemühen.

Linux-Setup

Ich habe mir eine 1Gbit/s NIC von Intel gekauft: Die Intel EXPI9301CTBLK PRO1000 (Kernel Module e1000e). Die ist direkt mit dem Modem verbämselt. Wenn man den Benutzernamen unfallfrei zusammen klöppelt, ist der Rest ziemlich schmerzfrei. Der Benutzername lautet: <Anschlusskennung><Zugangsnummer>#0001@t-online.de. Die Daten stehen in den Einrichtungsunterlagen. Also:

# pppoe-setup

und die Daten eingeben. Danach

# pppoe-start

um zu testen, ob es funxioniert. Wenn ja, kann man den Service adsl aktivieren:

# pppoe-stop
# systemctl enable adsl
# systemctl start adsl

Um auch Pakete zu routen, muss die MTU für TCP komischerweise auf maximal 1382 festgetackert werden:

# iptables -t mangle -A POSTROUTING -o ppp0 -p tcp -m tcp \
--tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1382

Habe erstmal fertig. Das Policy Routing ist leider schwieriger als gedacht, und IPv6 mit wechselnden Prefixen ist mehr oder weniger nutzlos 🙁