Kvm-vpn-offloader-bauen

Aus Freifunk München
Wechseln zu: Navigation, Suche

Hier wird beschrieben, wie das Freifunk-München-KVM-Image auf x86-Hardware als VPN-Offloader betrieben werden kann. Eine Übersicht über die Möglichkeiten des Offloadings und allgemeine Erklärungen finden sich im Artikel VPN Offloader.

Voraussetzungen[Bearbeiten]

Server[Bearbeiten]

Ein x86-Server mit 256 MB freiem RAM und und ca. 55 MB freiem Festplattenspeicher, der in der Lage ist, KVM-Images zu betreiben, sollte ausreichend sein. Diese Anleitung bezieht sich auf eine Intel NIC mit XBMCbuntu (wie Debian, Ubuntu) und nfsroot. Der Server ist ins interne Netz gepatched und kommt frei ins Internet.

Netzwerk[Bearbeiten]

Das KVM-Image ist für zwei Netzwerkschnittstellen konzipiert: eine für das Meshing, die andere für den Zugang zum Internet, um das VPN aufzubauen. Daher sollten entweder zwei Netzwerkkarten vorhanden sein oder ein VLAN-fähiger Switch verwendet werden. Hier beschrieben ist der Weg über den VLAN-fähigen Switch. Die zwei NICs sind eine Empfehlung und nicht unbedingt notwendig.

Vorgehen[Bearbeiten]

Konfiguration des Switches[Bearbeiten]

Ein neues VLAN wird für das Mesh-Netz auserkoren, getaggt zum Server gepatched und untagged auf alle Ports, an denen Freifunk-Router hängen. Im folgenden Beispiel wird hierfür die VLAN-ID 100 verwendet.

Konfigurieren des Servers[Bearbeiten]

Benötigte Pakete installieren[Bearbeiten]

apt-get install kvm libvirt-bin virtinst vlan bridge-utils

Bridges anlegen[Bearbeiten]

Die mesh-net-bridge kann über /etc/network/interfaces konfiguriert werden:

cat << EOF >> /etc/network/interfaces
auto eth0.100
auto kvmbr1
iface eth0.100 inet manual
	pre-down ifdown kvmbr1
iface kvmbr1 inet static
	pre-up ifup eth0.100
	bridge_ports eth0.100
EOF
ifup kvmbr1

Die vpn/uplink-bridge muss im Falle von nfsroot/iscsi/... schon vor dem Mouten von / vorhanden sein. Hierfür muss die initrd angepasst werden. Wird eine lokale Festplatte verwendet, kann das initramfs belassen werden und lediglich eine weitere Bridge (kvmbr0) wie oben angelegt werden.

Achtung: Die IP-Adresse, die im initrd gesetzt wird, sollte natürlich entsprechend angepasst werden.

# /sbin/brctl mit Abhängigkeiten in die initrd packen
cat << EOF > /etc/initramfs-tools/hooks/brctl
#!/bin/sh -e
PREREQS=""
case $1 in
        prereqs) echo "${PREREQS}"; exit 0;;
esac
. /usr/share/initramfs-tools/hook-functions
copy_exec /sbin/brctl /bin
EOF
chmod 755 /etc/initramfs-tools/hooks/brctl

# bridge beim booten bauen
cat << EOF > /etc/initramfs-tools/scripts/nfs-top/bridge
#!/bin/sh
PREREQ=""
prereqs()
{
     echo "$PREREQ"
}

case $1 in
prereqs)
     prereqs
     exit 0
     ;;
esac

/bin/brctl addbr kvmbr0
echo  "Bringing up bridge ..."
brctl addbr kvmbr0
brctl addif kvmbr0 eth0
ip address add 192.168.172.3/24 dev kvmbr0
ip link set eth0 up
ip link set kvmbr0 up
EOF
chmod 755 /etc/initramfs-tools/scripts/nfs-top/bridge
update-initramfs -k $(uname -r) -u

Die neue initrd muss auf dem TFTP-Server an der entsprechenden Stelle deponiert werden. Die APPEND-Zeile im Bootloader musste auch ein wenig angepasst. Die hier beschriebene funktioniert, ist aber alles andere als allgemeingültig. Der "ip="-Parameter darf beim hier verwendeten Linux wohl keinen DNS-Server enthalten, sonst "panic".

BOOT_IMAGE=os/xbmcbuntu-installed/vmlinuz ip=192.168.172.3:192.168.172.2:192.168.172.1:255.255.255.0:bluecrystal:kvmbr0:off root=/dev/nfs nfsroot=192.168.172.2:/volume1/pxe-root/xbmcbuntu-root initrd=os/xbmcbuntu-installed/initrd.img-3.13.0-35-generic rw   boot=nfs

KVM-Image konfigurieren[Bearbeiten]

Hiervon hat der Autor wenig Ahnung. Das Beispiel wurde einfach von den Regensburger Freifunkern übernommen und an die Münchner Firmware angepasst.

mkdir /kvmimages && cd /kvmimages
virsh pool-define-as images dir - - - - /kvmimages/
virsh pool-list --all
virsh pool-build images
virsh pool-start images
virsh pool-autostart images
wget http://firmware.ffmuc.net/stable/factory/gluon-ffmuc-v2015.5-x86-kvm.img.gz
gunzip gluon-ffmuc-v2015.5-x86-kvm.img.gz
virsh pool-refresh images
virt-install --connect qemu:///system --ram 256 -n offloader --os-type=linux --disk vol=images/gluon-ffmuc-v2015.5-x86-kvm.img --network=bridge:kvmbr1,model=virtio --network bridge=kvmbr0,model=virtio --import

Aus der Konsole der KVM kommt man mit einem dieser Befehler wieder heraus:

CTRL-]
CTRL-5

Die Freifunk-Firmware bootet im Konfigurationsmodus und kann am einfachsten konfiguriert werden, wenn man der Bridge am Server eine passende IP gibt:

ip a a 192.168.1.2/24 dev kvmbr1

und sich dann von einer anderen Workstation per ssh einen Tunnel baut:

ssh SERVERIP -L 4444:192.168.1.1:80

Nun kann von der Workstation aus via http://localhost:4444/ die Grundkonfiguration durchgeführt werden.

In der Konfiguration sollte im Expertmodus "mesh on lan" aktiviert werden und im Wizard die Internetverbindung aktiviert werden. Auf der Host-Firewall auf dem Server sollte forwarding erlaubt sein.

Zum Managen der VM sind folgende Befehle hilfreich:

  • Verbinden auf die KVM-Konsole
virsh console offloader
  • KVM auf autostart setzen
virsh autostart offloader

Router konfigurieren[Bearbeiten]

Die Router sollten keinen eigenen Tunnel aufbauen ("Internetverbindung nutzen (Mesh-VPN)" deaktiviert!), aber "mesh-on-lan/wan" (je nach gewählter Schnittstelle am Router) aktiviert haben.

Quellen[Bearbeiten]