Install Exim4 mit Spamassassin, Dovecot auf Ubuntu 22.
Heute beschreibe ich, wie ich einen Mailserver mit IMAP, validen SSL-Zertifikat mithilfe von nginx, Let’s Encrypt, Antispam mit Spamassassin, DNS-Blacklist und IMAP via Dovecot aufbaue.
- Installieren der Grundpackete
- SSL-Zertifikat via nginx für Exim4
- Exim4 Konfigurieren
- update-exim4.conf.conf
- Virtuelle Domains
- 00_localconfig
- 00_exim4-config_header
- 25_exim4-config_check_rcpt_reject_RDNS_fail
- Exim SMTP Auth via dovecot
- Exim Router für virtuelle dovecot User
- Spamassassin Setup
- Config übernehmen und Service restarten
- SMTP testen
- Exim live log
- Exim Kommandos
- Links
Installieren der Grundpackete
apt install exim4-daemon-heavy sa-exim spamassassin spf-tools-perl bind9-dnsutils swaks libnet-ssleay-perl dovecot-core dovecot-imapd nginx-light python3-certbot-nginx python3-certbot net-tools
SSL-Zertifikat via nginx für Exim4
Als Erstes werde ich mir ein SSL-Zertifikat für Exim4 via nginx und dem Certbot erzeugen. Dafür brauche ich einen Vhost, der weiterhin existieren muss und zum Zertifikat updaten genutzt wird.
mkdir -p /var/www/serverdummy
$ cd /etc/nginx/sites-available
touch $domainname
nano $domainname
server {
server_name $domainname;
root /var/www/serverdummy;
# Add index.php to the list if you are using PHP
index index.html index.htm;
}
Symlink zum Einschalten des Vhosts und nginx restarten:
cd ../sites-enabled
ln -s ../sites-available/$domainname ./
service nginx restart
Let’s Encrypt Zertificat für Exim4
Jetzt bauen wir uns einen Script, der uns beim Updaten das neue SSL-Zertificat in unser Exim-Directory kopiert.
mkdir -p /etc/letsencrypt/renewal-hooks/post/
nano /etc/letsencrypt/renewal-hooks/post/exim_key.sh
Jetzt fügen wir dieses Script dort ein, "$domainnam durch deine Domain ersetzten":
#!/bin/sh
cp /etc/letsencrypt/live/$domainname/fullchain.pem /etc/exim4/exim.crt
cp /etc/letsencrypt/live/$domainname/privkey.pem /etc/exim4/exim.key
chown root:Debian-exim /etc/exim4/exim.crt
chown root:Debian-exim /etc/exim4/exim.key
chmod 640 /etc/exim4/exim.crt
chmod 640 /etc/exim4/exim.key
service exim4 restart
Das Script müssen wir nun ausführbar machen und beantragen ein neues Zertifikat mit nginx und forcieren mit --force-renewal das unser Script getestet wird.
chmod +x /etc/letsencrypt/renewal-hooks/post/exim_key.sh
certbot --nginx -d $domainname
certbot renew --force-renewal
Wenn jetzt in 'ls /etc/exim' unser exim.crt und exim.key Files existieren, hat alles geklappt :)
Exim4 Konfigurieren
update-exim4.conf.conf
"$serverip durch Deine Server-IP ersetzen"
dc_eximconfig_configtype='internet'
dc_other_hostnames='$domainname;noch-eine-domain.tld
dc_local_interfaces='127.0.0.1;$serverip'
dc_readhost=''
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets=''
dc_smarthost=''
CFILEMODE='644'
dc_use_split_config='true'
dc_hide_mailname=''
dc_mailname_in_oh='true'
dc_localdelivery='maildir_home'
Virtuelle Domains
Weil dieser Server mehr als eine Domain handhaben soll, aber auch nicht alle User auf jeder Domain einen Account haben sollen, mache ich mir den Umweg über Domainlisten mit User-Listen in denen man als alias so wie eine Weiterleitung konfigurieren kann.
mkdir /etc/exim4/domains
touch /etc/exim4/domains/$domainname
nano /etc/exim4/domains/$domainname
Die Syntax ist jetzt "Mail-Username: localname" oder "Mail-Username: Mailalias"
user1: user1
postmaster: user1
user2: klauspeter@externedomain[.]com
Und jetzt braucht es noch einen Router für unsere virtuellen Mails.
Dafür legen wir das File /etc/exim4/conf.d/router/090_exim4-config_virtuals mit diesem Inhalt an:
virtuals:
driver = redirect
allow_defer
allow_fail
data = $local_part_data
domains = dsearch,ret=full;//etc/exim4/domains
local_parts = wildlsearch;$domain_data
retry_use_local_part
# no_more
Damit gehen jetzt Mails an user1@$domainname z.b. an den User user1 und Mails an user2@$domainname werden an user2@externedomain[.]com weitergeleitet, wobei der Mailserver von externedomain[.]com unseren Server jetzt natürlich als relay akzeptieren muss.
Durch wildlsearch gehen auch wildcard aliase wie *+test : username was alle Mails mit +test am ende weiterleitet wie shopname+test@domain.
00_localconfig
Für unsere lokale Konfiguration legen wir jetzt ein eigenes File an, in dem wir alle möglichen Regeln festlegen.
nano /etc/exim4/conf.d/main/00_localconfig
# https://wiki.debian.org/Exim
MAIN_TLS_ENABLE = true
CHECK_RCPT_SPF = true
daemon_smtp_ports = 25 : 465
tls_on_connect_ports = 465
MAIN_TLS_ADVERTISE_HOSTS=*
MESSAGE_SIZE_LIMIT=50M
REMOTE_SMTP_SMARTHOST_HOSTS_REQUIRE_TLS = *
TLS_ON_CONNECT_PORTS = 465
REQUIRE_PROTOCOL = smtps
disable_ipv6=true
dns_ipv4_lookup='*'
MAIN_IGNORE_BOUNCE_ERRORS_AFTER = 12h
MAIN_TIMEOUT_FROZEN_AFTER = 1d
Ich schalte ipv6 ab, weil Spamprotektion zum großteils über DNS-Blacklisten läuft und die sind für ipv6 nicht wirklich effektiv. Wenn es keine Spamer oder Betrüger geben würde, wäre die Welt einfacher.
00_exim4-config_header
In /etc/exim4/conf.d/acl/00_exim4-config_header schalten wir jetzt ein paar Checks ein, damit das gröbste weggefiltert werden kann.
nano /etc/exim4/conf.d/acl/00_exim4-config_header
######################################################################
# ACL CONFIGURATION #
# Specifies access control lists for incoming SMTP mail #
######################################################################
# https://www.dnsbl.info/dnsbl-list.php
# https://www.spamhaus.org/zen/
# http://www.sorbs.net/mailsystems/exim4.shtml
# http://www.usenix.org.uk/content/rbl.html#exim
# https://abuse.ch/?p=532
CHECK_RCPT_IP_DNSBLS = zen.spamhaus.org:dnsbl.sorbs.net:all.s5h.net:combined.abuse.ch
CHECK_MAIL_HELO_ISSUED=true
CHECK_RCPT_REVERSE_DNS=true
begin acl
25_exim4-config_check_rcpt_reject_RDNS_fail
Wenn man, wie z.z. Google es auch macht, alle Mails von Servern ignorieren will, die keinen Reverse-DNS-Eintrag haben, geht das mit dieser Regel:
nano /etc/exim4/conf.d/acl/25_exim4-config_check_rcpt_reject_RDNS_fail
.ifdef CHECK_RCPT_REVERSE_DNS
# Verify reverse DNS lookup of the sender's host.
deny
message = Reverse DNS lookup failed for $sender_host_address
log_message = Reverse DNS lookup failed for $sender_host_address
!authenticated = *
!verify = reverse_host_lookup
!hosts = ${if exists{CONFDIR/local_broken_dns_whitelist}\
{CONFDIR/local_broken_dns_whitelist} {}}
.endif
Exim SMTP Auth via dovecot
/etc/dovecot/conf.d/10-master.conf
Als Erstes müssen wir Dovecot so einrichten, damit er uns ein Auth-Socket anbietet. Dafür ändern wir die Config in /etc/dovecot/conf.d/10-master.conf, suchen hier die Sektion "service auth {" und fügen folgende Zeilen ein:
nano /etc/dovecot/conf.d/10-master.conf
#SASL
unix_listener auth-client {
mode = 0660
user = Debian-exim
}
/etc/exim4/conf.d/auth/20_exim4-config_dovecot
Und nun fügen wir den Auth-Part in Exim ein der das Socket von Dovecot zum Authentifizieren benutzt.
nano /etc/exim4/conf.d/auth/20_exim4-config_dovecot
dovecot_plain:
driver = dovecot
public_name = PLAIN
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1
dovecot_ntlm:
driver = dovecot
public_name = NTLM
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1
Restart Dovecot und Exim:
service dovecot restart
update-exim4.conf
service exim4 restart
Exim Router für virtuelle dovecot User
/etc/exim4/conf.d/router/950_exim4-config_dovecot
nano /etc/exim4/conf.d/router/950_exim4-config_dovecot
# Router to send any mail for who a dovecot user exists to the appropriate maildir box
# Routers are evaluated in order of configuration.
# You will want to place this after the remote router and before the
# localuser router in the default configuration.
# If you want to allow + addressing (ie having an address extension)
# then uncomment the suffix stanzas
dovecot_router:
driver = accept
local_parts = ! root
require_files = +/home/virtual/${local_part}/
transport = dovecot_transport
/etc/exim4/conf.d/transport/50_exim4-config_dovecot
nano /etc/exim4/conf.d/transport/50_exim4-config_dovecot
# Transport to send any mail for who a dovecot user exists to the appropriate maildir box
# Transports definitions are not order dependant - you just call a named transport
dovecot_transport:
driver = appendfile
user = vmail
group = vmail
mode = 0640
directory=/home/virtual/${lc:$local_part}/Maildir/
maildir_format = true
mode_fail_narrower = false
envelope_to_add = true
return_path_add = true
Create vmail user and group
groupadd vmail
useradd -g vmail -s /usr/bin/nologin -d /home/virtual -m vmail
/etc/dovecot/conf.d/10-mail.conf
Die mail_location muss in Dovecot noch auf MailDir umgestellt werden. Als default Steht es auf mbox "mail_location = mbox:~/mail:INBOX=/var/mail/%u"
nano /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir
Virtuelle User in der Dovecot Config einrichten
nano /etc/dovecot/conf.d/auth-passwdfile.conf.ext
Folgende Zeile in den userdb { Bereich eintragen:
default_fields = uid=vmail gid=vmail home=/home/virtual/%u
Und jetzt muss man das Laden des Files noch einkommentieren in:
nano /etc/dovecot/conf.d/10-auth.conf
Am Ende des Files !include auth-passwdfile.conf.ext die Raute entfernen und den Dienst restarten.
Neuen Mailuser in Dovecot anlegen
User kann man jetzt mit doveadm anlegen, indem man ein Password mit doveadm generiert und den User dann in /etc/dovecot/users einträgt.
Ein Password generieren.
doveadm pw -s SHA512-CRYPT
nano /etc/dovecot/users
chown root:dovecot /etc/dovecot/users
chmod 640 /etc/dovecot/users
Und ein User ist dann z.b. so aufgebaut.
name:passwd:::/ome/virtual/name:::
Also für den User: user1 mit dem Password ‚geheim‘:
user1:{SHA512-CRYPT}$6$LYd4Ss8kxrEYK6to$1SEvEKLuwhSNdN3IVSKJgfGZ1zqs7Q4lHXv4gsmuTyM37sxwSEpmHM5N4zumbV1ZWER2CD1J8xM9IQEhDr4yh0:::/home/virtual/user1:::
user2:{PLAIN}secret:::/home/virtual/user2:::
Lokaluserdaten ausgeben
doveadm user user1 user2 email@mail.com
Maildir Ordner anlegen
sudo -u vmail mkdir -p /home/virtual/testuser/Maildir
service dovecot restart
User zur Exim-virtuellen-Domain hinzufügen
Nun muss man den User in eine oder mehrere Domains hinzufügen in /etc/exim4/domains/. Man kann also einen Username, bei diesem Setup nur einmal im System haben.
Spamassassin Setup
sa-exim.conf
Damit Spamassassin in Exim funktioniert, muss man noch die sa-exim Config anpassen. Als Erstes muss man die Zeile mit "SAEximRunCond: 0" auskommentieren:
# SAEximRunCond: 0
Um lokale Scanns zu verhindern, fügen wir jetzt diese Zeile hinzu:
SAEximRunCond: ${if and {{def:sender_host_address}{!eq{$acl_m0}{noscan}}}}
add noscan in 30_exim4-config_check_rcpt
Und ändern noch ein paar Sachen an der Exim Config, damit ‚noscan‘ auch gesetzt wird:
nano /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
acl_check_rcpt: anspassen
Hier muss die Zeile mit "set acl_m0 = noscan" hinzugefügt werden:
acl_check_rcpt:
# Accept if the source is local SMTP (i.e. not over TCP/IP). We do this by
# testing for an empty sending host field.
accept
hosts = :
control = dkim_disable_verify
set acl_m0 = noscan
Und so suchen wir jetzt noch mehr Sektionen mit "control = dkim_disable_verify" und wenn sie in einem accept-Sektion sind, fügen wir "set acl_m0 = noscan" hinzu. Z.Z habe ich insgesamt 3* "set acl_m0 = noscan" in meiner Config.
- acl_check_rcpt
- hosts = +relay_from_hosts
- authenticated = *
Enabel Update via Cronjob
nano /etc/default/spamassassin
Hier gibt es jetzt eine Zeile mit CRON=0 wo man die 0 durch eine 1 ersetzen muss:
CRON=1
Spamassassin Service
Per default wird Spamassassin nicht als Service gestartet. Um das einzuschalten, muss man dieses Kommando ausführen:
update-rc.d spamassassin enable
service spamassassin restart
Config übernehmen und Service restarten
update-exim4.conf
service exim4 restart
SMTP testen
swaks -a -tls -q HELO -s localhost -au username -ap '<>'
Exim live log
Alle log-Files ohne einen Punkt anzeigen in der bash :)
shopt -s extglob
tail -f /var/log/exim4/!(*\.*)
Exim Kommandos
Statistiken
eximstats /var/log/exim4/mainlog
Mails in der Warteschlange
exim4 -bpru
exim -bp | exiqsumm
oder
mailq
mailq | exiqsumm
Konfig Testen
Testen, was mit einer Mail passiert.
exim -bt tarfet@mail.net
Viel Spaß beim Nachbauen.
Links
Raspberry Pi zu einem mini Server Konfigurieren
Ich habe vor, ein Raspberry Pi zu einem kleinen Server aufzubauen, nachdem ich feststellen musste, dass meine Kodi-Box doch zu instabil ist, um wichtige Services zu hosten.
Als Basis nutze ich Raspberry Pi OS Lite also ein Debian.
Vorbereitung
Als erstes habe ich das OS auf eine SSD installiert mithilfe des Installers von Raspberry Pi OS mit eingeschalteten SSH und einen User den man bei dem Installer bei den Zusatzoptionen angeben kann und einmal das OS und die firmware komplett geupdated. WLAN eingerichtet, was sich als etwas hackelig herausgestellt hatte und nun step by step meine Docker Umgebung.
Install Dockerd
Als erstes Installiere ich alles, wo ich glaube es zu brauchen.
sudo apt update
sudo apt install docker.io docker-compose
sudo usermod -aG docker ${USER}
Bei meiner CoreELEC Docker installation hatte ich meine Daten irgendwie unglücklich mit der Directory-Struktur verschachtelt, was ich jetzt natürlich verbessern möchte :)
sudo mkdir /home/docker
sudo chmod 777 /home/docker
Setup Services
Setup PI-hole Service
Unter Debian liegen die Service files in /etc/systemd/system also baue ich meine Systemd startup config ein wenig um.
Wir legen also eine leere Datei in /home/docker an und erzeugen einen Symlink in /etc/systemd/system/ für das File um es zentral in unserem Home zu haben.
touch /home/docker/pi-hole.docker.service
sudo ln -s /home/docker/pi-hole.docker.service /etc/systemd/system/pi-hole.docker.service
Das soll nun unser neues pi-hole.docker.service sein.
[Unit]
Description=%p container
Requires=network-online.target
After=network-online.target
[Service]
Restart=always
RestartSec=10s
TimeoutStartSec=0
ExecStartPre=-/bin/sh -c "mkdir -p /home/docker/%p/etc-pihole /home/docker/%p/dnsmasq"
ExecStartPre=-/bin/sh -c "/usr/bin/docker rm %p"
ExecStartPre=-/bin/sh -c "ntpd -d -n -q -p 157.90.24.29"
ExecStart=/usr/bin/docker run \
--rm \
--name %p \
-p 53:53/tcp -p 53:53/udp \
-p 8053:80 \
-e TZ="Europe/Berlin" \
#-e # WEBPASSWORD: 'set a secure password here or it will be random' \
-v "/home/docker/%p/etc-pihole:/etc/pihole" \
-v "/home/docker/%p/dnsmasq:/etc/dnsmasq.d" \
--dns=192.168.1.1 --dns=192.168.8.1 \
#--restart=unless-stopped \
--hostname raspberrypi \
-e VIRTUAL_HOST="raspberrypi" \
-e FTLCONF_LOCAL_IPV4="192.168.8.190" \
pihole/pihole:latest
# before set a new docker have u to pull it manual
# docker pull pihole/pihole:latest
# ohne dns kein pull ohne pull kein docker :)
ExecStop=/usr/bin/docker stop %p
[Install]
WantedBy=multi-user.target
Und nun teste ich erst mal ob der neue Service hoch kommt und wenn ja, setzte ich das er immer beim Booten gestartet werden soll.
docker pull pihole/pihole:latest
sudo systemctl daemon-reload
sudo systemctl start pi-hole.docker.service
systemctl status pi-hole.docker.service
sudo docker ps -a
sudo systemctl enable pi-hole.docker.service
Setup InfluxDB2 Service
Hier machen wir jetzt einfach das selbe mit ein paar Anpassungen.
touch /home/docker/influxdb.docker.service
sudo ln -s /home/docker/influxdb.docker.service /etc/systemd/system/influxdb.docker.service
Das soll nun unser neues influxdb.docker.service sein.
[Unit]
Description=%p container
Requires=network-online.target
After=network-online.target
After=pi-hole.docker.service
[Service]
Restart=always
RestartSec=10s
TimeoutStartSec=0
ExecStartPre=-/bin/sh -c "mkdir -p /home/docker/%p/etc /home/docker/%p/influxdb"
ExecStartPre=-/bin/sh -c "/usr/bin/docker rm %p"
ExecStart=/usr/bin/docker run \
--rm \
--name %p \
-p 8086:8086 \
# ip-hole is not bound on host localhost only inside the bridge
--dns=172.17.0.1 \
--add-host host.docker.internal:host-gateway \
#--network=host \
--hostname raspberrypi \
-v "/home/docker/%p/etc:/etc/influxdb2" \
-v "/home/docker/%p/influxdb:/var/lib/influxdb2" \
-e INFLUXD_LOG_LEVEL="warn" \
-e TZ="Europe/Berlin" \
# docker wand pull a arm/v7 image wat not exist for influxdb2
#--platform linux/arm64 \
influxdb:2.6
# https://hub.docker.com/_/influxdb/tags
ExecStop=/usr/bin/docker stop %p
[Install]
WantedBy=multi-user.target
Und weiter geht es mit starten und testen.
docker pull influxdb:2.6
sudo systemctl daemon-reload
sudo systemctl start influxdb.docker.service
systemctl status influxdb.docker.service
sudo docker ps -a
sudo systemctl enable influxdb.docker.service
Setup OpenHAB Service
Und noch einmal mit OpenHAB.
touch /home/docker/openhab.docker.service
sudo ln -s /home/docker/openhab.docker.service /etc/systemd/system/openhab.docker.service
Das soll nun unser neues openhab.docker.service sein.
[Unit]
Description=%p container
Requires=network-online.target
Requires=influxdb.docker.service
After=network-online.target
After=pi-hole.docker.service
[Service]
Restart=always
RestartSec=10s
TimeoutStartSec=0
ExecStartPre=-/bin/sh -c "mkdir -p /home/docker/%p/conf /home/docker/%p/addons /home/docker/%p/userdata"
ExecStartPre=-/bin/sh -c "/usr/bin/docker rm %p"
ExecStart=/usr/bin/docker run \
--rm \
--name %p \
-e TZ="Europe/Berlin" \
--network=host \
--hostname %p \
-v "/home/docker/%p/conf:/openhab/conf" \
-v "/home/docker/%p/addons:/openhab/addons" \
-v "/home/docker/%p/userdata:/openhab/userdata" \
-v "/etc/localtime:/etc/localtime:ro" \
-v "/etc/timezone:/etc/timezone:ro" \
--device=/dev/ttyACM0:/dev/ttyACM0 \
-e OPENHAB_HTTP_PORT=8090 \
-e OPENHAB_HTTPS_PORT=8094 \
-e CRYPTO_POLICY="unlimited" \
-e USER_ID=1000 \
-e GROUP_ID=1000 \
-e EXTRA_JAVA_OPTS="-Xms1024m -Xmx2048m -Duser.timezone=Europe/Berlin" \
openhab/openhab:3.4.2
# https://hub.docker.com/r/openhab/openhab/tags
# docker pull openhab/openhab:latest
ExecStop=/usr/bin/docker stop %p
[Install]
WantedBy=multi-user.target
Und weiter geht es mit starten und testen.
docker pull openhab/openhab:3.4.2
sudo systemctl daemon-reload
sudo systemctl start openhab.docker.service
systemctl status openhab.docker.service
sudo docker ps -a
sudo systemctl enable openhab.docker.servicee
Daten sichern und übertragen
Pi-Hole
Quellsystem, in meinem fall die Kodi-Box.
cd /storage/dockerdata/
tar cfvz pihole.tar.gz pi-hole.docker/config/
Kopieren zum Zielsystem und Entpacken.
cd /home/docker
sudo systemctl stop pi-hole.docker.service
# Alte Daten vom test lösche
sudo rm -rf influxdb.docker/*
sudo tar xfvzp pihole.tar.gz -C pi-hole.docker/ --strip-components=2
sudo systemctl start pi-hole.docker.service
InfluxDB
Quellsystem.
cd /storage/dockerdata/
tar cfvz influx.tar.gz influxdb.docker/data/
Kopieren zum Zielsystem und Entpacken.
cd /home/docker
sudo systemctl stop influxdb.docker.service
# Alte Daten vom test lösche
sudo rm -rf influxdb.docker/*
sudo tar xfvzp influx.tar.gz -C influxdb.docker --strip-components=2
sudo systemctl start influxdb.docker.service
OpenHAB
Quellsystem.
# source system
cd /storage/dockerdata/
tar cfvz openhab.tar.gz openhab.docker/data/openhab/
Kopieren zum Zielsystem und Entpacken.
cd /home/docker
sudo systemctl stop openhab.docker.service
rm -rf openhab.docker/*
sudo tar xfvzp openhab.tar.gz -C openhab.docker/ --strip-components=3
sudo chown -r 1000:1000 openhab.docker
sudo systemctl start openhab.docker.service
Jetzt sollte, nach einem Reboot, Systemd alles wie gewollt starten und unsere neue Box alles Kontrollieren.
Viel Spaß beim Nachbauen.
Links
Raspberry Pi einmal komplett upgraded
Wenn man ein Raspberry Pi hat sollte man auch immer mal wieder nachsehen ob es nicht auch neuere firmware gibt bzw. ein neues EPROM was einige bekannte Probleme beheben kann. Alo hier jetzt ein Upgrade Pfad.
OS Update
Ich nutze Raspberry Pi OS Lite als basis OS also ein Debian.
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
Firmware Update
Die Firmware wird z.b. für WLAN gebraucht.
sudo rpi-update
Zurück rollen kann man bei Problemen mit dem commit hash
sudo rpi-update {Commit-Nummer}
EPROM Update
Das EPROM entspricht dem BIOS des Raspberry Pi.
Checken ob es eine neue version gibt
sudo rpi-eeprom-update
Upgrade zum reboot forcieren und rebooten.
sudo rpi-eeprom-update -d -a
sudo reboot
Viel Spaß
Links
Raspberry Pi WLAN Verbindungsprobleme mit neueren Router lösen
Gestern wollte ich meinen neuen RaspberryPi 4b ins WLAN einhängen und bin da auf unerwartete Probleme gestoßen.
Test WPA
Zum testen muss man WLAN erst mal disconnecten und dem wpa daemon killen und kann dann mit wpa_supplicant die Verbindung überprüfen. Bitte dran denken das man dafür via Lan connected sein muss :)
sudo ifdown wlan0
sudo killall wpa_supplicant
sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
CTRL-EVENT-ASSOC-REJECT mit bssid=00:00
Wenn die bssid nur Nullen beinhalten bei einem REJECT kann man davon ausgehen das der Router gar nicht erreicht werden kann. Z.b. ist die WLAN Antenne Geerdet ist, durch ein Fehlerhaftes Gehäuse z.B. oder der Router ist zu weit weg.
CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
set key_mgmt
Bei meinem Router wird das veraltete WPA-PSK nicht mehr unterstützt und man sieht dann im Router log nur AP-STA-POSSIBLE-PSK-MISMATCH und beim einen Test WPA mit wpa_supplicant CTRL-EVENT-ASSOC-REJECT status_code=16. Die Lösung kann WPA-PSK-SHA256 mit ieee80211w=2 sein. Dafür muss man seine wpa_supplicant.conf um folgendes ergänzen.
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
und füge den aktuellen WPA key_mgmt algo hinzu
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=DE
eapol_version=1
ap_scan=1
fast_reauth=1
pmf=1
network={
ssid="router_SSID"
psk=....
key_mgmt=WPA-PSK-SHA256
ieee80211w=2
}
Die Lösung hatte ich hier gefunden. github issue
Generate WPA Password
sudo wpa_passphrase "router_SSID" "wlanpassword" >> /etc/wpa_supplicant/wpa_supplicant.conf
WLAN Autoconnect
Damit sich mein WLAN selber Verbindet beim Booten und das Powermanagment aus ist um Verbindungsprobleme zu vermeiden habe ich diese config angelegt.
sudo nano /etc/network/interfaces.d/wlan.conf
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
post-up iw wlan0 set power_save off
brcmfmac modprobe options
Es gibt wohl verschiedenste Probleme und ein paar Lösungen sind die Optionen. Alle zu verwenden macht kein sin aber zum testen hier die Vorgehensweise.
Kernelmodule auswerfen.
sudo rmmod cfg80211
sudo rmmod brcmfmac
brcmfmac Config Optionen.
sudo nano /etc/modprobe.d/brcmfmac.conf
options brcmfmac roamoff=1
options brcmfmac p2pon=0
cfg80211 Config Optionen.
sudo nano /etc/modprobe.d/cfg80211.conf
options cfg80211 cfg80211_disable_40mhz_24ghz=1
Kernelmodule mit der neuen Config laden.
sudo modprobe brcmfmac
Und jetzt wieder testen wie in Test WPA Probieren ob es geht.
Nützliche Commands
List Verfügbare Wlan Channels
sudo iwlist chan
Show Country Infos
iw reg get
List Router
sudo iwlist scan|egrep 'ESSID|Channel:'
#oder full
sudo iwlist scan
Wlan infos
iwconfig
Viel Spaß beim Nachbauen
OpenHAB auf einer Kodi Box als Docker Service installieren
Nachdem ich ja, vor ein paar Tagen schon, ein PI-hole auf meine Kodi box installiert hatte, habe ich nun für die Home-Automatisierung auch noch ein openHAB mit einer influxdb2 eingerichtet um damit Licht, Thermostate und Multimedia zu steuern. Hier nun in groben schritten meine Lösung
Installation
Dockerd installieren
Wir brauchen das Kodi addon Docker in Dienste, wenn wir ein minimal System nutzen um einen dockerd zu haben.
Install xbmc.service Docker
systemd
Die service files speichere unter '/storage/.config/system.d/'
Filename: openhab.docker.service
[Unit]
Description=%p container
Requires=service.system.docker.service
Requires=network-online.service
After=network-online.service
After=pi-hole.docker.service
[Service]
Restart=always
RestartSec=10s
TimeoutStartSec=0
ExecStartPre=-/bin/sh -c "mkdir -p /storage/dockerdata/%p/data/openhab/conf /storage/dockerdata/%p/data/openhab/addons /storage/dockerdata/%p/data/openhab/userdata"
ExecStartPre=-/bin/sh -c "/storage/.kodi/addons/service.system.docker/bin/docker rm %p"
ExecStart=/storage/.kodi/addons/service.system.docker/bin/docker run \
--rm \
--name %p \
-e TZ="Europe/Berlin" \
--network=host \
--hostname %p \
-v "/storage/dockerdata/%p/data/openhab/conf:/openhab/conf" \
-v "/storage/dockerdata/%p/data/openhab/addons:/openhab/addons" \
-v "/storage/dockerdata/%p/data/openhab/userdata:/openhab/userdata" \
-v "/etc/localtime:/etc/localtime:ro" \
-v "/storage/.cache/timezone:/etc/timezone:ro" \
-e OPENHAB_HTTP_PORT=8090 \
-e OPENHAB_HTTPS_PORT=8094 \
-e CRYPTO_POLICY="unlimited" \
-e EXTRA_JAVA_OPTS="-Duser.timezone=Europe/Berlin" \
openhab/openhab:3.4.1
# https://hub.docker.com/r/openhab/openhab/tags
# docker pull openhab/openhab:latest
ExecStop=/storage/.kodi/addons/service.system.docker/bin/docker stop %p
[Install]
WantedBy=multi-user.target
Filename: influxdb.docker.service
[Unit]
Description=%p container
Requires=service.system.docker.service
Requires=network-online.service
After=network-online.service
After=pi-hole.docker.service
Before=openhab.docker.service
[Service]
Restart=always
RestartSec=10s
TimeoutStartSec=0
ExecStartPre=-/bin/sh -c "mkdir -p /storage/dockerdata/%p/data/etc /storage/dockerdata/%p/data/influxdb"
ExecStartPre=-/bin/sh -c "/storage/.kodi/addons/service.system.docker/bin/docker rm %p"
ExecStart=/storage/.kodi/addons/service.system.docker/bin/docker run \
--rm \
--name %p \
-p 8086:8086 \
# ip-hole is not bound on host localhost only inside the bridge
--dns=172.17.0.1 \
--add-host host.docker.internal:host-gateway \
#--network=host \
--hostname %p \
-v "/storage/dockerdata/%p/data/etc:/etc/influxdb2" \
-v "/storage/dockerdata/%p/data/influxdb:/var/lib/influxdb2" \
-e DOCKER_INFLUXDB_INIT_MODE="setup" \
-e DOCKER_INFLUXDB_INIT_USERNAME="admin" \
-e DOCKER_INFLUXDB_INIT_PASSWORD="admin1234" \
-e DOCKER_INFLUXDB_INIT_ORG="myorg" \
-e DOCKER_INFLUXDB_INIT_BUCKET="openhab" \
-e DOCKER_INFLUXDB_INIT_ADMIN_TOKEN="extremtopsecrettoken1234" \
-e INFLUXD_LOG_LEVEL="warn" \
-e TZ="Europe/Berlin" \
# docker wand pull a arm/v7 image wat not exist for influxdb2
--platform linux/arm64 \
influxdb:2.6
# https://hub.docker.com/_/influxdb/tags
ExecStop=/storage/.kodi/addons/service.system.docker/bin/docker stop %p
[Install]
WantedBy=multi-user.target
Steuerung des Services mit Systemd
Systemd Konfiguration neu einlesen.
systemctl daemon-reload
Service starten
systemctl start influxdb.docker.service
systemctl start openhab.docker.service
Service status
systemctl influxdb.docker.service
systemctl status openhab.docker.service
Start Service on reboot
systemctl enable openhab.docker.service
systemctl enable influxdb.docker.service
Service stoppen
systemctl stop openhab.docker.service
systemctl stop influxdb.docker.service
Logs lesen
journalctl -u openhab.docker.service
journalctl -u influxdb.docker.service
tail -f /storage/dockerdata/openhab.docker/data/openhab/userdata/logs/*.log
Bash im laufendem Docker öffnen
docker exec -it openhab.docker /bin/bash
Influxdb
Set New influxdb admin pw
Aus der infuxdb doku 'User passwords cannot be updated in the InfluxDB UI.'
Wir müssen als das pw mit der Shell ändern und das geht mit dem init token welsches bei dem ersten Start eingerichtet wird.
docker exec -it influxdb.docker influx user password -n admin -t extremtopsecrettoken1234
- go to Load Data->API Tokens
- Gerate API Token...
- Alte Admin token in der Liste löschen
Influxdb als persistent storage in openHAB einrichten
Als erstes muss man sich in openHAB einloggen und dort in die Settings gehen und bei den Add-ons das addon "InfluxDB Persistence" suchen und installieren.
Nach der Installation hat man nun in den Settings bei 'Other Services' die Einstellungen 'InfluxDB Persistence Service' wo man seine InfluxDB verbinden kann. Hier reichen wenige Optionen.
- Database URL: http://127.0.0.1:8086
- Database Version: InfluxDB 2
- Authentication Token: ein neues auth token generieren wie schon bei dem Admin pw ändern beschreiben und einfügen.
- Database/Organization: myorg
- Retention Policy / Bucket: openhab
Ich habe dann noch die 3 folgenden Schalter an gemacht 'Add Category Tag', 'Add Type Tag', 'Add Label Tag' um es eventuell später in Grafana als Selektor nutzten zu können.
Nun können wir die influxdb als Persistence storage auswählen. Dafür gehen wir wieder in den Settings zu den 'System Services' in die 'Persistence' Option und wählen 'InfluxDB persistence layer'.
Für die Persistence Config gibt es jetzt noch ein File was wir anlegen müssen und wofür es leider keine UI Config gibt.
Dafür legen wir das folgende File an
Filename: /storage/dockerdata/openhab.docker/data/openhab/conf/persistence/influxdb.persist
Strategies {
default = everyChange, restoreOnStartup
}
Items {
// persist all items on every change and restore them from the db at startup
* : strategy = everyChange, restoreOnStartup
}
Und nun sollten, sobald wir thinks haben Daten in der InfluxDB zu finden sein :)
Das war es schon, wie man nun ein paar Sachen in openHAB einbaut und benutzt werde ich in einem weiteren Artikel beschreiben.
Viel Spaß beim Nachbauen