Postfix als Mailrelay auf dem Raspberry Pi

Ein „richtiger“ Mailserver kann auf dem Raspberry Pi nicht schaden. Z.B. um Mails an root zu erhalten oder um laufenden Diensten und Scripts zu ermöglichen, Mails zu versenden. Ein Mailrelay Server reicht zumindest in meinem Fall absolut aus. Heißt, dass Mails vom Server aufgenommen und an einen „echten“ Mailserver weitergeleitet werden. Hier wird die gleiche Technologie verwendet wie beim Versand von Mails von einem Mailclient.

Dieser Beitrag bezieht sich auf Raspbian, kann aber z.B. auch fast ohne Änderung für Debian und somit nicht nur auf dem Raspberry Pi angewendet werden. IPv6 betrachte ich auch hier erst einmal nicht, obwohl fast alle meine Devices und Dienste auch auf IPv6 laufen, auch unsere Hot-Chilli Server. Alle Howtos zu openHAB beziehen sich auf IPv4, von daher schaue ich erst einmal, dass alles auf IPv4 läuft.

sudo apt-get install postfix mailutils

No configuration auswählen.

Standardkonfigurationsdatei kopieren, damit diese angepasst werden kann:

cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf

Nun in die /etc/postfix/main.cf unter die vorhandenen Einträge folgendes eintragen:

inet_protocols = ipv4
relayhost = mail.domain.tld:submission
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_use_tls = yes
smtp_tls_enforce_peername = no
smtp_sasl_security_options = noanonymous
myhostname = raspberrypi.$mydomain
mydomain = domain.tld
append_dot_mydomain = yes

myhostname eventuell anpassen und für mydomain am besten etwas sinnvolles einfallen lassen – eventuell steht ja eine eigene Domain zur Verfügung.

Da der Raspberry Pi momentan nur auf IPv4 läuft, muss die erste Zeile rein. Sonst gibt es Fehlermeldung ohne Ende. Die weiteren Zeilen weisen Postfix an, sich auf Port 587 (Submission) TLS-verschlüsselt auf den dort angegebenen Mailserver zu verbinden. Dieser muss natürlich auf die eigenen Bedürfnisse angepasst werden. Der passende Benutzername und das Passwort kommen aus /etc/postfix/sasl_passwd:

mail.domain.tld user@domain.tld:mailpasswort

Nun muss diese Datei noch für Postfix lesbar gemacht werden:

cd /etc/postfix
sudo postmap sasl_passwd

Dem System teilen wir nun mit, wo die Systembenutzer root und pi per Mail zu erreichen sind. So bekommen wir die Mails mit Postfix auf externe Mailaccounts zugestellt. Dazu tragen wir in /etc/aliases folgendes ein:

pi: root
root: user@domain.tld

Auch diese Datei muss für Postfix lesbar gemacht werden:

cd /etc
sudo postalias aliases

Nun noch Postfix neu starten:

sudo /etc/init.d/postfix restart

LAN und WLAN am Raspberry Pi

Betreibt man auf dem Raspberry Pi einen serverartigen Dienst (z.B. openHAB oder auch so etwas wie Kodi/XBMC) dann wäre es doch praktisch, wenn der Raspberry Pi auf jeden Fall eine feste IP-Adresse hätte. So geht nie etwas schief, egal ob der DHCP-Server verfügbar ist, ob man dort eine Reservierung eingetragen hat oder oder oder… Außerdem ist es teilweise auch ausreichend, den Raspberry Pi über WLAN statt LAN zu betreiben. Bei openHAB ist es ausreichend, in anderen Fällen muss es eventuell auch ausreichend sein, wenn der Standort beispielsweise nicht über LAN-Kabel angefahren werden kann. Investieren muss man zwischen 5 und 10 € für einen kleinen WLAN-Stick, ist also überschaubar.

Dieser Beitrag bezieht sich auf Raspbian, kann aber z.B. auch fast ohne Änderung für Debian und somit nicht nur auf dem Raspberry Pi angewendet werden. IPv6 betrachte ich erst einmal nicht, obwohl fast alle meine Devices und Dienste auch auf IPv6 laufen, auch unsere Hot-Chilli Server. Alle Howtos zu openHAB beziehen sich auf IPv4, von daher schaue ich erst einmal, dass alles auf IPv4 läuft. Ich gehe außerdem von einem WPA2-CCMP geschützten WLAN-Netz aus.

Folgendes in die /etc/network/interfaces eintragen, die ursprüngliche Datei also ersetzen:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.0.2
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1

auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.0.3
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1
wireless-power off
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

In /etc/wpa_supplicant/wpa_supplicant.conf am Ende folgendes einfügen:

network={
ssid="WLAN-SSID/Kennung"
psk="WLAN-Schlüssel"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP
auth_alg=OPEN
}

lo ist für das Loopback Interface, nicht verändern. eth0 ist für LAN, der Part wlan0 ist für WLAN. In beiden Dateien müssen natürlich die passenden Netzwerkparameter, also IP-Adresse, Subnetzmaske, Broadcast, Gateway und v.a. WLAN-Parameter eingetragen werden. wireless-power off schaltet die Energiesparfunktion ab und funktioniert mit vielen Netzwerkkarten und kann im Vorfeld mit sudo iwconfig wlan0 power off geprüft werden. Funktioniert das nicht, wird es aufwändiger, die Energiesparfunktion abzuschalten, siehe hier.

Ein WLAN-Stick, mit dem bei mir wunderbar funktioniert, ist der EDIMAX EW-7811UN1. Ansonsten mal nach einem Stick mit dem Ralink RT5370 Chipsatz schauen. Es gehen aber auch viele andere Chipsätze.

Ach ja, ein Blick in die /etc/resolv.conf sollte zumindest folgender Eintrag stehen:

nameserver 192.168.0.1

Das ist der DNS-Servers des Netzes. Eventuell muss dies wie auch oben angepasst werden.

  1. Amazon Partner-Link. Bei Bestellung erhalten wir ein paar Cent Provision. Wichtig: Am Verkaufspreis ändert sich nichts! Es handelt sich lediglich um einen Bonus, den uns Amazon für die Empfehlung gutschreibt.

Realtime Clock (RTC) am Raspberry Pi betreiben

Da ich im Moment dabei bin, ein Home Automation System auf Basis eines Raspberry Pi 21 und openHAB aufzubauen, werde ich hier im Blog hin und wieder einzelne Schritte beschreiben. V.a., wenn ich selbst im Netz gar nichts, wenig oder veraltete Infos gefunden habe. Vermutlich werde ich auch noch eine Übersichtsseite hier erstellen, die auf die Blogbeiträge verlinken. Aber eines nach dem anderen… Zur (aktuellen) Sache:

Da ich den Raspberry Pi auch verwenden werde um Stromausfall per SMS zu melden (zur USV und dem UMTS Stick beizeiten an anderer Stelle mehr) dachte ich mir, dass ein Realtime Clock (RTC) Modul nicht schaden könnte. Fällt nämlich der Strom aus und der Raspberry fährt herunter, ist die Uhrzeit weg. Beim Neustart wird die Uhrzeit aus dem Internet per NTP auf die aktuelle Zeit gesetzt. Kein Internet, keine korrekte Uhrzeit, dadurch eventuell SMS Nachrichten mit „komischem“ Inhalt.

Die Hardware, also die kleine RTC DS1307 Platine, kostet übrigens um die 2 € und ist z.B. bei Amazon1 erhältlich. Auf jeden Fall beachten, dass keine „normale“ Batterie sondern eine wiederaufladbare LIR2032 Lithium-Batterie mitgeliefert wird und es diese auch tatsächlich ist!

Bin nach folgenden beiden Anleitungen vorgegangen:

Im ersten Tutorial ist ganz gut beschrieben, wie die Hardware umzulöten ist (keine Angst, das kriegt jeder mit jedem Lötkolben hin, ist aber wichtig und unumgänglich) und wie diese an den Raspberry Pi anzuschließen ist. Hier zwei Fotos der umgelöteten Platine. Auf dem zweiten Bild sieht man, wo die beiden Widerstände entfernt werden müssen und wo die vier Pins angelötet werden müssen.

RTC DS1307 Platine

RTC DS1307 Platine

Verkabelt wird das auf dem Raspberry Pi dann so:

#--------------------#
| RPi GPIO  | RTC P1 |
|-----------|--------|
|Pin 2 5V   |   VCC  |
|Pin 3 SDA  |   SDA  |
|Pin 5 SCL  |   SCL  |
|Pin 6 GND  |   GND  |
#--------------------#

Leider sind die beiden Anleitungen nicht mehr ganz aktuell was den Softwareteil anbelangt. Hier daher kurz zusammengefasst, was ich beim Raspberry Pi 2 und dem Raspbian Image vom Februar 2015 machen musste:

In der Raspberry Config unter „Advanced Options“, „A7 I2C Enable/Disable automatic loading of I2C kernel module“ das I2C aktivieren:

sudo raspi-config

Die I2C Tools installieren:

sudo apt-get install i2c-tools

Zum Test und zur Einrichtung die noch nötigen Module laden:

sudo modprobe i2c_dev
sudo modprobe rtc_ds1307

Nun sollte hier in einer Tabelle irgendwo eine „68“ auftauchen:

i2cdetect -y 1

Hiermit kann man sich die aktuell gesetzten Stunden, Minuten und Sekunden sehen:

i2cget -y 1 0x68 0
i2cget -y 1 0x68 1
i2cget -y 1 0x68 2

Virtuelle Datei für die Uhr anlegen:

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

Aktuelle Uhrzeit aus der Uhr auslesen:

sudo hwclock -r

Systemzeit in die Uhr speichern (bei mir stimmte sie bei Ersteinrichtung natürlich absolut überhaut nicht):

sudo hwclock -w

Ok, klappt also alles. Nun soll das ganze Thema ja auch dauerhaft nach Systemstart am Start sein.

Dazu in /etc/modules folgende Module hinzufügen:

i2c_dev
rtc_ds1307

In /etc/rc.local kommt vor exit 0 folgendes:

# RTC Uhr einbinden und Systemzeit aus RTC beim Start setzen
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sudo hwclock -s

Zusätzlich wollen wir, dass die genaue Systemzeit (wird im Normalfall ja per NTP permanent aktualisiert) beim Shutdown in die Uhr gespeichert wird.

/etc/init.d/hwclock_w mit folgendem Inhalt erstellen:

#!/bin/sh
### BEGIN INIT INFO
# Provides: hwclock_w
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Default-Start:
# Default-Stop: 0 1 6
# Short-Description: RTC Clock mit Systemzeit setzen beim Shutdown
### END INIT INFO

hwclock -w

Das Script soll bei den entsprechenden Shutdown- und Restart-Runlevels ausgeführt werden. Das erreichen wir damit:

update-rc.d hwclock_w defaults

Fertig!

Nun kann man das Thema noch testen indem man den Raspberry Pi runterfährt, ein Weilchen ausgeschaltet lässt und ohne Internet wieder startet. Dann mit date und auch sudo hwclock -r die aktuelle Uhrzeit anzeigen lassen.

Zeitbedarf hielt sich sehr in Grenzen. Mit Löterei und Recherche, warum es nicht auf Anhieb mit o.g. Anleitungen tat, eine Stunde.

  1. Amazon Partner-Link. Bei Bestellung erhalten wir ein paar Cent Provision. Wichtig: Am Verkaufspreis ändert sich nichts! Es handelt sich lediglich um einen Bonus, den uns Amazon für die Empfehlung gutschreibt.

Wunderbar

Super Sache, dieser Baukasten von Wunderbar, zumindest macht die Vorstellung hier im Video (erstes Thema) echt Lust auf mehr:

heise show @ CeBIT 2015 (Tag 5): Wunderbar, barrierefreier Nahverkehr, IT-Sicherheit, Fazit

Wenn sich das nun auch in openHAB integrieren lässt – irgendwann in naher Zukunft… Auf jeden Fall werde ich das weiter beobachten.