Logo
Cover

Wireguard VPN

Silvio Siefke #Computer

Ich nutze seit ein paar Monaten Wireguard als VPN Tunnel zwischen meinen Servern und auf meinen Iphone. Die Einrichtung ist denkbar einfach und funktioniert auch mit IPv6.

Openvpn war eine VPN-Lösung, aber nach ein paar Wochen mit Wireguard, haben sich diese Dinge geändert. Einfache Einrichtung, moderne Kryptographie, IPv6 und die Performance sprechen für sich.

Wireguard Performance im Vergleich

Gründe warum Wireguard die richtige VPN Software ist:

Hoffentlich habe ich Sie schon überzeugt und wir können mit der Installation starten.

Typische VPN Verbindung

Installation

  1. Wireguard installieren
  2. Schlüssel generieren
  3. Konfigurationen schreiben
  4. Wireguard aktivieren
  5. IP Forwarding aktivieren
  6. Firewall Regeln schreiben
  7. Nameauflösung einrichten
  8. Installation auf den Clients

Wireguard installieren

pacman -S wireguard-tools wireguard-arch

Schlüssel generieren

cd /etc/wireguard
umask 077
wg genkey | tee server_private_key | wg pubkey > server_public_key
wg genkey | tee client_private_key | wg pubkey > client_public_key

Server Konfiguration

Erstelle /etc/wireguard/wg0.conf

[Interface]
Address = 192.168.2.1/24
SaveConfig = true
PrivateKey = <insert server_private_key>
ListenPort = 51820

[Peer]
PublicKey = <insert client_public_key>
AllowedIPs = 192.168.2.2/32

wg0.conf führt zur Schnittstelle mit den Namen wg0.

AllowedIPs = …./32 bietet die Sicherheit das sich nur der Client mit der entsprechenden IP und den richtigen privaten Schlüssel mit den Server verbinden kann.

ListenPort ist der udp Port auf dem Wireguard Verbindungen annimmt, der Port kann frei geändert werden.

Client Konfiguration

Erstellen wir zuerst /etc/wireguard/wg0-client.conf

[Interface]
Address = 192.168.2.2/32
PrivateKey = <insert client_private_key>
DNS = 192.168.2.1

[Peer]
PublicKey = <insert server_public_key>
Endpoint = <insert vpn_server_address>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 21

Simular zum Server wird mit wg0-client.conf die Schnittstelle angesprochen.

AllowedIps = 0.0.0.0/0, ::/0 leitet den gesamten Traffic auf dem Clienten über den VPN Tunnel.

DNS = 192.168.2.1 wird für die Namensauflösung benötigt, insbesondere auf mobilen Netzwerkclients ist es notwendig um Leaks vorzubeugen.

Wireguard aktivieren

chown -v root:root /etc/wireguard/wg0.conf
chmod -v 600 /etc/wireguard/wg0.conf
wg-quick up wg0
systemctl enable wg-quick@wg0.service #Enable the interface at boot 

Prüfen Sie mit ifconfig ob die Schnittstelle aktiv ist.

wg0: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1420
        inet 192.168.2.1  netmask 255.255.255.255  destination 192.168.2.1
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)
        RX packets 942096  bytes 266132696 (253.8 MiB)
        RX errors 189  dropped 16  overruns 0  frame 189
        TX packets 1662808  bytes 1986213236 (1.8 GiB)
        TX errors 0  dropped 895 overruns 0  carrier 0  collisions 0

IP Forwarding

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

Temporär kann es auch mit nachfolgenden erreicht werden.

sysctl -p
echo 1 > /proc/sys/net/ipv4/ip_forward

Firewall

Wir brauchen ein paar iptables Regeln um unseren Traffic und DNS zu managen.

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 51820 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 192.168.2.0/24 -p tcp -m tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 192.168.2.0/24 -p udp -m udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -i wg0 -o wg0 -m conntrack --ctstate NEW -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o eth0 -j MASQUERADE

Iptables Regeln speichern und bei einem Neustart automatisch aktivieren.

iptables-save > /etc/iptables/iptables.rules
systemctl enable iptables.service

Nameauflösung

Ein großes Problem mit vielen VPN ist, dass das DNS nicht vernünftig umgesetzt wird. Dies führt zu DNS Leaks. Eine gute Möglichkeit es zu testen bieten http://dnsleak.com/.

Wir werden daher unseren DNS Traffic entsprechend sicher gestalten und hier kommt nur eine ungebundene DNS Lösung in Frage.

Wir werden es so einrichten, dass DNS-Leaks, ausgeklügeltere Angriffe wie gefälschte Proxy-Konfiguration, Rogue router und alle Arten von MITM Angriffen auf HTTPS und andere Protokolle entgegenwirken.

pacman -S unbound

Root DNS Server

curl -o /etc/unbound/root.hints https://www.internic.net/domain/named.cache

nano /etc/unbound/unbound.conf

server:

  num-threads: 4

  #Enable logs
  verbosity: 1

  #list of Root DNS Server
  root-hints: "/var/lib/unbound/root.hints"

  #Use the root servers key for DNSSEC
  auto-trust-anchor-file: "/var/lib/unbound/root.key"

  #Respond to DNS requests on all interfaces
  interface: 0.0.0.0
  max-udp-size: 3072

  #Authorized IPs to access the DNS Server
  access-control: 0.0.0.0/0               refuse
  access-control: 127.0.0.1               allow
  access-control: 192.168.2.0/24         allow

  #not allowed to be returned for public internet  names
  private-address: 192.168.2.0/24

  # Hide DNS Server info
  hide-identity: yes
  hide-version: yes

  #Limit DNS Fraud and use DNSSEC
  harden-glue: yes
  harden-dnssec-stripped: yes
  harden-referral-path: yes

  #Add an unwanted reply threshold to clean the cache and avoid when possible a DNS Poisoning
  unwanted-reply-threshold: 10000000

  #Have the validator print validation failures to the log.
  val-log-level: 1

  #Minimum lifetime of cache entries in seconds
  cache-min-ttl: 1800 

  #Maximum lifetime of cached entries
  cache-max-ttl: 14400
  prefetch: yes
  prefetch-key: yes

  # DNS Server
  forward-zone:
  name: "."
  forward-addr: 2a02:2970:1002::18         # Digitalcourage
  forward-addr: 46.182.19.48               # Digitalcourage  
  forward-addr: 80.241.218.68              # dismail.de
  forward-addr: 2a02:c205:3001:4558::1     # dismail.de
  forward-addr: 194.150.168.168            # AS250.net
  forward-addr: 194.150.168.169            # AS250.net
  forward-addr: 91.239.100.100             # UncensoredDNS
  forward-addr: 2001:67c:28a4::            # UncensoredDNS
  forward-addr: 89.233.43.71               # UncensoredDNS
  forward-addr: 2a01:3a0:53:53::           # UncensoredDNS
  forward-addr: 146.185.167.43             # SecureDNS
  forward-addr: 2a03:b0c0:0:1010::e9a:3001 # SecureDNS

Die Kommentare erklären die Funktionen der entsprechenden Einträge. Wir setzen die entsprechenden Rechte und aktivieren unbound.

chown -R unbound:unbound /etc/unbound
systemctl enable unbound

Client

Jetzt werden wir Wireguard auf den Clienten installatieren und entsprechend konfigurieren.

pacman -S wireguard-tools wireguard-arch

Die wg0-client.conf haben wir bereits erstellt. Sie müssen diese nur auf den Client übertragen, oder mit Copy / Paste schreiben.

Wireguard kann von Hand, oder automatisch aktiviert werden.

Manuell starten und schließen

sudo wg-quick up wg0-client 
sudo wg-quick down wg0-client 

Beim Boot Prozess aktivieren

systemctl enable wg-quick@wg0-client

Sie können über https://whoer.net/ testen ob die Verbindung erfolgreich ist und testen Sie auf DNS Leaks über http://dnsleak.com/.

Für mobile Clients wie Iphone / Android installieren Sie die App, erstellen Sie ein QRCode und lesen Sie damit die Konfiguration in den mobilen Client.

qrencode -t ansiutf8 < wg0-client.conf
QRCODE zum einfachen Import in Wireguard Mobile Clients

Diesen QRCode lesen Sie in der Wireguard App ein, vergeben ein Namen und können dann die VPN Konfiguartion aktivieren.

QRCODE einlesen und VPN Verbindung aktivieren

Danach sollte bei richtiger Konfiguration alles laufen.

Internet mit und ohne VPN