home
erste Version am 20.07.2014
letzte Änderung am 24.01.2015

Einrichtung einer Gateway-VM (v2)


Das unter TunnelVM dokumentierte OpenVPN-Gateway (Version 1) erfüllt zwar durchaus seinen Zweck, erfordert aber erstens das manuelle Setzen des Default-Gateways auf die IP der Gateway-VM und zweitens spannt damit jeder angeschlossene WLAN-Router sein eigenes WLAN-Netz auf.
Bei dieser Version der Gateway-VM vergibt ein zentraler DHCP-Server IP-Adressen an WLAN-Clients - wodurch ein Roaming der Clients zwischen mehreren WLAN-Routern möglich wird.
Ebenfalls möglich wird dadurch ein zentrales Traffic-Monitoring, durch das erkannt werden kann, welcher Client wann wieviel Netzwerk-Bandbreite genutzt hat.

Die zu erstellende Gateway-VM bietet für mehrere OpenWrt-Router die Dienste
an.
Um diese Dienste (speziell DHCP) nur den OpenWrt-Routern anzubieten und die restlichen Netz-Teilnehmer nicht zu beeinflussen, kommt ein VLAN zum Einsatz.

Die Gateway-VM wird mit "einem Bein" im normalen Netz hängen und darüber den OpenVPN-Tunnel aufbauen.
Mit einem zweiten Bein wird sie im VLAN42 hängen und darüber mit den OpenWrt-Routern kommunizieren.


Inhalt

  1. Die Architektur
  2. VM erstellen
  3. VLAN einrichten
  4. DHCP- und DNS-Server aufsetzen
  5. OpenVPN einrichten
  6. Das Routing aktivieren
  7. Traffic-Monitoring installieren und einrichten
  8. ssh-Logon als root verbieten
  9. ssh-Keys erzeugen
  10. Ein kleines "Intrusion Prevention System" installieren
  11. FTP-Server installieren
  12. Einrichtung des Switches


Die Architektur


Eine Fritzbox 7390 stellt den Zugang zum Internet her.
Ihr LAN-Port landet auf einem Smart Switch (D-Link DGS-1100-16, VLAN-fähig), an dem alle anderen Rechner angeschlossen sind.
Die Fritzbox selbst hat die IP 192.168.178.1 und vergibt an die Clients Adressen von 192.168.178.20 - 192.168.178.200.

Die Gateway-VM hat eine IP im 192.168.178.x-Netz, über die der Tunnel via Fritzbox zu Hide.me läuft.
Auf einer zweiten IP im 192.168.42.x-Netz (VLAN42) werden Pakete angenommen und durch den Tunnel geleitet.
Über diese zweite IP werden per DHCP IP-Adressen (von 192.168.42.50 bis 192.168.42.250) an die Systeme im VLAN42 verteilt und deren Default-Gateway eingestellt.
Der in den WLAN-Routern integrierte DHCP-Server wird abgeschaltet und die WLAN-Router so konfiguriert, dass die WLAN-Clients ihre IP von der Gateway-VM erhalten.

Um das mit nur einem physikalischen Netzwerk-Interface in der Gateway-VM realisieren zu können, werden die entsprechenden Pakete für das VLAN42 getaggt.
Auf dem Switch ist dementsprechend der Port, auf dem der KVM-Host der Gateway-VM steckt, als "Tagged VLAN Port" einzustellen.
Die Ports, auf denen die OpenWrt-Router stecken, werden aus dem Default-VLAN herausgenommen und stattdessen dem VLAN42 als "Untagged VLAN Port" zugeordnet.
Somit ist der Switch virtuell in zwei Teile zerteilt worden.
Alle Systeme, die auf Default-VLAN-Ports stecken, landen auf der Fritzbox.
Systeme, die auf VLAN42-Ports stecken, landen auf der Gateway-VM und damit im VPN-Tunnel.

Um das WebGUI der OpenWrt-Router erreichen zu können, wird ein Rechner (oder eine VM) mit grafischer Oberfläche für den Browser im VLAN42 benötigt.

Statt einer VM tut es ebenso gut ein CubieTruck, dessen OS z.B. gemäß dieser Anleitung aufgesetzt wurde (als Ersatz für das folgende Kapitel VM erstellen).
Danach dann einfach bei VLAN einrichten einsteigen.
Ich habe meinem CubieTruck die IP-Adresse 192.168.42.253 (statt .254) im VLAN42 gegeben, lasse ihn den Tunnel zu einem anderen Gerätenamen auf hide.me herstellen (in /etc/openvpn/login.auth) und kann nun durch wechselseitges Starten und Stoppen des dnsmasq-Dienstes das von den Routern genutzte Gateway umschalten.
Bei "schwacher" Internet-Anbindung (kleiner 50MBit) könnte evt. sogar ein RaspberryPi reichen.

Hat man keinen VLAN-fähigen Switch zur Hand, gehts sicher auch mit zwei einzelnen Switchen.
Allerdings muß das Gateway dann auch zwei physikalische Netzwerk-Interfaces haben.


VM erstellen


Erstmal wird eine neue VM angelegt.
Installationsquelle ist: debian-7.5.0-amd64-netinst.iso
Settings sind: 1 CPU, 512MB RAM und 2GB Platte
Also etwa so:
Parameter der VM


Innerhalb der Installation wird unter Softwareauswahl eingestellt:
    SSH server
    Standard-Systemwerkzeuge

Der Hostname lautet gw, der User heißt dede.
Ansonsten sind die ersten Settings analog zu der Seite Build-Umgebung für Ar71xx im Abschnitt "VM erstellen"  einzustellen.
Hier nochmal als Cut&Paste-Referenz:
su
apt-get install sudo
nano /etc/sudoers
und in /etc/sudoers unterhalb von der Zeile
root    ALL=(ALL:ALL) ALL
einfügen:
dede    ALL=(ALL) NOPASSWD: ALL

Dann:
exit
sudo apt-get install ntp

cd
mkdir .ssh
cd .ssh
scp c2q:~/.ssh/*.pub .
cat *.pub >authorized_keys
rm *.pub
cd

...unter der Annahme, dass auf dem System c2q alle relevanten RSA-Keys in /home/dede/.ssh liegen.

Bei Bedarf Anpassungen vornehmen in
nano .bashrc

sudo nano /etc/motd

Und noch Grub-Timeout runtersetzen:
sudo nano /etc/default/grub
Darin dann den Parameter GRUB_TIMEOUT von 5 auf 1 stellen, speichern, nano verlassen und aktivieren mit:
sudo update-grub


VLAN einrichten

Und zwar erstmal temporär mittels:
sudo bash
apt-get install vlan
modprobe 8021q

vconfig add eth0 42
ifconfig eth0.42 up
ifconfig eth0.42 192.168.42.254 netmask 255.255.255.0


Jetzt sollten route und ifconfig ein weiteres Interface sehen:
root@gw:/home/dede# route
Kernel-IP-Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
default         fritz.box       0.0.0.0         UG    0      0        0 eth0
192.168.42.0    *               255.255.255.0   U     0      0        0 eth0.42
192.168.178.0   *               255.255.255.0   U     0      0        0 eth0

root@gw:/home/dede# ifconfig
eth0      Link encap:Ethernet  Hardware Adresse xx:xx:xx:xx:xx:xx
          inet Adresse:192.168.178.78  Bcast:192.168.178.255  Maske:255.255.255.0
          [...]
eth0.42   Link encap:Ethernet  Hardware Adresse xx:xx:xx:xx:xx:xx
          inet Adresse:192.168.42.254  Bcast:192.168.42.255  Maske:255.255.255.0
          [...]

Hat das geklappt, wird das VLAN42 dauerhaft eingestellt.

Erstmal
nano /etc/modules
und darin die folgende Zeile anhängen:
8021q

Dann
nano /etc/network/interfaces
und anhängen von:
auto eth0.42
  iface eth0.42 inet static
    address 192.168.42.254
    netmask 255.255.255.0
    vlan-raw-device eth0

Test durch Neustart und Wiederanmeldung:
reboot
...ca. drei Sekunden warten....dann:
ssh gw
sudo bash


Nach Wiederanmeldung sollten route und ifconfig das selbe wie vor dem reboot liefern.


DHCP- und DNS-Server aufsetzen


Installation mit:
apt-get install dnsmasq

Konfiguration mit:
nano /etc/dnsmasq.conf
und darin ändern:
interface=eth0.42
dhcp-range=eth0.42,192.168.42.50,192.168.42.250,12h
Die Datei /etc/dnsmasq.conf ist mit diversen Konfigurationsvorschlägen und Kommentaren gefüllt.
Entweder nimmt man die Änderungen an den entsprechenden Stellen mit den jeweiligen Konfigurationsvorschlägen vor, oder man hängt die Zeilen einfach am Ende der Datei an.
In beiden Fällen sollte man darauf achten, dass nicht mehrere Zeilen für interface oder  dhcp-range aktiv sind (also ohne vorangestelltes Rautezeichen).
Die aktiven bzw. nicht auskommentierten Zeilen kann man sich mit einem
grep ^[^#] /etc/dnsmasq.conf
anzeigen lassen.

Nun noch einstellen, den lokalen DNS-Server zu bevorzugen:
nano /etc/dhcp/dhclient.conf
und vor  prepend domain-name-servers 127.0.0.1;  das Raute-Zeichen entfernen, speichern und nano verlassen.
prepend domain-name-servers 127.0.0.1;

Bei Bedarf können in /etc/dnsmasq.conf auch MAC-Adress-Reservierungen vorgenommen werden. Das Format lautet:
dhcp-host=64:66:b3:f4:1d:5c,    r43a,        192.168.42.50,    24h
dhcp-host=52:54:00:10:4a:88,    vl42,        192.168.42.55,    12h


Die aktiven Leases können angezeigt werden mit:
cat /var/lib/misc/dnsmasq.leases



OpenVPN einrichten


Siehe dazu auch die Seite mit der ersten Version der TunnelVM.
Hier mache ich es mal etwas kürzer.

Installation:
apt-get install openvpn

Kopieren der Konfiguration ...und:
cd /etc/openvpn/

scp dede@tunnel:/etc/openvpn/TrustedRoot.pem .
scp dede@tunnel:/etc/openvpn/hideme.conf .
scp dede@tunnel:/etc/openvpn/login.auth .

nano login.auth

in login.auth hinter dem Username einen anderen hide.me-Gerätenamen einstellen (und auf hide.me entspr. anlegen).
Das klappt natürlich nur, wenn die TunnelVM vorhanden und erreichbar ist. Ansonsten: siehe TunnelVM bzgl. Herkunft der Dateien.

Für einen Test erstmal curl installieren
apt-get install curl
dann:
curl v4.ident.me;echo

service openvpn start

curl v4.ident.me;echo

Der erste curl sollte die externe IP der Fritzbox liefern, der zweite die externe IP bei hide.me.

Auch sollten route und ifconfig jetzt noch ein weiteres Interface sehen:
root@gw:/etc/openvpn# route
Kernel-IP-Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
default         10.3.56.195     0.0.0.0         UG    0      0        0 tun0
10.3.56.0       *               255.255.255.0   U     0      0        0 tun0
109.201.137.13  fritz.box       255.255.255.255 UGH   0      0        0 eth0
192.168.42.0    *               255.255.255.0   U     0      0        0 eth0.42
192.168.178.0   *               255.255.255.0   U     0      0        0 eth0

root@gw:/etc/openvpn# ifconfig
eth0      Link encap:Ethernet  Hardware Adresse xx:xx:xx:xx:xx:xx
          inet Adresse:192.168.178.78  Bcast:192.168.178.255  Maske:255.255.255.0
          [...]
eth0.42   Link encap:Ethernet  Hardware Adresse xx:xx:xx:xx:xx:xx
          inet Adresse:192.168.42.254  Bcast:192.168.42.255  Maske:255.255.255.0
          [...]
lo        Link encap:Lokale Schleife
          inet Adresse:127.0.0.1  Maske:255.0.0.0
          [...]
tun0      Link encap:UNSPEC  Hardware Adresse 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet Adresse:10.3.56.195  P-z-P:10.3.56.195  Maske:255.255.255.0
          [...]

Somit hat die Gateway-VM nun also drei IP-Adressen:
IP-Adresse
Typ
Interface
VLAN
Funktion
192.168.178.???
dynamisch eth0
default
Verbindung zum restlichen LAN außerhalb von VLAN42.
192.168.42.254
statisch
eth0.42
42
DHCP-Auslieferung an die OpenWrt-Router und deren Default-Gateway.
< wechselnd >
dynamisch
tun0
default OpenVPN-Tunnel ins Internet.



Das Routing aktivieren

Auch hier etwas kürzer als unter TunnelVM...IP-Forwarding aktivieren in /etc/sysctl.conf. Also:
nano /etc/sysctl.conf
Und vor net.ipv4.ip_forward=1 das Raute-Zeichen entfernen, speichern und nano verlassen.
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1


Drei Regeln für iptables anlegen, Regeln speichern und in /etc/network/interfaces die gespeicherten Regeln laden:
iptables -A FORWARD -s 192.168.42.0/24 -i eth0.42 -o eth0 -m conntrack --ctstate NEW -j REJECT
iptables -A FORWARD -s 192.168.42.0/24 -i eth0.42 -o tun0 -m conntrack --ctstate NEW -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

iptables-save >/etc/iptables.up.rules

nano /etc/network/interfaces

in /etc/network/interfaces unterhalb von
allow-hotplug eth0
iface eth0 inet dhcp

einfügen:
  post-up iptables-restore < /etc/iptables.up.rules

Somit sollte /etc/network/interfaces nun folgenden Inhalt haben:
root@gw:/etc/openvpn# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp
  post-up iptables-restore < /etc/iptables.up.rules

auto eth0.42 
  iface eth0.42 inet static
    address 192.168.42.254
    netmask 255.255.255.0
    vlan-raw-device eth0



Traffic-Monitoring installieren und einrichten

Erstmal installieren:
apt-get install bandwidthd
Dann konfigurieren:
nano /etc/bandwidthd/bandwidthd.conf
und das zu überwachende Interface einstellen:
    subnet 192.168.42.0/24
    dev "eth0.42"

Start mit:
/etc/init.d/bandwidthd start

Reicht aber noch nicht.
Es wird zusätzlich ein WebServer benötigt. Daher:
apt-get install lighttpd
und dann die von bandwidthd erzeugten Seiten in dessen Home-Verzeichnis linken:
ln -s /var/lib/bandwidthd/htdocs /var/www/bandwidthd


Zugriff auf die Auswertungen von Bandwidthd erfolgt via Browser unter:
http://gw/bandwidthd/index.html


ssh-Logon als root verbieten

Um die Gateway-VM gegenüber Angriffen aus dem (ggf. offenen) WLAN etwas abzusichern, wird erstmal der direkte Logon als root verboten.
Dazu einfach
nano /etc/ssh/sshd_config
und in der passenden Zeile das yes in ein no ändern:
PermitRootLogin no
Aktivieren mit
/etc/init.d/ssh restart


ssh-Keys erzeugen

Die Konsole der OpenWrt-Router soll später ohne Passwort-Eingabe zu erreichen sein.
Dazu werden hier RSA-Keys für die Nutzer root und dede erzeugt, um dann später den jeweils öffentlichen Schlüssel auf die OpenWrt-Router kopieren zu können.
Weil root eh gerade angemeldet ist, dessen Key zuerst.
ssh-keygen -t rsa
su dede
ssh-keygen -t rsa
exit

Die Abfragen innerhalb von ssh-keygen sind alle mit Enter zu bestätigen.


Ein kleines "Intrusion Prevention System" installieren

Dafür langt schon:
apt-get install fail2ban

Die Default-Werte sind für den hier geplanten Einsatz passabel.
Bei Bedarf kann mit
nano /etc/fail2ban/jail.conf
die jail-Datei editiert werden, um dort die Parameter für "Aussperrdauer in Sekunden"
bantime  = 600
oder im ssh-Abschnitt für die "Anzahl der erlaubten Logon-Fehlversuche bis zur Sperrung"
[ssh]

enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 6

an die eigenen Vorstellungen anzupassen.

Wäre das System per ssh im Internet erreichbar, muß m.E. maxretry=3 und bantime=43200 oder noch besser bantime=604800 eingestellt werden...um die ganzen Legionen von Drecks-Robots mit ihren IPs aus China nach maximal drei Fehlversuchen für 12 Stunden bzw. eine Woche wegzusperren.

Mit
sudo tail -f /var/log/fail2ban.log
kann übrigends das Ban-Log kontinuierlich angezeigt werden.


FTP-Server installieren

nur bei Bedarf....für mich erschien es notwendig, weil mein Tablet bei Downloads von Dateien aus dem LAN nur unerfreuliche Übertragungsraten erreicht hat.
Im ersten Ansatz hatte ich natürlich als Protokoll "scp" bzw. "sftp" gewählt ... weil es ja eh standardmäßig verfügbar ist.
Nach Einrichtung des FTP-Servers gings gefühlt dreimal so schnell. An der Gateway-VM liegts sicher nicht. Die hat genug Saft.
Offenbar hat das Tablet trotz seines (laut Werbung) "leistungsstarken Quad-Core-Prozessors" ;-) gewisse Probleme, die Crypto für "scp" hinreichend flott zu berechnen.

Bei FTP geht alles unverschlüsselt über die Leitung. Da ich nicht das Passwort meines Standard-Users (der ja via sudo quasi root-Rechte hat) offen und lesbar durch die Luft flattern lassen möchte, wird der FTP-Server so eingestellt, dass nur ein spezieller Nutzer Zugriff hat.
Dieser Nutzer "ftpuser" hat keinen Shell-Zugang, lediglich Lesezugriff und kann sein Home-Verzeichnis auf der Gateway-VM nicht verlassen.

Installation mit ...und:
apt-get install vsftpd

/etc/init.d/vsftpd stop
nano /etc/vsftpd.conf

in /etc/vsftpd.conf dann folgende Änderungen bzw. Erweiterungen vornehmen:
anonymous_enable=NO
local_enable=YES
connect_from_port_20=NO
chroot_local_user=YES
userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/vsftpd.user_list


Nun den neuen Nutzer anlegen ...und:
adduser ftpuser --ingroup www-data --shell /bin/false --home /nfs@11w/ftphome --no-create-home
nano /etc/shells

in /etc/shells eine neue Zeile für die "nicht-shell" anhängen:
/bin/false

Danach die Datei /etc/vsftpd.user_list anlegen
nano /etc/vsftpd.user_list
und einfügen des berechtigten Nutzers
ftpuser

Alles aktivieren mit
/etc/init.d/vsftpd start

...oder auch gleich den finalen
reboot


Einrichtung des Switches

Nun sind noch die Einstellungen am Switch vorzunehmen.
Eine andere Variante der Switch-Konfiguration, die dann auch eine andere Router-Konfiguration erfordert, ist hier dokumentiert.

Das Ziel ist folgende Konfiguration
Switch-VLAN-Konfig

In der Default-Konfiguration waren alle 16 Ports der VID 1 als "Untagged VLAN Port" zugewiesen.

Im ersten Schritt werden nun zwei Ports aus der VID 1 herausgelöst.
Auf diesen Ports (hier 09 und 10) sollen später die OpenWrt-Router stecken.
Switch-VLAN-1
Im zweiten Schritt wird  ein neues VLAN mit der VID "42" und dem VLAN Name "VLAN42" angelegt.
Switch-VLAN-42neu
Darin dann die Ports 09 und 10 diesem VLAN als "Untagged" zuweisen und die Ports 02 und 05 als "Tagged":
Switch-VLAN-42
Somit verlassen alle IP-Pakete an den Ports 09 und 10 (die also Richtung OpenWrt-Router gehen) den Switch ohne VLAN-Tags.
IP-Pakete, die an den Ports 09 und 10 ankommen (die also von einem OpenWrt-Router kommen) werden um ein VLAN-Tag (42) erweitert.

Innerhalb des Switches werden IP-Pakete mit einem Tag für VLAN42 nur an die Ports 02, 05, 09 und 10 ausgeliefert.

An den Ports 02 und 05 behalten die IP-Pakete ihr VLAN-Tag, wenn sie den Switch verlassen.
In der anderen Richtung, also bei ankommenden IP-Paketen, wird vom Switch kein VLAN-Tag zugefügt bzw. muß es bereits beim Absender mit einem Tag versehen worden sein.
Der KVM-Host, auf dem die Gateway-VM läuft, hängt am Port 02 (Port 05 ist "for future use").
Weil die Gateway-VM die für die OpenWrt-Router bestimmten IP-Pakete mit einem Tag für VLAN42 versieht, weiß der Switch, dass er sie nur an die Ports 05, 09 und 10 ausliefern darf.
Umgedreht weiß die Gateway-VM, dass ein IP-Paket mit VLAN42-Tag bei eth0.42, eins ohne Tag bei eth0 eingespeist werden soll.
Für tiefergehende Details hilft ansonsten Wikipedia.



Die Router-Konfiguration hat ihre eigene Seite.

Das Überwachungs-Script zur Aufrechterhaltung des Tunnels kann von hier samt cron-Logging-Anpassung unverändert übernommen werden.