OpenVPN Gateway mit PiHole und CryptDNS

#1

Ziel : Ein Server mit Pi-Hole zum filtern, DNS-Crypt zum verschlüsseln der DNS Anfragen, ein VPN Gateway auf eth0.1.

PS:

  • Für Windows kann ich den Bitvise SSH Client empfehlen. Dieser unterstützt neben SSH auch SFTP.

  • Außerdem gehe ich davon aus, dass alle Befehle als Root ausgeführt werden und als System Raspbian Stretch verwendet wird.

  • Das Subnetz entspricht der FritzBox Standard Konfiguration. Ggf. einfach an das Eigene anpassen.

#2

1. CryptDNS-Proxy downloaden und entpacken :

Neustes Release : https://github.com/jedisct1/dnscrypt-proxy/releases/

cd /etc
wget https://github.com/jedisct1/dnscrypt-proxy/releases/download/2.0.23/dnscrypt-proxy-linux_arm-2.0.23.tar.gz
tar -xf dnscrypt-proxy-linux_arm-2.0.23.tar.gz
mv linux-arm dnscrypt-proxy
rm dnscrypt-proxy-linux_arm-2.0.23.tar.gz

2. CryptDNS Konfigurieren :

cd dnscrypt-proxy
cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml

nano dnscrypt-proxy.toml
listen_addresses = ['127.0.0.1:5300', '[::1]:5300'] ##Pi-Hole belegt schon Port 53

ipv6_servers = true ##Falls man einen IPv6 Server nutzen will

require_dnssec = true ##Ich würde empfehlen DNSSEC zu nutzen`

require_nolog = true ##Würde ich aus Datenschutz Gründen empfehlen

require_nofilter = true ##Ist unnötig, da wir schon Pi-Hole haben

fallback_resolver = '176.126.70.119:53' ##opennic

ignore_system_dns = true ##Da wir Pi-Hole als System Resolver und dort DNSCrypt-Proxy eingetragen haben

CryptDNS Server :

Übersicht : https://github.com/DNSCrypt/dnscrypt-resolvers/blob/master/v2/
Mehr Infos : https://github.com/dyne/dnscrypt-proxy/blob/master/dnscrypt-resolvers.csv
Stamp Calculator : https://dnscrypt.info/stamps/
Raw : https://download.dnscrypt.info/dnscrypt-resolvers/v2/public-resolvers.md

3. Service installieren und starten :

./dnscrypt-proxy -service install
./dnscrypt-proxy -service start

4. Verbindung prüfen :

./dnscrypt-proxy -resolve google.com

Das Ergebnis sollte in etwa so aussehen :

Resolving [google.com]

Domain exists:  yes, 4 name servers found
Canonical name: google.com.
IP addresses:   216.58.206.110, 2a00:1450:4009:810::200e
TXT records:    docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e v=spf1 include:_spf.google.com ~all facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95
Resolver IP:    xxx.xxx.xxx.xxx

5. Den Service auch ohne root Rechte verwalten :

setcap cap_net_bind_service=+pe dnscrypt-proxy

6. Den Service automatisch starten :

systemctl enable dnscrypt-proxy
#3

1. Pi-Hole installieren :

curl -sSL https://install.pi-hole.net | bash

Our code is completely open, but piping to bash can be dangerous. For a safer install, review the code and then run the installer locally.

  • Interface : eth0
  • DNS Server : Erstmal irgendwas eintragen (z.B. 31.171.251.118 oder 1.1.1.1)
  • Protokoll : IPv4 und IPv6 aktivieren
  • IP : Zu der von eth0 ändern (meist schon richtig Eingestellt)
  • Gateway : Erstmal den Router (meist schon richtig Eingestellt)
  • Anfragen Loggen : An oder aus (ist erstmahl egal)
  • Web Interface : AN

2. DNSSEC in dnsmasq aktivieren :

echo "proxy-dnssec" >> /etc/dnsmasq.d/02-dnscrypt.conf

3. Passwort ändern :

pihole -a -p

4. Pi-Hole über die Web-Oberfläche konfigurieren :

  • Im Browser die [IP von eth0]/admin eingeben
  • Login → Passwort eingeben
  • Settings → DNS
  • Custom 1 (IPv4) = 127.0.0.1#5300
  • Custom 3 (IPv6) = ::1#5300
  • SAVE

DHCP Server des Routers ausschalten

  • → DHCP
  • DHCP server enabled : An
  • Bevorzugte IP Range einstellen
  • SAVE​

5. Eigene Einstellungen vornehmen (z.B.) :

  • Mehr Blocklists
  • Whitelisting
  • Privatsphäre Einstellungen

Falls IPv6 deaktiviert sein sollte :

  • Wird es oft einfach nicht benötigt.

Sollte IPv6 allerdings im Router deaktiviert gewesen sein, wird aber nun benötigt, kann man entweder​

  • “pihole -r” ausführen und Reconfigure wählen, wobei aber die DNS Einstellungen und die Hosts Listen (nicht die Whitelist) überschrieben werden
  • oder “ifconfig” ausführen um die lokale IPv6 Adresse, die mit “fd00::” beginnt herauszufinden und in “/etc/pihole/setupVars.conf” unter “IPV6_ADDRESS=” einzutragen

Wer die Blocking Page zurückhaben will :

Die Blocking Page ist besonders dann nützlich, wenn man viele oder sehr große Filterlisten benutzt, die eve. auch false Positives enthalten. Dort hat man nähmlich auch die Option Seiten zu Whitelisten, die fälschlicherweise geblockt wurden, ohne sich erst im Webinterface anzumelden.

nano /etc/pihole/pihole-FTL.conf

BLOCKINGMODE=IP-NODATA-AAAA

service pihole-FTL restart

Sollten sich Websiten dadurch wesentlich langsamer aufbauen :

BLOCKINGMODE=NULL

Block- und Whitelists :

https://firebog.net

https://github.com/anudeepND/whitelist/blob/master/domains/whitelist.txt

Update Frequenz anpassen (Standard ist Sonntags):

sudo crontab -e

Jeden Tag um 12 Uhr (unten in Datei einfügen) :

00 12 * * * PATH="$PATH:/usr/local/bin/" pihole updateGravity

Cron neustarten :

service cron --full-restart
#4

1. eth0 und eth0.1 einrichten :

nano /etc/network/interfaces
auto eth0.1
iface eth0.1 inet manual
vlan-raw-device eth0
hwaddress ether xx:xx:xx:xx:xx:xx ##MAC leicht ändern zur besseren Unterscheidung der Interfaces)
nano /etc/dhcpcd.conf

Am Ende einfügen und ggf. andere Konfigurationen der Interfaces überschreiben

interface eth0
static ip_address=192.168.178.2/24
static routers=192.168.178.1
static domain_name_servers=127.0.0.1

interface eth0.1
static ip_address=192.168.178.3/24
static routers=192.168.178.1
static domain_name_servers=127.0.0.1

2. Den Netzwerk Service neustarten :

/etc/init.d/networking restart

3. OpenVPN installieren :

apt-get install openvpn

4. OpenVPN Config Dateien für einen Server vom VPN Anbieter downloaden

5. Die Config Dateien nach /etc/openvpn/ kopieren :

cp <Server.ovpn> /etc/openvpn/

Falls folgende Dateien vorhanden sind

mkdir /etc/openvpn/server
cp <CAZertifikat.crt> /etc/openvpn/server/
cp <UserZertifikat.crt> /etc/openvpn/server/
cp <PrivateKey.key> /etc/openvpn/server/

6. Man will nicht bei jeder Verbindung Benutzername und Passwort eingeben :

Am Anfang von /etc/openvpn/Server.ovpn einfügen :

auth-user-pass /etc/openvpn/server/password.config

Die Datei password.config erstellen :

nano /etc/openvpn/server/password.config
<LOGIN NAME>
<LOGIN PASSWORT>

Nur Root soll die Datei lesen können :

chmod 600 /etc/openvpn/servers/password.config

7. Je nach VPN Anbieter muss man die Zertifikate oder Keys noch konfigurieren :

nano /etc/openvpn/*Server*.ovpn
ca /etc/openvpn/server/<CAZertifikat>.crt
cert /etc/openvpn/server/<UserZertifikat>.crt
key /etc/openvpn/server/<PrivateKey>.key

8. Ipv4 Forwarding aktivieren :

In /etc/sysctl.conf entkommentieren :

net.ipv4.ip_forward = 1

Änderungen laden

sysctl -p /etc/sysctl.conf

9. Iptables konfigurieren :

iptables -A FORWARD -s 192.168.178.0/24 -i eth0.1 -o eth0 -j REJECT
iptables -A FORWARD -s 192.168.178.0/24 -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

Wer eine Firewall einrichten möchte :

iptables -A INPUT -p tcp -s 192.168.178.0/24 --dport 22 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -I INPUT -p udp --dport 67:68 --sport 67:68 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.178.0/24 --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.178.0/24 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -s 192.168.178.0/24 --dport 53 -j ACCEPT
iptables -A FORWARD -s 192.168.178.0/24 -o tun0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
  • SSH Verbindungen aus der Heimnetz IP-Range erlauben
    (eve. “-s 192.168.178.0/24” weglassen falls man oft was an seinem Netzwerk bastelt und trotzdem immer Zugriff auf den Pi haben will)
  • Alle Pakete an das Loopback Interface erlauben
  • Pakete selbst aufgebauter Verbindungen erlauben
  • Ping erlauben
  • Pakete zur DHCP Konfiguration erlauben
  • http Verbindungen aus der Heimnetz IP-Range erlauben (PiHole Oberfläche)
  • DNS (TCP/UDP) Pakete aus der Heimnetz IP-Range erlauben
  • Pakete aus der Heimnetz IP-Range dürfen zu tun0 weitergeleitet werden
  • Bereits aufgebaute Verbindungen dürfen beantwortet werden
  • In ausgehenden Paketen wird die Netzwerk Interne IP durch die Public IP ersetzt, bei eingehenden Paketen genau andersherum (Funktionsweise aller Router)

10. Iptables sichern :

‘iptables-persistent’ installieren

apt install iptables-persistent

Iptables sichern (falls nicht schon bei der Installation geschehen)

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

ODER

iptables-save > /etc/iptables/rules.v4
crontab -e
##Restore Iptables## 
@reboot /sbin/iptables-restore < /etc/iptables.up.rules

11. OpenVPN starten :

openvpn --config /etc/openvpn/*Server*.ovpn --daemon

12. Als Gateway eintragen :

Auf der Pi-Hole Oberfläche unter Settings → DHCP → Gateway die IP des OpenVPN Gateways (eth0.1) eintragen → SAVE

Abschließend :

  • Im Browser https://ipleak.net/ eingeben, die IP Adresse und die DNS Server prüfen.

  • Optional den Internetzugriff für alle Geräte außer dem RaspberryPI - Interface eth0 im Netzwerk
    per Kindersicherung der FritzBox (Internetnutzung für Standard Profil sperren) deaktivieren.​

  • Eve. IPv6 im Router ausschalten, falls der VPN Anbieter kein IPv6 unterstützt. In der FritzBox unter Heimnetz → Netzwerk → Netzwerkeinstellungen → IPv6 Adressen → Diese FRITZ!Box stellt den Standard-Internetzugang zur Verfügung