Kategorien
Allgemein

Einen SSH-public-key vom SSH-private-key neu generieren.

Wenn der SSH public-key verloren geht oder ein Webservice einen privaten SSH-Schlüssel generiert, ohne den public-key anzubieten kann dieser auch manuell erstellt werden.

Um den public-key vom private-key zu generieren kann der folgende Befehl verwendet werden:

ssh-keygen -y -f ~/.ssh/id_rsa

Die Option -y gibt den public-key zu dem angegenenen private-key aus.
Der public-key kann mit dem Zusatz „> ~/.ssh/id_rsa.pub“ in eine Datei umgeleitet werden.

Um den public-key zu prüfen kann dieser mit dem folgenen Aufruf validiert werden.

ssh-keygen -l -f ~/.ssh/id_rsa
2048 SHA256:ILuUR0iuoieWJCdoCEE44rKqMDvYUrVC15lH1mVq8To Kuehnel (RSA)

Die Ausgabe zeigt die Schlüsselgröße im ersten Textblock, anschließend das Format und den Fingerabdruck des öffentlichen Schlüssels, den im Key gespeicherten Namen und am ende, in Klammern, den q
Der Fingerabdruck kann sowohl als MD5 (-E md5) als auch als SHA256 (-E sha256) angezeigt werden.

Kategorien
MySQL

MySQL Prozessliste, ohne ruhende Prozesse, anzeigen

Leider erlaubt MySQL keine Filter für SHOW PROCESSLIST. Hierdurch wird die Übersicht der laufenden Prozesse schnell unübersichtlich.

Ab PHP 5.1 kann ich die laufenden MySQL Anfragen mit dem folgenden Befehl anzeigen:

SELECT * FROM information_schema.processlist;

Hierbei werden alle Prozesse, genau wie mit SHOW PROCESSLIST angezeigt, es ist aber auch eine Filterung möglich. Mit dem folgenden Befehl können alle laufenden MySQL Anfragen ohne die ruhenden Prozesse angezeigt werden.:

SELECT * FROM information_schema.processlist WHERE command != 'Sleep';

Die Ausgabe kann auch sortiert werden und weiter eingeschränkt werden. Mit dem folgenden Befehl werden dir MySQL Prozesse nach laufzeit sortiert und nur die Prozesse angezeigt die länger als zwei Sekunden laufen.:

SELECT user, time, state, info FROM information_schema.processlist WHERE command != 'Sleep' AND time >= 2 ORDER BY time DESC, id;

Die zur verfügung stehenden Felder sind ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO, TIME_MS, STAGE, MAX_STAGE, PROGRESS, MEMORY_USED, EXAMINED_ROWS, QUERY_ID, INFO_BINARY und TID.

ColumnBeschreibung
ID Verbindungskennung
USERDer Benutzer der diesen Prozess gestartet hat
HOSTServer von dem die Verbindung eingeht
DBBenutzte Datenbanbk oder NULL wenn keine
COMMAND Art des ausgeführten Befehls
TIME Sekunden, seit der dieser Prozess in seinem aktuellen Zustand ist
STATE Aktueller Status des Prozesses
INFO Anweisung, die in diesem Prozess ausführt wird , oder NULL wenn keine
TIME_MSZeit in Millisekunden seit dem sich der Prozess im aktuellen Status befindet
STAGE Die Phase, in der sich der Prozess derzeit befindet
MAX_STAGE Die maximale Anzahl von Stufen
PROGRESS Der Fortschritt des Prozesses in der aktuellen Phase (0-100%)
MEMORY_USED Speicher in Bytes, der von diesem Prozess verwendet wird
EXAMINED_ROWSTabellenzeilen die von diesem Prozess gelesen wurden.
Nur bei UPDATE-, DELETE- und ähnliche Anweisungen. Bei SELECT- und ähnlichen Anweisungen bleibt der Wert Null
QUERY_IDID.
INFO_BINARY Informationen zu Binärdaten
Kategorien
Linux NAS

autossh als Dienst einrichten

So nutze ich AutoSSH aum meinem Gnubee 2 NAS um von überall an die Daten auf meinem NAS zu gelangen!
Die verwendung von autossh wurde auf meinem NAS notwendig da sie sonst nicht mehr über das Internet erreichbar ist. Mein Internetprovider bietet nur noch DS-Light an. 🙁

autossh?

Autossh ist ein Programm das einen Open-SSH Tunnel bei Verbindungsabbrüchen automatisch wiederherstellt.

Verbindung zum Server etablieren

Meine NAS muss eine Passwortlose Verbindung zu meinem Server aufbauen können.
Hiezu generiere ich einen SSH-Key und übertrage den Public-Key auf den Server.:

ssh-keygen -t rsa -b 2048
mv ~/.ssh/id_rsa.pub ~/.ssh/autossh-key.pub
mv ~/.ssh/id_rsa ~/.ssh/autossh-key
ssh-copy-id -i autossh-key benutzername@example.org

Verbindung testen

ssh benutzername@example.org

Dienst anlegen

Um den Tunnel beim Systemstart automatisch wieder herstellen zu lassen lege ich die Datei /etc/systemd/system/sshtunnel.service mit dem folgenden Inhalt an:

[Unit]
Description=Keeps a tunnel to 'example.org' open
After=network-online.target ssh.service

[Service]
User=root
Environment="AUTOSSH_PORT=0"
Environment="AUTOSSH_GATETIME=0"
RestartSec=30
Restart=always

ExecStart=/usr/bin/autossh -NT -o "ExitOnForwardFailure=yes" -R 17777:127.0.0.1:22 -p 22 -l benutzername example.org -i /root/.ssh/autossh-key
ExecStop=killall -s KILL autossh
TimeoutStopSec=10

[Install]
WantedBy=multi-user.target

example.org ist durch den Hostnamen des Servers zu ersetzen, benutzername durch den verwendeten Benutzernamen.

Dienst aktivieren

Um den neu angelegten Dienst sshtunnel zu aktivieren muss dieser noch aktiviert und gestartet werden.

sudo systemctl enable sshtunnel.service
sudo systemctl start sshtunnel.service
Kategorien
Allgemein

Wie lange dauert etwas unter Linux

Ich verwende normalerweise den Linux befehl Time um die Dauer für einen Prozess unter Linux nachzuvollziehen.

time make -j4

real    0m2,587s
user    0m0,001s
sys     0m0,027s

Die Bash führt aber auch die wirklich praktische Variable SECONDS die die vergangenen Sekunden seit dem Start der Shell enthält. SECONDS führt die zählung auch fort wenn die Variable verändert wird. Die Variable enthält nach einer Änderung die zugewiesene Zahl zusätzlich zu der Anzahl Sekunden die nach der Änderung vergangen sind.
Wieso also nich eine Null Zuweisen um zu erfahren wie lange ein Prozess braucht.:

SECONDS=0; make; echo $SECONDS

viel Schöner geht es jedoch wenn ich mir in Anschluss noch ausrechne wie viele Minuten und Stunden es wahren.:

SECONDS=0
# Hier kommt die Ausführung des Befehls
DAUER=$SECONDS
echo "$(($DAUER / 3600)) Stunden, $((($DAUER / 60) % 60)) Minuten und $(($duration % 60)) Sekunden vergangen."

In einer Einzigen Zeile, zum Compillieren eines Programms bedeutet dies:

SECONDS=0 ; make -j4 ; DAUER=$SECONDS; echo "$(($DAUER / 3600)) Stunden, $((($DAUER / 60) % 60)) Minuten und $(($DAUER % 60)) Sekunden vergangen."

Libe Grüße,
Jan

Kategorien
Allgemein

The Final Cartridge 3.33 rebuild – that I could build

Vor einigen Jahren besaß ich ein „Frezer-Modul für meinen C64. Ich hatte noch, kurz bevor ich den C64 durch einen Amiga 500 ersetzt habe ein Action Replay IV von einem meiner Bekannten für 100 DM gekauft. Zuerst wollte ich mir ein Final Cartridge zulegen, leider kostete es damals noch 146 DM und als Schüler konnte es mir damals noch nicht leisten.

In den wirren der folgenden Jahre und Umzüge habe ich meinen C64 irgendwann weggegeben.

In den frühen 2010er Jahren habe ich mir wieder einen neuen C64, mit 1541-II und Datasette zugelegt. Leider konnte ich auch nach längerer Suche kein Final Cartridge III oder Action Replay-IV finden das meinen Vorstellungen entsprach.

Ich stolperte vor kurzem auf ein YouTube-Video von Greisis Workbench in dem er ein Final Cartridge via Reverse Engeniering wieder zum Leben erweckte. (dieses Video hier!)

Nach einer kurzen Prüfung meiner „Vorräte“ musste ich leider festgestellen das mir, ausser dem C64 selbst und meinem Lötkolben alles fehlte was ich für den Nachbau des The Final Cartridge 3.33 von Greisis Workbench benötige.

1. Vorräte auffüllen

Da Greisis auf seinem Google Drive die Dateien zum Projekt bereitgestellt hat (vielen Dank) brauche ich das PCB nicht aus dem Video nachkonstruieren sondern kann Gerber File und BOM direkt hier herunterladen. zusätzlich benötige ich noch einen EEPROM Brenner.

Auf dem YouTube-Kanal von EEVblog wurde vor wenigen Jahren der MiniPro TL866 Universal Programmer vorgestellt. (Video hier!) Eine kurze Installation des zugehörigen Brenner-Programms zeigte mir das dieser EEPROM Brenner den auf dem Modul verwendeten EEPROM „SST39SF010A PLCC-32“ unterstützt. Bei einem Preis von 50€ und der guten bewertung von EEVBlog ist das Ding gekauft.

11.06.2018 Bestellung des EEPROM Programmers über eBay für 50,67€
14.06.2018 Bestellung der Bauteile bei Conrad für 18,20€
14.06.2018 Bestellung des PCBs bei JLCPCB für 7,04€ (8 US$)
Bei meiner ersten Bestellung bei JLCPCB habe ich zuvor nicht in die XGerber.zip Datei geschaut und diese als Gerberfile hochgeladen.
Hierdurch wurde meine Bestellung nach wenigen Minuten von Seiten des Anbieters wieder Storniert. Die Datei XGerber.zip enthält zusätzlich den Gerber-File namens TFC3_V1_0.zip. Dieser Gerber-File muss bei dem Upload zu JLCPCB angegeben werden!

2. Warten auf die Post

JLCPCB Bestellbearbeitung

Conrad kündigt die erste Teillieferung der bestellten Bauteile am 15.06.2018 für Samstag den 16.06. an. Da die Lieferung via DHL in Berlin erfolgte hatte ich selbstverständlich erst am 19.06. die Abholkarte für das Päckchen in der Post. Die letzter 4 Logic ICs sollen laut Begleitkarte in zwei Wochen nachgeliefert werden. (das ist dann der der 03.07.)
JLCPCB gibt am 17.06.2018 den Versand des PCB bekannt.:

Die zweite Conrad Lieferung, die fehlenden 4 ICs, wurde mir am 26.06. gegen 5:00 Uhr für den aktuellen Tag angezeigt. Gegen 14:50 Uhr erhielt ich die Meldung „Ein Zustellversuch erfolgt am nächsten Werktag“. Das Päckchen wurde mir nicht zugestellt, ich erhielt auch keine Karte, konnte durch die Sendungsverfolgung von Conrad das Päcken am 28.06.2018 bei einem Paketshop in meiner Nähe abholen.
Die Päckchen des TL866A ist noch nicht angekommen, das PCB von JLCPCB  habe ich leider noch immer nicht am 03.07.2018 von der Post abholen.
Das Päckcen aus China mit dem TL866A sollte laut ebay-Anzeige bis spätestens 29.07.2018 geliefert werden. Ich habe jetzt am 08.08.2018 eine EMail über ebay an den händler gesandt um Ihn auf die ausstehende Lieferung hinzuweisen.

Die Bestellung des EEPROM Programmers dauerte insgesamt über 8 Wochen! Ich habe von ursprünglichen Händler das Geld zurück erhalten und am 14.August den EEPROM Programmer via Amazon neu bestellt.

Die lieferung erfolgte am 17.08.2018.

3. The Final Cartridge in Einzelteilen


Jetzt wo alle Teile vorhanden sind geht es an das verlöten der Wiedestände, der Kondensatoren, der Dioden und der Sicherung.

Das löten verlief sehr holperig da die Wiederstände für meine Hände einfach zu klein sind.

4. Montage

das fertig gelötete Cartridge

5. Test & Abschluss

So sieht das ganze dann auf dem C64 aus.

Kategorien
Allgemein

EMail-Konten mit doveadm Syncronisieren / sichern

Eine möglichst kurze Anleitung zum Syncronisieren von EMail-Konten via doveadm. Diese Anleitung ist speziel für EMail-Konten während eines Umzugs auf einen neuen EMail-Server.

Es muss zuerst sichergestellt sein das von dem neuen Server eine SSH-Verbindung zu dem alten Server mit einem Key hergestellt werden kann.
Aus diesem Grund ändere ich auf dem alten Server die Option PermitRootLogin für den SSH Dienst in der Datei /etc/ssh/sshd_config auf yes.

Anschließend kann ein neuer RSA-Key für die SSH Verbindung angelegt und auf den alten Server kopier werden.:

ssh-keygen -t rsa -C "Key for the historic Server to sync mail"
scp -p .ssh/id_rsa.pub root@angststalt.de:
ssh root@angststalt.de
cat id_rsa.pub >> .ssh/authorized_keys
exit

Um ein Postfach auf dem neuen Server vom alten Server zu synchronisieren kann der Befehl doveadm genutzt werden:

doveadm sync -u emailadresse@example.com ssh root@alterserver -i ~/.ssh/id_rsa doveadm dsync-server -u emailadresse@example.com

Wenn Du die Syncronisation von einigen wenigen Postfächern temporär zu jeder Viertelstunde durchführen möchtest kannst Du diesen Aufruf auch über den folgenden Cronjob erledigen lassen.

*/15 * * * * doveadm sync -u emailadresse@example.com ssh root@alterserver -i ~/.ssh/id_rsa doveadm dsync-server -u emailadresse@example.com >/dev/null 2>&1

Die Syncronisation erfolgt in beide richtungen, wenn eine EMail auf dem alten Server und eine EMail auf dem neuen Server eingeht sind diese beiden EMails nach der Syncronisation auf beiden Servern verfügbar.

Kategorien
Allgemein

PHP Sessiondaten löschen

Da PHP-Scripte auf die eigenen Temp- und Session-Verzeichnisse schreibenden Zugriff haben müssen ist ein Script um Sessiondaten zu löschen garnicht so schwer umzusetzen.

Folgend mein eigener Versuch eines solchen PHP-Scripts ohne Schöpfungshöhe:

<?php
echo "Delete all Files in Session Directory:<br>\n";

$path = explode(';', session_save_path());
foreach ($path as $DIR) {
    if (is_dir($DIR))
        $dir[] = $DIR;
}
unset($DIR);
unset($path);

foreach ($dir as $DIR) {
    $files = glob($DIR . '/{,.}*');
    foreach ($files as $file) {
        if (is_file($file)) {
            unlink($file);
            echo '.';
        }
    }
}
echo "\n";
?>

Wenn Du einen besseren Ansatz, oder Optimierungsideen hast schreibe mir gerne einen Kommentar!

Kategorien
Programmieren

PHP Mail via SMTP-Auth

Aufgrund zahlreicher Spam EMails ist es heute leider bei vielen Providern nicht mehr sinnvoll möglich EMails aus PHP-Scripten via mail() abzusetzen.
Die EMails werden, im Gegensatz zum Versand via SMTP-Auth im EMail-Programm sehr häufig als Spam zurückgewiesen.

Es ist garnicht so schwierig eine EMail via fsockopen und fgets zu versenden.

Hier das kleines PHP-Script ohne jede Schöpfungshöhe:

<?php
$MTo       = "empfaenger@example.net";
$MToName   = "Empfaengername";
$MFrom     = "absender@example.net";
$MFromName = "Absendername";
$MSubject  = "Die Betreffzeile der EMail!";
$MMessage  = "World, Hello!";
SendSMTPMail( $MFrom, $MFromName, $MTo, $MToName, $MSubject, $MMessage );
?>


<?php
function SendSMTPMail( $MFrom, $MFromName, $MTo, $MToName, $MSubject, $MMessage )
  {
    $smtpServer   = "smtp.strato.de";
    $smtpPort     = "25";
    $timeout      = "30";
    $username     = "EMail-Adresse als Benutzername";
    $password     = "Passwort für den SMTP Server";
    $localhost    = "h12345.stratoserver.net";
    $newLine      = "\r\n";
    $smtpConnect  = fsockopen( $smtpServer, $smtpPort, $errno, $errstr, $timeout );
    $smtpResponse = fgets( $smtpConnect, 515 );
    if ( empty( $smtpConnect ) )
      {
        $output = "Failed to connect: $smtpResponse";
        return $output;
      }
    fputs( $smtpConnect, "AUTH LOGIN" . $newLine );
    $smtpResponse = fgets( $smtpConnect, 515 );
    fputs( $smtpConnect, base64_encode( $username ) . $newLine );
    $smtpResponse = fgets( $smtpConnect, 515 );
    fputs( $smtpConnect, base64_encode( $password ) . $newLine );
    $smtpResponse = fgets( $smtpConnect, 515 );
    fputs( $smtpConnect, "HELO $localhost" . $newLine );
    $smtpResponse = fgets( $smtpConnect, 515 );
    fputs( $smtpConnect, "MAIL FROM: $MFrom" . $newLine );
    $smtpResponse = fgets( $smtpConnect, 515 );
    fputs( $smtpConnect, "RCPT TO: $MTo" . $newLine );
    $smtpResponse = fgets( $smtpConnect, 515 );
    fputs( $smtpConnect, "DATA" . $newLine );
    $smtpResponse = fgets( $smtpConnect, 515 );
    $headers      = "MIME-Version: 1.0" . $newLine;
    $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;
    $headers .= "To: $MToName <$MTo>" . $newLine;
    $headers .= "From: $MFromName <$MFrom>" . $newLine;
    fputs( $smtpConnect, "To: $MTo\nFrom: $MFrom\nSubject: $MSubject\n$headers\n\n$MMessage\n.\n" );
    $smtpResponse = fgets( $smtpConnect, 515 );
    fputs( $smtpConnect, "QUIT" . $newLine );
    $smtpResponse = fgets( $smtpConnect, 515 );
  }
?>

Kategorien
Windows

Nameserver abfragen in Windows Systemen

Du kannst unter Windows nslookup verwenden um DNS-Einträge abzufragen.

Um nslookup zu starten öffnest Du zuerst den Ausführen Dialog. Drücke gleichzeitig die Tasten [⊞ Win] + [R]. Es erscheint ein Eingabefeld „Öffnen“. Gib den Programmnamen ‚nslookup‚, ’nslookup.exe‘ oder ‚C:\Windows\System32\ nslookup.exe‘ ein. Schließe die Eingabe mit dem drücken der Taste [enter] oder dem Klick auf den Knopf [OK] ab.

Es erscheint der nslookup-Dialog mit folgenden Ausgabe:

Standardserver: google-public-dns-a.google.com
Address: 8.8.8.8

> _

Du hast direkt die Möglichkeit mit der Eingabe einer Domain, in der beim nslookup Aufruf erschienenen Shell, die A- und die AAAA-Records der eingegebenen Domain abzufragen.:

> loteks.de
Standardserver:  google-public-dns-a.google.com
Address:  8.8.8.8

Nicht autorisierende Antwort:
Name:    loteks.de
Address:  178.254.44.129

> google.de
Standardserver:  google-public-dns-a.google.com
Address:  8.8.8.8

Nicht autorisierende Antwort:
Name:    google.de
Addresses:  2a00:1450:400e:80b::2003
          172.217.17.67

Du kannst mit der Eingabe einer IP-Adresse in dieser nslookup-Shell auch den PTR Record zu der eingegebenen IP-Adresse anzeigen lassen.:

> 178.254.44.129
Server:  google-public-dns-a.google.com
Address:  8.8.8.8

Name:    s01.angststalt.de
Address:  178.254.44.129

Mit Eingabe von „server IP-ADRESSE“ kann in den folgenden Anfragen auch ein anderer Nameserver angefragt werden. Beispielsweise kann mit der Eingabe von „server 85.214.20.141“ der Nameserver des digitalcourage e.V. verwendet werden.
Alternativ kann bei der Anfrage des A-Records für die Domain auch der Nameserver als zweite Option übergeben werden „Domain Nameserver„.

Um andere DNS-Einträge als den A- bzw. AAAA-Record zu erfragen kann vor der Frage am nslookup mittels „set querytype=“ oder kürzer „set q=“ der zu liefernde Record übergeben werden:

Die interessanten Optionen für q= habe ich in der folgenden Tabelle hinterlegt:

A, ANY
fragt den A und AAAA Record ab (default option)
TXTTXT-Record abfragen (z.B. SPF und Domainkey)
SOASpecifies the start-of-authority for a DNS zone.
PTR
Specifies a computer name if the query is an IP address
MX
Specifies the mail exchanger
NS
Specifies a DNS name server for the named zone
CNAME
Specifies a canonical name for an alias.

Bei einer entsprechenden Abfrage des MX-Records ergibt sich die folgende Ausgabe im nslookup Dialog.:

> set q=mx
> loteks.de
Server:  [8.8.8.8]
Address:  8.8.8.8

Nicht autorisierende Antwort:
loteks.de       MX preference = 100, mail exchanger = s01.angststalt.de

Sollte bei einer Abfrage verboten werden sollen das der nameserver andere Nameserver befragt kann mittels „set norecurse“ die Anfrage auf den aktuell angegebenen Nameserver begrenzt werden. Diese Limitierung kann mittels „set recurse“ wieder aufgehoben werden.

Kategorien
Linux Postfix

Postfix: Zugriff von bestimmten IP-Adressen blockieren

Es gibt immer wieder EMail-Versender die mir mit ihren Spam EMails gewaltig auf die Nerven gehen. Die Absender geben an, das es sich um einen Newsletter handelt, jedoch bewirkt ein abbestellen des Newsletters nur das noch mehr „Newsletter“ zugestellt werden.

Da diese Newsletter bei mir immer von der gleichen IP-Adresse kommen habe ich mir einen gängigen Weg gesucht die Kommunikation mit dieser Adresse vollständig zu unterbinden.

1. IP-Adresse ermitteln

Im EMail-Header ist die gesuchte IP-Adresse die erste vorkommende IP-Adresse die nicht zum eigenen Server gehört.
In meinem Beispiel-EMail-Header ist es die IP-Adresse 192.0.2.85.
(Keine Sorge, der gesammte EMail-Header ist made up, er sieht nur möglichst echt aus. Die IP-Adressen sind IP-Adressen die laut RFC zu Dokumentationszwecken bestimmt sind.)

Return-Path: <newsletter@cadbdcedcbfabdadef.de>
Delivered-To: meine-mail@example.org
Received: from mail.example.org
by mail.example.org (Dovecot) with LMTP id NfYUAK7XSFviHAAALzVKdg
for <meine-mail@example.org>; Fri, 13 Jul 2018 18:47:42 +0200
Received: by mail.example.org (Postfix, from userid 114)
id D79F53FE5E; Fri, 13 Jul 2018 18:47:41 +0200 (CEST)
Authentication-Results: mail.example.org;
dkim=pass (1024-bit key; unprotected) header.d=cadbdcedcbfabdadef.de header.i=newsletter@cadbdcedcbfabdadef.de header.b="UKjn3gGF";
dkim-atps=neutral
X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on mail.example.org
X-Spam-Level: *
X-Spam-Status: No, score=1.6 required=5.0 tests=DKIM_SIGNED,DKIM_VALID,
DKIM_VALID_AU,HTML_IMAGE_RATIO_04,HTML_MESSAGE,MIME_HTML_ONLY,URIBL_BLOCKED
autolearn=no autolearn_force=no version=3.4.1
Received: from mta5085.cadbdcedcbfabdadef.com (mta5085.cadbdcedcbfabdadef.com [192.0.2.85])
by mail.example.org (Postfix) with ESMTPS id 669E73FD27
for <meine-mail@example.org>; Fri, 13 Jul 2018 18:47:39 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; s=teneo; d=cadbdcedcbfabdadef.de;
h=MIME-Version:From:To:Reply-To:Date:Subject:Content-Type:Content-Transfer-Encoding:Message-ID; i=newsletter@cadbdcedcbfabdadef.de;
bh=OBg4dbrG8hhFyJR7HMx+3IDg91CCOeaN9fnJCAVA6oE=;
b=UKjn3gGF5j9dxocn0xfFlMVHW+bbvUjere1rI99nga/TVlqu5OQFSOFkwJNUjgklof9Mi/9DIHrf
gafjAml+Onn6z29PSoAid1Rrn+K67B5XxKVk0qrHjSen3jMIf6SPdQRB9rQzvh7uIUAhmyLCVAnC
zbc2RugGh4/eZEvVYu4=
Received: from mta003.example.com (198.51.100.78) by mta5085.cadbdcedcbfabdadef.com id h93bqk1bessq for <meine-mail@example.org>; Fri, 13 Jul 2018 18:47:32 +0200 (envelope-from <newsletter@cadbdcedcbfabdadef.de>)
X-ARF: b98b6becf874558246b684f462613228
Feedback-ID: 5283550-b98b6becf874558246b684f462613228:b98b6becf874558246b684f462613228:newsletter:cadbdcedcbfabdadef
MIME-Version: 1.0
From: "cadbdcedcbfabdadef"<newsletter@cadbdcedcbfabdadef.de>
To: meine-mail@example.org
Reply-To: noreply@cadbdcedcbfabdadef.de
Date: 13 Jul 2018 18:47:32 +0200
Subject: Micro-SD-Karten
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
Message-ID: <0.0.569.CF.1A41AC9425F793A.0@mta5085.cadbdcedcbfabdadef.com>

2. Datei für den Filter erstellen

Um die Datei zu erzeigen benutze ich den Editor vim. Nach dem starten des Editors mittels folgendem Befehl…:

vi /etc/postfix/access_client

…kann mittels Taste [i] der Eingabemodus gesartet werden.

# IP Adresse und IP-Netze die ich blockiere
192.0.2.85 REJECT

Nach der Eingabe kann mittels Taste [ESC] und folgender Eingabe von :wq die Datei geschlossen und gespeichert werden.

Anschließend die Datei mit postmap kompilieren, so das Postfix direkt etwas mit dem Filter anfangen kann.:

postmap hash:/etc/postfix/access_client

Durch diesen Aufruf wird eine Datei access_client.db im Ordner etc/postfix/ angelegt.

3. Postfix konfiguration anpassen

In der Postfix Konfigurationsdatei main.cf muss unsere Datei jetzt noch der Option smtpd_sender_restrictions hinzugefügt werden.
Herzu prüfen ich mittels postconf welche Parameter aktuell für die Option „smtpd_sender_restrictions“ gesetzt sind.:

sudo postconf -p smtpd_sender_restrictions
smtpd_sender_restrictions =

Entsprechend der Ausgabe sind auf meinem Postfix-Server für die „smtpd_sender_restrictions“ keine Optionen gesetzt.

sudo postconf "smtpd_sender_restrictions = check_client_access hash:/etc/postfix/access_client"

Im Anschluss muss, zur Aktivierung der geänderten Konfiguration, der Postfix-Dienst neu geladen werden.:

service postfix reload

Anschließend werden Die Zustellversuche vom Postfix abgelehnt. In den Logiles wird dies entsprechend mit „Client host rejected: Access denied“ vermerkt

Jul 18 10:21:16 server postfix/smtpd[3304]: connect from mta5085.cadbdcedcbfabdadef.com[192.0.2.85]
Jul 18 10:21:16 server postfix/smtpd[3304]: NOQUEUE: reject: RCPT from mta5085.cadbdcedcbfabdadef.com[192.0.2.85]: 554 5.7.1 : Client host rejected: Access denied; from= to= proto=ESMTP helo=
Jul 18 10:21:16 server postfix/smtpd[3304]: disconnect from mta5085.cadbdcedcbfabdadef.com[192.0.2.85] ehlo=2 starttls=1 mail=1 rcpt=0/1 quit=1 commands=5/6
Jul 18 10:26:39 server postfix/anvil[3305]: statistics: max connection rate 1/60s for (smtpd:192.0.2.85) at Jul 18 10:21:16
Jul 18 10:26:39 server postfix/anvil[3305]: statistics: max connection count 1 for (smtpd:192.0.2.85) at Jul 18 10:21:16