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.
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