OPNsense an einem Hybrid7-Anschluss

Bei Hybrid7 handelt es sich um ein symmetrisches Gigabit-Glasfaser-Angebot von Init7. Im Gegensatz zu Fiber7 (auch von Init7), bei welchem die Faser direkt auf einen Init7-Switch führt, muss Init7 hier auf die BBCS Plattform von Swisscom zurückgreifen. Für den Nutzer bedeutet dies, dass die Adressierung der WAN-Schnittstelle nicht per DHCP, sondern via PPPoE in Verbindung mit Radius erfolgt. Als wäre dies nicht schon genug, muss der ganze WAN-Verkehr zusätzlich auch noch mit der VLAN-ID 11 getaggt werden.

Folgende Handgriffe sind dafür nötig:

VLAN-Tagging

Das VLAN-Tagging kann grundsätzlich an zwei Orten erfolgen: Direkt auf der Firewall, oder auf einem zwischengeschaltetem Switch, bzw. Medienkonverter. In meinem Fall erledigt dies ein der Firewall vorgeschalteter Cisco-Switch mit folgender Portkonfiguration:

interface GigabitEthernet0/12
 description Hybrid7
 switchport trunk allowed vlan 11
 switchport trunk native vlan 99
 switchport mode trunk
 spanning-tree portfast edge

Soll OPNsense das Tagging übernehmen, so ist hierfür ein VLAN-Subinterface auf der WAN-Schnittstelle zu erstellen und anschliessend zuzuweisen:

WAN-Schnittstelle

General configuration

PPPoE configuration

DHCPv6 Client configuration

Send Options

ia-na 0, ia-pd 0

Abschluss

Nach erfolgter Konfiguration müsste der WAN-Schnittstelle anschliessend eine IPv4- sowie eine IPv6-Adresse zugeteilt worden sein:

Hat dies geklappt, können anschliessend den lokalen Netzen nach Lust und Laune IPv6-Netze aus dem riesigen /48-Prefix (= 65000 x /64-Netze!) zugeteilt werden.

OSPF(v3) über Wireguard auf OPNsense

Wer OSPF und/oder OSPFv3 über einen Wireguard VPN-Tunnel betreiben will, sollte unbedingt folgende Punkte beachten:

Wireguard

  • Local
    • Advanced Mode
      • check
    • Tunneladressen
      • 10.0.0.1/30
      • fd00::1/126
      • fe80::1/64 (Zwingend für OSPFv3!)
    • Disable Routes
      • uncheck
    • Gateway
      • 10.0.0.2
  • Endpoints
    • Allowed IPs
      • 0.0.0.0/0
      • ::/0

Interfaces

Jedem Wireguard-Tunnel muss ein Interface zugewiesen werden, welches anschliessend zu aktivieren ist:

OSPF(v3)

  • Network Type
    • Point-to-point Network

Ergebnis

Nach erfolgter Konfiguration sollte man mit folgendem Ergebnis belohnt werden:

Sensordaten ab USB-WDE1 mit InfluxDB/Grafana loggen und visualisieren

Schon seit längerer Zeit logge ich Sensordaten wie Temperatur, Luftfeuchtigkeit, Niederschlag und Wind – die Inspiration dazu lieferte mir damals Martin Kompf in Form dieses Beitrages – mittels drahtloser Sensoren von ELV und eines Python-Scripts in eine RRDtool-Datenbank. Mithilfe der aufgezeichneten Daten fütterte ich anschliessend mein Monitoring-System und meine Website. Dieses Konstrukt wurde nun auf eine modernere Basis, in Form einer Kombination aus InfluxDB und Grafana, umgestellt.

Altes Funktionsprinzip

Neues Funktionsprinzip

Hardwareaufbau

Das System besteht aktuell aus folgenden Komponenten:

  • Wetterstation ELV KS300 (Temperatur, Luftfeuchtigkeit, Niederschlag und Wind)
  • 2x Temperatursensor ELV S 300 IA
  • PC-Engines APU1D2 Board
  • Ubuntu 16.04 LTS [VM@Proxmox]
    • Docker CE 17.09
      • InfluxDB
      • Grafana

Log-Script

#!/usr/bin/python3
# Python Modules
import serial, sys, time
from influxdb import InfluxDBClient
# Configuration
serialPort='/dev/ttyUSB0'
db = InfluxDBClient(host='10.11.1.104', port=8086, database='weather')
measurement = 'Messungen'
# Open serial port
try:
    ser = serial.Serial(serialPort,baudrate=9600,timeout=None)
except:
    sys.exit(1)
# Main loop
while True:
    # Wait for data and try error recovery on disconnect
    try:
        serData = ser.readline()
        dataset = str(serData).split(';')
        # Parse meter readings into dictionary (abbr. to rd for typing laziness of yours truely)
        rd = {}
        for n in range(1,9):
            # Conversion from german decimal mark , to international .
            try:
                    rd['temp'+str(n)]=float(dataset[2+n].replace(',','.'))
            except ValueError:
                    pass
            try:
                    rd['hum'+str(n)]=float(dataset[10+n].replace(',','.'))
            except ValueError:
                    pass
        # Kombisensor is mapped to temp9/hum9
        try:
            rd['temp9']=float(dataset[19].replace(',','.'))
        except ValueError:
            pass
        try:
            rd['hum9']=float(dataset[20].replace(',','.'))
        except ValueError:
            pass
        try:
            rd['windspeed']=float(dataset[21].replace(',','.'))
        except ValueError:
            pass
        try:
            rd['rainfall']=float(dataset[22].replace(',','.'))
        except ValueError:
            pass
        # Write Dictionary to InfluxDB
        json_body = [
            {
            'measurement': measurement,
            'fields': rd
            }
        ]
        try:
            db.write_points(json_body)
        except:
            pass
    except serial.SerialException as e:
        try:
            ser.close()
            time.sleep(10)
            ser = serial.Serial(serialPort,baudrate=9600,timeout=None)
        except:
            pass

Grafana Dashboard

Ist der erste Scriptdurchlauf erfolgt, können die einzelnen Werte in einem Grafana-Dashboard verknüpft, bzw. visualisiert werden – alternativ importiert man sich einfach direkt mein fixfertiges Dashboard als Vorlage:

Download Dashboard

Weitere Bilder

Bei der weissen Box mit Fenster handelt es sich im Übrigen um unser temperaturüberwachtes „Katzenhotel“ mit zwei Gästezimmern 😉