Script-Time: Wireguard - OPNsense

Script-Time
Photo by Mohammad Rahmani / Unsplash

Wenn man sich in einem unsicheren, öffentlichen WLAN befindet, möchte man gerne seinen Netzwerkverkehr vor neugierigen Augen verbergen. Dazu eignet sich ein Wireguard-VPN zur heimischen OPNsense-Firewall besonders gut.

Nur zwei Eingaben reichen

Mit einem kleinen Script lassen sich die Felder im Konfigurationsdialog der OPNsense leicht befüllen. Es wird nur der Clientname und seine IP benötigt. QR-Code abfotografieren - fertig!

Im Detail

Doch welche Parameter gibt es auf der OPNsense überhaupt?

Zunächst muss eine Instanz definiert sein:

Instance mit Beispielwerten ;-)

Im VPN-Netz hat diese Instanz die IP 192.168.254.1. Die Clients haben also Platz in der Range von 2-254.

Welche Parameter werden also für den Client benötigt?

Neuer VPN-Client mit den Beispiel-Parametern aus dem Script

Woher bekommen wir nun diese Werte?

Wir brauchen also den Clientnamen und seine IP im VPN-Netz. Beides können wir frei wählen (die IP darf natürlich nicht doppelt vergeben werden).

Der Public Key ist durch die Wireguard-Instanz vorgegeben und einen Pre-Shared Key kann man generieren lassen oder frei wählen.

Wenn man also nun einmal die Variablen im Script angepasst hat, ist das hinzufügen von Clients ein Kinderspiel:

Beispiel-Client

Fertig!

Das Script liefert nun alle Parameter für die Eingabe auf der OPNsense für den neuen Client:

Beispielausgabe mit Demo-Keys

Jetzt ist der Client auf der OPNsense bekannt. Der Client selbst muss natürlich noch konfiguriert werden. Und hier unterscheiden sich die Betriebssysteme ein wenig.

LINUX / Windows / MAC

Auf einem Rechner wird meist ein Config-File benötigt:

Beispielausgabe für einen Linux-Client

SmartPhone

Für ein SmartPhone ist die Konfiguration besonders leicht. Nach der Installation von Wireguard tippt man einfach auf "hinzufügen aus QR-Code" und scannt angezeigten QR-Code ab.

Beispiel der Clientkonfiguration für ein SmartPhone

Hier das fertige Script:

#!/bin/bash
# Script to add a wg-client to opnsense
# Copyright (C) 2019 Michael Meister
# Last revised 1/16/2019

Help(){
    echo -e "
    ##############################################################
    ###                                                       ####
    ###   wireguard-add-client-testguard                      ####
    ###                                                       ####
    ##############################################################
    "
    exit 0
}
[ "$1" = "-h" -o "$1" = "-help" -o "$1" = "--help" ] && Help

##################################################################
PEER="your_opnsense_public_ip:7783" # IP und Port
PEERPUBKEY="jXokgifqXzyam6UeIJJ08=" # PubKey aus WG-Instanz
TUNNELPREFIX="192.168.254."         # Macht die Eingabe leichter
WHATGOESINTHETUNNEL="0.0.0.0/0"    # Nichts geht am Tunnel vorbei!
DNS=192.168.110.254   # DNS-Server der OPNsense für Werbeblocker etc.
##################################################################
TEMPFILE=/tmp/wgclientconf.$(date "+%N")

hline(){
printf "%$(tput cols)s"|sed "s/ /-/g"
}

define_colors(){
cls=$(clear)
# Reset
Color_Off='\033[0m'       # Text Reset
BGreen='\033[1;32m'       # Green
IBlue='\033[0;94m'        # Blue
}

define_colors

echo -e "$BGreen
╻ ╻╻┏━┓┏━╸┏━╸╻ ╻┏━┓┏━┓╺┳┓   ┏━╸┏━┓┏┓╻┏━╸╻┏━╸
┃╻┃┃┣┳┛┣╸ ┃╺┓┃ ┃┣━┫┣┳┛ ┃┃╺━╸┃  ┃ ┃┃┗┫┣╸ ┃┃╺┓
┗┻┛╹╹┗╸┗━╸┗━┛┗━┛╹ ╹╹┗╸╺┻┛   ┗━╸┗━┛╹ ╹╹  ╹┗━┛
          ┏━╸┏━┓┏━╸┏━┓╺┳╸┏━┓┏━┓
          ┃  ┣┳┛┣╸ ┣━┫ ┃ ┃ ┃┣┳┛
          ┗━╸╹┗╸┗━╸╹ ╹ ╹ ┗━┛╹┗╸
$Color_Off"
echo -e "Tell me some details about the client
"
read -p "Whats the HOSTNAME         : " CLIENTNAME
read -p "Whats the IP in the Tunnel : ${TUNNELPREFIX}" CLIENTLASTBYTE
CLIENTIP=${TUNNELPREFIX}${CLIENTLASTBYTE}

PRIVKEY=$(wg genkey)
PUBKEY=$(echo $PRIVKEY | wg pubkey)
PRESHAREDKEY=$(wg genpsk)

echo -e "

You need to put the following info to the ${BGreen}OPNsense${Color_Off}.

Create a new endpoint:
${IBBlue}
    - Name              : ${CLIENTNAME}
    - Public Key        : ${PUBKEY}
    - Preshared Secret  : ${PRESHAREDKEY}
    - Allowed IPs       : ${CLIENTIP}/32
${Color_Off}

Dont forget to ${BGreen}add ${CLIENTNAME} to the local wg-server on the OPNsense${Color_Off}!
AND ${BGreen}CREATE RULES${Color_Off} FOR THIS CLIENT ON THE FIREWALL !!!
"

read -n1 -esp "Hit [ENTER] for Client-Config " ENTER

echo "
On the Client, create /etc/wireguard/wg0.conf with the following content:
"

echo -ne "
[Interface]
Address = ${CLIENTIP}/32
PrivateKey = ${PRIVKEY}
DNS = ${DNS}

[Peer]
PublicKey = ${PEERPUBKEY}
PresharedKey = ${PRESHAREDKEY}
AllowedIPs = ${WHATGOESINTHETUNNEL}
Endpoint = ${PEER}
" > $TEMPFILE

# DNS-Server der OPNsense nutzen. Dann greifen auch die Werbeblocker

hline
echo -ne ${BIBlue}
cat $TEMPFILE
echo -ne ${Color_Off}
hline

echo "

You can start the tunnel by typing 'wg-quick up wg0'

"

read -n1 -esp "Hit [ENTER] for Phone-Config " ENTER

echo -e "
On a phone, just use the qr :-)"

cat $TEMPFILE | qrencode -t ansiutf8

rm -f $TEMPFILE