Raspberry Pi als VPN-Gateway mit VOIP

Gemeinsam ins Internet mit Firewall und Proxy.
Antworten
pneumokoniose
Beiträge: 11
Registriert: 02.05.2016 12:11:17

Raspberry Pi als VPN-Gateway mit VOIP

Beitrag von pneumokoniose » 02.05.2016 18:21:57

Hallo hier im Forum,

ich stehe aktuell an einer etwas kniffligen Frage fest und komme einfach nicht weiter. Kurz zur Vorgeschichte: Ich habe mir einen Raspberry Pi 2 zulegt, um ein wenig zu experimentieren und meine laienhafte Netzwerkkenntnisse etwas zu vertiefen. Mein Ziel:

In Kurzform:
FRITZ!Box / VOIP -> Raspberry Pi / OpenVPN -> beliebiger WLAN-Router / Internet

Ausführlicher:
1. Der Raspberry Pi stellt eine Verbindung zu einem beliebigen WLAN-Router her, um sich mit dem Internet zu verbinden.
2. Der Raspberry Pi ist als DHCP-Router konfiguriert und stellt sein eigenes Netzwerk bereit.
3. Ebenfalls ist auf dem Raspberry Pi OpenVPN installiert, sodass der gesamte Internetverkehr über einen VPN-Anbieter geleitet wird.
4. Meine FRITZ!Box stellt mit LAN1 über den Raspberry Pi eine Internetverbindung her. Die FRITZ!Box verwaltet alle angeschlossenen Rechner sowie VOIP (Sipgate).

Bis auf VOIP funktioniert auch alles einwandfrei. Meine Schwierigkeit: Ich habe nicht ganz verstanden WARUM es funktioniert:

1. Wenn ich mir mit ifconfig meine Interfaces anzeigen lasse, gibt es hier vier Stück: eth0, wlan0, ovpn (VPN) und lo. Woher weiß das jeweilige Interface, was es nun machen muss? Also ganz laienhaft ausgedrückt: Woher weiß eth0, dass es mit ovpn kommunizieren soll? Oder nochmals anders ausgedrückt: Woher weiß ovpn, dass es sich zwischen eth0 und wlan0 stellen muss, um alle Pakete über die entsprechende VPN-Verbindung umzuleiten? Wie funktioniert also das Zusammenspiel zwischen den einzelnen Interfaces? Vielleicht kann mir da jemand mit einer einfachen Erläuterung oder ein paar Schlagworten für die Suchmaschine weiterhelfen.

2. VOIP funktioniert manchmal sehr gut, manchmal sehr unzuverlässig und manchmal auch gar nicht. Sprich: Zeitversatz, keine eingehenden Anrufe oder nur einseitiges hören. Was ich bereits herausgefunden habe: Ohne OpenVPN funktioniert alles einwandfrei und zuverlässig. Nun meine Frage: Gibt es eine Möglichkeit, VOIP nicht über OpenVPN zu leiten? Gewissermaßen eine Ausnahme-Regel für die Telefonie-Funktion der FRITZ!Box?

3. Und auch wenn insgesamt alles ganz gut funktioniert: Sind in der Konfiguration irgendwelche Ungereimtheiten ersichtlich bzw. gibt es vielleicht an der ein oder anderen Stelle einen eleganteren Lösungsweg?

Vielen Dank!

Meine Konfiguration:

Code: Alles auswählen

apt-get install isc-dhcp-server
apt-get install openvpn
/etc/network/interfaces

Code: Alles auswählen

auto lo
iface lo inet loopback

iface eth0 inet manuel

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
	wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
/etc/dhcpcd.conf

Code: Alles auswählen

interfaces eth0
static ip_address=192.168.10.1/24
static routers=192.168.10.1
static domain_name_servers=192.168.10.1
/etc/wpa_supplicant/wpa_supplicant.conf

Code: Alles auswählen

network={
	ssid=“WLAN-Name“
	psk=“WLAN-Passwort“
}
/etc/dhcp/dhcpd.conf

Code: Alles auswählen

authoritative;
subnet 192.168.10.0 netmask 255.255.255.0 {
	range 192.168.10.10 192.168.10.250;
	option broadcast-address 192.168.10.255;
	option routers  192.168.10.1;
	option domain-name "local";
	option domain-name-servers 8.8.8.8, 8.8.4.4;
	default-lease-time 600;
	max-lease-time 7200;

Code: Alles auswählen

sysctl -w net.ipv4.ip_forward=1
In der /etc/sysctl.conf folgende Zeile auskommentiert:

Code: Alles auswählen

net.ipv4.ip_forward=1

Code: Alles auswählen

iptables -t nat -A POSTROUTING -o ovpn -j MASQUERADE
iptables -I FORWARD -i eth0 ! -o ovpn -j DROP
iptables -I INPUT 1 -i ovpn -j ACCEPT
ip6tables -I INPUT 1 -i ovpn -j ACCEPT

Code: Alles auswählen

mkdir /home/pi/vpn-gateway
sudo iptables-save > /home/pi/vpn-gateway/iptables.v4
sudo ip6tables-save > /home/pi/vpn-gateway/iptables.v6
/etc/network/if-pre-up.d/iptables

Code: Alles auswählen

#!/bin/sh

iptables-restore < /home/pi/vpn-gateway/iptables.v4
ip6tables-restore < /home/pi/vpn-gateway/iptables.v6

exit 0

Code: Alles auswählen

sudo chown root:root /etc/network/if-pre-up.d/iptables
sudo chmod +x /etc/network/if-pre-up.d/iptables
sudo chmod 755 /etc/network/if-pre-up.d/iptables
Die Einrichtung von OpenVPN erfolgte nach der folgenden Anleitung: http://www.ovpn.se/en/guides/debian

Benutzeravatar
GregorS
Beiträge: 2620
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Raspberry Pi als VPN-Gateway mit VOIP

Beitrag von GregorS » 04.05.2016 05:29:56

pneumokoniose hat geschrieben:Hallo hier im Forum,
ich stehe aktuell an einer etwas kniffligen Frage fest und komme einfach nicht weiter.
Ohje. Ich habe Dein Posting jetzt zum zweiten Mal gelesen (nach gestern) und weiß keine wirklich schlaue Antwort auf Deine Fragen. Vielleicht hilft aber, was mir dabei einfällt:
...
1. Wenn ich mir mit ifconfig meine Interfaces anzeigen lasse, gibt es hier vier Stück: eth0, wlan0, ovpn (VPN) und lo. Woher weiß das jeweilige Interface, was es nun machen muss? Also ganz laienhaft ausgedrückt: Woher weiß eth0, dass es mit ovpn kommunizieren soll? Oder nochmals anders ausgedrückt: Woher weiß ovpn, dass es sich zwischen eth0 und wlan0 stellen muss, um alle Pakete über die entsprechende VPN-Verbindung umzuleiten? Wie funktioniert also das Zusammenspiel zwischen den einzelnen Interfaces? Vielleicht kann mir da jemand mit einer einfachen Erläuterung oder ein paar Schlagworten für die Suchmaschine weiterhelfen.
Mir fällt dazu iptables ein, womit man (boah ist das lang her) Interfaces „verbandeln“ kann. Ich sehe allerdings gegen Abend jemanden, der sich mit solchen Spezialitäten bestens auskennt. Falls ich eine kompetent erscheinende Frage „weiterreichen“ soll, gib Bescheid.
2. VOIP funktioniert manchmal sehr gut, manchmal sehr unzuverlässig und manchmal auch gar nicht. Sprich: Zeitversatz, keine eingehenden Anrufe oder nur einseitiges hören. Was ich bereits herausgefunden habe: Ohne OpenVPN funktioniert alles einwandfrei und zuverlässig. Nun meine Frage: Gibt es eine Möglichkeit, VOIP nicht über OpenVPN zu leiten? Gewissermaßen eine Ausnahme-Regel für die Telefonie-Funktion der FRITZ!Box?
Auch hierzu fällt mir nur wieder iptables ein.
3. Und auch wenn insgesamt alles ganz gut funktioniert: Sind in der Konfiguration irgendwelche Ungereimtheiten ersichtlich bzw. gibt es vielleicht an der ein oder anderen Stelle einen eleganteren Lösungsweg?
Ich habe das nur sehr oberflächlich quergelesen. Wenn ich etwas gesehen hätte, wozu ich schreiben könnte, würde ich das tun.

Gruß

Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Raspberry Pi als VPN-Gateway mit VOIP

Beitrag von eggy » 04.05.2016 08:33:31

pneumokoniose hat geschrieben: Bis auf VOIP funktioniert auch alles einwandfrei. Meine Schwierigkeit: Ich habe nicht ganz verstanden WARUM es funktioniert:

1. Wenn ich mir mit ifconfig meine Interfaces anzeigen lasse, gibt es hier vier Stück: eth0, wlan0, ovpn (VPN) und lo. Woher weiß das jeweilige Interface, was es nun machen muss? Also ganz laienhaft ausgedrückt: Woher weiß eth0, dass es mit ovpn kommunizieren soll?
Weiß es nicht. Kann es auch garnicht wissen. Deine Haustür ist ja auch nicht dafür verantwortlich, dass Du nicht über den Balkon zur Arbeit kletterst.
pneumokoniose hat geschrieben: Oder nochmals anders ausgedrückt: Woher weiß ovpn, dass es sich zwischen eth0 und wlan0 stellen muss, um alle Pakete über die entsprechende VPN-Verbindung umzuleiten? Wie funktioniert also das Zusammenspiel zwischen den einzelnen Interfaces? Vielleicht kann mir da jemand mit einer einfachen Erläuterung oder ein paar Schlagworten für die Suchmaschine weiterhelfen.
Für die Wegewahl ist das Routing zuständig.
Ich finde aus reiner Gewohnheit die Ausgabe von "route -n" übersichtlicher, "ip r" sagt Dir aber auch was Du wissen musst.

Crashkurs (aber nur sehr oberflächlich erklärt, also wenn Du es genau wissen willst, schnapp Dir nen Netzwerkgrundlagenbuch):

IP-Addressen (hier nur v4 betrachtet) in Menschen-lesbarer Form (192.168.0.1) sind ja bekannt, wir brauchen jetzt aber die Maschinendarstellung in Bits (11000000.10101000.00000000.00000001). Selbiges gilt für die Subnetzmaske (25.255.255.0 oder in Kurznotation /24), sie gibt sozusagen die Anzahl der Einsen von vorne gezählt an (11111111.11111111.11111111.00000000). Schreibst Du jetzt ip und und maske übereinander, kannst Du ausrechnen (binäres "Und"), was der "Netzanteil" und der "Hostanteil" der IP sind. Bei den Masken wie /8, /16 oder /24 ist das einfach ablesbar, weil die "Grenzen" ja auf den "Punkten" liegen. Bei Masken wie /21 musst Du mehr rechnen (kann man per Hand machen, gibt aber auch schöne Tools wie subnetcalc oder gip).
Das ist an Vorwissen erstmal deswegen wichtig, weil "Ziele" in "Netzen" liegen.

Jetzt werden wir mal nen Blick auf unsere Routingtabelle:

Code: Alles auswählen

Ziel            Router          Genmask         Flags Metric Ref    Use Iface
0.0.0.0         144.76.154.164  0.0.0.0         UG    50     0        0 tap0
0.0.0.0         192.168.1.1     0.0.0.0         UG    600    0        0 wlan0
144.76.154.165   0.0.0.0        255.255.255.0   U     50     0        0 tap0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 wlan0
172.16.1.0      0.0.0.0         255.255.255.0   U     0      0        0 vboxnet1
192.168.1.0     0.0.0.0         255.255.255.0   U     600    0        0 wlan0
144.76.154.166  192.168.1.1     255.255.255.255 UGH   600    0        0 wlan0
Der Ablauf ist immer so, die Anwendung erstellt Daten, diese werden zum Paket gepackt, das Paket geht ans Routing und das Routing entscheidet, wo das Paket raus darf.

Die Routingtabelle ist ganz grob eine Liste, die von oben nach unten, solange durchgegangen wird bis "irgendwas passt". Die Frage ist also erstmal: zu welchem Ziel passt (daher die Binärberechnungen oben) unser Paket? Also welche Zeile der Routingtabelle gilt für das jeweilige Paket? Dann sagt uns die Zeile wo das Paket raus muss.

Wenn nichts spezielles passt, dann passt hier automatisch die "default"-Regel: 0.0.0.0 bedeutet "alles", und das Ziel des Eintrags ist das sog. Standardgateway.

Wenn Du die Tabelle ansiehst, wird Dir auffallen, dass es zwei Einträge für 0.0.0.0 gibt. Sie unterscheiden sich einerseits durch den "Router" (wird in der Regel als "next hop" bezeichnet: an wen geb ich das Paket weiter? von da an ist die Wegfindung dann sein Problem) und andererseits durch Metric ("Metrik") und Iface (Interface, Schnittstelle, Netzwerkkarte: wo gehts raus). Anhand der Metrik wird entschieden, welcher Weg bevorzugt wird, falls zwei oder mehr Regeln zutreffen sollten. Hier wird im unbekannten Fall also das VPN genommen.

Also Paket kommt beim Routing an, Routing schaut "kenn ich das Ziel oder wenigstens das Netz in dem das Ziel liegt?": wenn "ja" ist der Weg klar. Falls "nein" default-Regel anwenden. Die Unterscheidung zwischen Ziel und Zielnetz wird hier noch gemacht weil es sog. Hostrouten und sog. Netzrouten gibt, siehe Flags, genaueres dazu in der jeweiligen Doku/Literatur.

Bei Szenarien wie "VPN" wird das ganze etwas Komplizierter: Deine Daten werden eingepackt, das Routing entscheidet "Hmm, kein bekanntes ZIel, also default raus: VPN-Ausgang", und jetzt hast Du ein "VPN-Paket" und das Routing ist nochmal dran, diesmal "Ah, bekanntes Ziel: VPN-Endpunkt auf der 'anderen' Seite; also raus zum Ausgang, vom ich weiß, dass darüber das VPN-Gegenstück erreichbar ist: wlan0 und benutz den Router 192.168.1.1"

War das ausreichend verständlich erklärt? Sonst frag einfach nach.
pneumokoniose hat geschrieben: 2. VOIP funktioniert manchmal sehr gut, manchmal sehr unzuverlässig und manchmal auch gar nicht. Sprich: Zeitversatz, keine eingehenden Anrufe oder nur einseitiges hören. Was ich bereits herausgefunden habe: Ohne OpenVPN funktioniert alles einwandfrei und zuverlässig. Nun meine Frage: Gibt es eine Möglichkeit, VOIP nicht über OpenVPN zu leiten? Gewissermaßen eine Ausnahme-Regel für die Telefonie-Funktion der FRITZ!Box?
Ja, gibt es: mehrere sogar: routing ("route add" (man route) oder "ip route add" (man ip-route), die Manpages haben Beispiele) oder iptables (auf die Reihenfolge achten). Routing betrifft halt die "ganze" IP bzw das jeweilige Teilnetz, iptables unter Umständen das jeweilige Protokoll/Port; musst Du selbst entscheiden was hier der richtige Ansatz ist.
Zu Iptables hatten wir hier auch schon einige längere Erklär-Threads (evtl auch im Wiki), da sollte alles nötige drin zu finden sein. Falls Du doch nicht klarkommst: Wie weit hast Du es verstanden, wo hängt es und Ausgaben von iptables-save und iptables --list -nv und iptables -t nat --list -nv nach pastebin.php

pneumokoniose
Beiträge: 11
Registriert: 02.05.2016 12:11:17

Re: Raspberry Pi als VPN-Gateway mit VOIP

Beitrag von pneumokoniose » 06.05.2016 14:19:43

Besten Dank für eure beiden Antworten! Die Erklärung von eggy war genau das, was ich gesucht hatte. Das ist für mich als Laie eine wirkliche sehr verständliche Zusammenfassung. Mit so einem groben Überblick kann man sich schon deutlich einfacher durch die vielen Dokumentationen kämpfen. Danke! Eine naive Frage habe ich aber noch:

So wie ich das Verstanden habe, ist in meinem Fall iptables das Mittel der Wahl, um VoIP vom VPN-Tunnel auszuschliessen, da ich hier gezielt einzelne Ports "ansprechen" kann und nicht nur eine "ganze" IP.

Frage 1: Mit der folgenden Regel in meiner Konfiguration ...

Code: Alles auswählen

iptables -I FORWARD -i eth0 ! -o ovpn -j DROP
... sage ich doch, dass alle Pakete, die nicht über ovpn gehen, blockiert werden. Wenn ich allerdings nun eine zusätzliche Regel erstelle, die sagt: Alles geht über ovpn AUSSER Port 5004 und 5060, entsteht doch ein Konflikt, oder? Denn einerseits sage ich strikt: Alles muss über ovpn gehen! Und in der nächsten Regel sage ich: Naja, Port 5004 und 5060 lassen wir nicht nur außen vor, sondern sollen explizit NICHT über ovpn gehen. Wie passt das zusammen? Muss ich dazu meine Regeln in einer ganz anderen Logik aufrollen? Oder habe ich etwas übersehen? Wie kann eine solche Regel aussehen? Hier sind noch die folgenden Ausgaben:

iptables-save: NoPaste-Eintrag39284
iptables --list -nv: NoPaste-Eintrag39285
iptables -t nat --list -nv: NoPaste-Eintrag39286
route -n: NoPaste-Eintrag39287

Laut Sipgate handelt es sich um die folgenden Ports:
- Sprachdaten werden per UPD über den sog. RT-PORT 5004 übertragen.
- Daten für den Verbindungsaufbau werden per UDP über den SIP-PORT 5060 übertragen
Vielleicht kann mich bei dieser Regel nochmals jemand unterstützen, damit ich – bevor ich mich ausführlicher mit iptables auseinandersetzte – schon mal eine funktionierende Grundlage habe.

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Raspberry Pi als VPN-Gateway mit VOIP

Beitrag von eggy » 06.05.2016 18:02:37

Mit der folgenden Regel in meiner Konfiguration ...
iptables -I FORWARD -i eth0 ! -o ovpn -j DROP
... sage ich doch, dass alle Pakete, die nicht über ovpn gehen, blockiert werden.
Jein. Das betrifft erstmal nur "FORWARD".
Wenn ich allerdings nun eine zusätzliche Regel erstelle, die sagt: Alles geht über ovpn AUSSER Port 5004 und 5060, entsteht doch ein Konflikt, oder?
Nein. Das kommt nur auf die "richtige" Reihenfolge an.
Iptables geht von "oben" nach "unten", erster Treffer gewinnt. Keine passende Regel da? Dann zählt die Policy. (Gibt auch andere Systeme, da gewinnt z.B. immer die letzte Regel - außer man bricht die weitere Abarbeitung des Regelwerks ausdrücklich ab.)
Außerdem greifen verschiedene Regeln (genauer Ketten) zu bestimmten Zeitpunkten (prerouting/postrouting) - d.h. bestimmte Manipulationen müssen/können nur vor bzw nach nach dem Routing erfolgen. Es gibt im Netz nen paar mehr oder weniger verständliche Diagramme zum Ablauf, einfach mal suchen ("iptables diagram" oder aehnliches).
Chain INPUT (policy ACCEPT 583K packets, 819M bytes)
pkts bytes target prot opt in out source destination
471 34093 ACCEPT all -- ovpn * 0.0.0.0/0 0.0.0.0/0
Das z.B. ist auch eine überflüssige Regel (so für sich alleine) - denn hier werden Pakete entweder akzeptiert weil die Regel passt, oder akzeptiert weil die Policy greift.

pneumokoniose
Beiträge: 11
Registriert: 02.05.2016 12:11:17

Re: Raspberry Pi als VPN-Gateway mit VOIP

Beitrag von pneumokoniose » 09.05.2016 14:22:32

eggy hat geschrieben:
Mit der folgenden Regel in meiner Konfiguration ...
iptables -I FORWARD -i eth0 ! -o ovpn -j DROP
... sage ich doch, dass alle Pakete, die nicht über ovpn gehen, blockiert werden.
Jein. Das betrifft erstmal nur "FORWARD".
Wenn ich allerdings nun eine zusätzliche Regel erstelle, die sagt: Alles geht über ovpn AUSSER Port 5004 und 5060, entsteht doch ein Konflikt, oder?
Nein. Das kommt nur auf die "richtige" Reihenfolge an.
Iptables geht von "oben" nach "unten", erster Treffer gewinnt. Keine passende Regel da? Dann zählt die Policy. (Gibt auch andere Systeme, da gewinnt z.B. immer die letzte Regel - außer man bricht die weitere Abarbeitung des Regelwerks ausdrücklich ab.)
Außerdem greifen verschiedene Regeln (genauer Ketten) zu bestimmten Zeitpunkten (prerouting/postrouting) - d.h. bestimmte Manipulationen müssen/können nur vor bzw nach nach dem Routing erfolgen. Es gibt im Netz nen paar mehr oder weniger verständliche Diagramme zum Ablauf, einfach mal suchen ("iptables diagram" oder aehnliches).
Chain INPUT (policy ACCEPT 583K packets, 819M bytes)
pkts bytes target prot opt in out source destination
471 34093 ACCEPT all -- ovpn * 0.0.0.0/0 0.0.0.0/0
Das z.B. ist auch eine überflüssige Regel (so für sich alleine) - denn hier werden Pakete entweder akzeptiert weil die Regel passt, oder akzeptiert weil die Policy greift.
Alles klar, Frage beantwortet, vielen Dank!

Antworten