Gebruik van een IPv6-subnet op een rootserver bij Hetzner

Bij Hetzner in Duitsland huur ik enkele rootservers, voornamelijk vanwege de goede prijs/kwaliteitverhouding en omdat Hetzner ook IPv6-connectiviteit al lang standaard aanbiedt.

Op elke rootserver draaien enkele virtuele machines op basis van KVM. Het configureren hiervan is altijd wat lastig geweest, omdat Hetzner het netwerkverkeer alleen aflevert op het MAC-adres van de fysieke ethernetaansluiting. (Op zich is daar een goede reden voor: anders loopt de ARP-cache van de switch of router binnen de kortste keren vol.)

Sinds Ubuntu Server 14.04 LTS werkt de netwerkconfiguratie via /etc/network/interfaces ook bij dual-stack (IPv4 én IPv6) eindelijk naar behoren. Extra scripts zijn niet meer nodig.

Rootserver met één fysieke netwerkaansluiting en een virtuele bridge voor de VM's
Rootserver met één fysieke netwerkaansluiting en een virtuele bridge voor de VM’s

In dit voorbeeld ga ik uit van de standaardsituatie, waarbij de rootserver wordt geleverd met één IPv4-adres en één IPv6-/64-subnet:

  • IPv4-adres: 192.0.2.231/27
  • IPv4-gateway: 192.0.2.225
  • IPv6-adres: 2001:db8:6:ab13::2/64
  • IPv6-gateway: fe80::1

In de standaardinstallatie van de server ziet /etc/network/interfaces er als volgt uit:

### Hetzner Online AG - installimage
# Loopback device:
auto lo
iface lo inet loopback

# device: eth0
auto eth0
iface eth0 inet static
  address 192.0.2.231
  broadcast 192.0.2.255
  netmask 255.255.255.224
  gateway 192.0.2.225
  # default route to access subnet
  up route add -net 192.0.2.224 netmask 255.255.255.224 gw 192.0.2.225 eth0

iface eth0 inet6 static
  address 2001:db8:6:ab13::2
  netmask 64
  gateway fe80::1

We passen dit als volgt aan:

### Hetzner Online AG - installimage
# Loopback device:
auto lo
iface lo inet loopback

# device: eth0
auto eth0
iface eth0 inet static
  address 192.0.2.231
  netmask 255.255.255.255
  gateway 192.0.2.225
  pointopoint 192.0.2.225

iface eth0 inet6 static
  address 2001:db8:6:ab13::2
  netmask 128
  gateway fe80::1

# device: vbr1
auto vbr1
iface vbr1 inet static
  address 172.16.1.1
  netmask 255.255.255.0
  pre-up brctl addbr $IFACE
  post-up route add -host 192.0.2.231 $IFACE
  post-down brctl delbr $IFACE

iface vbr1 inet6 static
  address 2001:db8:6:ab13:1::1
  netmask 80

Merk op dat we op de virtuele bridge vbr1 IPv6-adressen gebruiken met een prefix van meer dan 64 bits. (Ik heb hier gekozen voor 80.) Dat kan niet anders, omdat we van Hetzner slechts één /64-subnet krijgen. Als gevolg hiervan kunnen we op de VM’s geen SLAAC doen. In dit geval is dat geen ramp, omdat we bij servers toch zelf de adressen willen uitdelen.

De VM’s krijgen als IPv4-adres een adres uit de reeks 172.16.1.0/24 (RFC 1918). Dat betekent dat we NAT moeten gebruiken voor de uitgaande IPv4-verbindingen van de VM’s. Als er op een VM publieke services draaien die we ook over IPv4 willen aanbieden, dan moeten we ook DNAT (portforwarding) configureren.

De v4- en v6-routetabellen zien er nu als volgt uit:

root@xyz / # ip route
default via 192.0.2.225 dev eth0
192.0.2.225 dev eth0 proto kernel scope link src 192.0.2.231
192.0.2.231 dev vbr1 scope link
172.16.1.0/24 dev vbr1 proto kernel scope link src 172.16.1.1
root@xyz / # ip -6 route
2001:db8:6:ab13::2 dev eth0 proto kernel metric 256
2001:db8:6:ab13:1::/80 dev vbr1 proto kernel metric 256
fe80::/64 dev vbr1 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
default via fe80::1 dev eth0 metric 1024

Beveilig de server vervolgens met iptables en ip6tables. Ook NAT en DNAT moeten geconfigureerd worden.

Zelf gebruik ik Shorewall om iptables en ip6tables te configureren. De instellingen van Shorewall vallen buiten de scope van dit artikel, maar voor NAT en DNAT zien ze er als volgt uit:

Bestand /etc/shorewall/masq:

#INTERFACE   SUBNET   ADDRESS
eth0   172.16.0.0/16   192.0.2.231

Fragment uit /etc/shorewall/rules:

?COMMENT http,https naar webserver
DNAT   net   vms:172.16.1.21   tcp   http,https

Tenslotte nog een voorbeeld van /etc/network/interfaces op een VM:

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
  address 172.16.1.21
  netmask 255.255.255.0
  gateway 172.16.1.1
  # dns-* options are implemented by the resolvconf package, if installed
  dns-nameservers 213.133.99.99 213.133.100.100 213.133.98.98

iface eth0 inet6 static
  address 2001:db8:6:ab13:1::21
  netmask 80
  gateway 2001:db8:6:ab13:1::1
  dns-nameservers 2a01:4f8:0:a0a1::add:1010 2a01:4f8:0:a111::add:9898

Geplaatst

in

door

Tags: