Mein eigener Server

Dokumentation meiner Projekte und Hobbies

Postfix & Dovecot

Bebilderte Schritt für Schritt Anleitung zur Installation von Postfix & Dovecot.

Postfix übernimmt das Senden und Empfangen von eMails und Dovecot stellt eine IMAP Schnittstelle für Deinen eMail Client zu Verfügung.

BIND9 für Postfix & Dovecot

Ihr meldet Euch als root am System an bzw. nutzt das su- Kommando um zum root user zu wechseln.

Datei anpassen (Eigene IP Adresse, Domain und aktuelles Datum eintragen): vi /etc/bind/eigener-server.ch.db bzw. vi /chroot/named/etc/bind/eigener-server.ch.db für bind in chroot Umgebung.

          2014082301      ; Serial
                        IN      MX 10   mail.eigener-server.ch.
mail                    IN      A       185.45.132.41

Mit service bind9 restart bind9 neu starten.

Testen mit:

dig eigener-server.ch MX @web001.eigener-server.ch
dig eigener-server.ch MX
dig mail.eigener-server.ch @web001.eigener-server.ch
dig mail.eigener-server.ch

(es kann bis zu einem Tag dauern bis alle DNS Server die neuen Einträge übernommen haben)

fail2ban / iptables für postfix

In Datei prüfen: vi /etc/fail2ban/jail.conf

[postfix]
enabled  = true
port     = smtp,ssmtp

[dovecot]
enabled = true
port    = imap2,imap3,imaps,pop3,pop3s

Mit service fail2ban restart fail2ban neu starten.

SMTP und IMAP freigeben: iptables -A INPUT -p tcp --match multiport --dport smtp,ssmtp,imaps -j ACCEPT

IPtables sichern: iptables-save > /etc/iptables.local

Postfix Installation

postfix_0Zuerst führt Ihr ein apt-get update durch damit das Inhaltsverzeichnis von apt-get auf dem neuesten Stand ist.

postfix_1Mit apt-get install postfix Postfix installieren

postfix_2Installation mit j bestästigen.

postfix_3Mit ok und Enter bestätigen.

postfix_4Internet-Site auswählen und mit Enter bestätigen

postfix_5Domain Name web001.eigner-server.ch eingeben und mit Enter bestätigen

postfix_6wird neu gestartet.

postfix_8Zum testen benötigen wir mailutils apt-get install mailutils

Installation mit j bestästigen.

Postfix Grundkonfiguration

File anpassen: vi /etc/postfix/main.cf

mydestination = eigener-server.ch, localhost

postfix_7Postfix mit service postfix restart neu starten

postfix_10Mit exit zum Login user wechseln falls Ihr im jetzt mit dem root user arbeitet. Falls Ihr Euch mit dem root user angemeldet habt dann bitte mit einem anderen user anmelden.

postfix_11Mail mit mail abrufen. Bei mir sind schon einige vorhanden.

postfix_12Alle Mails löschen mit d*und anschliessend mail mit q verlassen.

postfix_13mail starten um zu prüfen dass alle emails gelöscht sind.

postfix_14email von einem externen email account an den user senden mit dem Ihr euch anmeldet (user@eigener-server.ch). Es erscheint eine Nachricht wenn die mail eintrifft.

postfix_15Mit mail könnt Ihr prüfen ob dies die email ist die Ihr vom externen account gesendet habt.

Dovecot Installation

Ihr meldet Euch wieder als root am System an bzw. nutzt das su- Kommando um zum root user zu wechseln.

dovecot_1Mit apt-get install dovecot-core dovecot-imapd dovecot-pop3d Dovecot installieren.

Dovecot Grundkonfiguration

File anpassen: vi /etc/dovecot/conf.d/10-logging.conf

log_path = /var/log/mail.log

File anpassen: vi /etc/dovecot/conf.d/10-mail.conf

mail_location = mbox:~/mail:INBOX=/var/mail/%u
mail_privileged_group = mail

File anpassen: vi /etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = no

File sollte nur diesen Eintrag haben: vi /etc/pam.d/dovecot (andere mit # deaktivieren)

auth required pam_unix.so nullok account required pam_unix.so

Mit service dovecot restart Dovecot neu starten.

Zum test von imap folgendes testweise freischalten: iptables -A INPUT -p tcp --match multiport --dport imap -j ACCEPT

dovecot_2Mit telnet mail.eigener-server imap Dovecot von einem PC oder anderen Server testen.

dovecot_3Server meldet sich. Jetzt könnt Ihr Euch mit einem user und Passwort anmelden. Ist allerdings nicht verschlüsselt.

IPtables Eintrag wieder entfernen: iptables -D INPUT -p tcp --match multiport --dport imap -j ACCEPT

Virtuelle Nutzer und Gruppen für Dovecot und Postfix einrichten

Neues File erstellen: vi /etc/postfix/virtual_users_list (Erster Eintrag ist die email Adresse, der zweite das Verzeichniss)

hostmaster@eigener-server.ch eigener-server.ch/hostmaster/ 
wordpress@eigener-server.ch eigener-server.ch/wordpress/

Neues File erstellen: vi /etc/dovecot/users

hostmaster@eigener-server.ch:{Plain}passwort123
wordpress@eigener-server.ch:{Plain}passwort345

Postfix Konfig File anpassen anpassen: vi /etc/postfix/main.cf

mydestination = localhost

Einträge zu Postfix Konfig File hinzufügen: vi /etc/postfix/main.cf

#Virtual domains
virtual_mailbox_domains = eigener-server.ch, web001, web001.eigener-server.ch, localhost.eigener-server.ch
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/virtual_users_list
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

Neue User an Postfix übergeben mit postmap /etc/postfix/virtual_users_list

Neuen User und neue Gruppe erstellen:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail

Verzeichnisse erstellen und Rechte anpassen:

mkdir /var/mail
mkdir /var/mail/vhosts
mkdir /var/mail/vhosts/eigener-server.ch/
mkdir /var/mail/vhosts/eigener-server.ch/hostmaster 
mkdir /var/mail/vhosts/eigener-server.ch/wordpress
chown -R vmail:vmail /var/mail

Mit service postfix restart Postfix neu starten.

email von einem externen email account an einen virtuellen User senden (hostmaster@eigener-server.ch).

postfix_16Prüfen ob relay=virtual beim Empfang der email gesetzt wurde mit cat /var/log/mail.log

Dovecot Konfig File anpassen: vi /etc/dovecot/conf.d/10-mail.conf

mail_location = maildir:/var/mail/vhosts/%d/%n

Dovecot Konfig File anpassen: vi /etc/dovecot/conf.d/auth-passwdfile.conf.ext

passdb {
  driver = passwd-file
  args = username_format=%u /etc/dovecot/users
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}

Dovecot Konfig File anpassen: vi /etc/dovecot/conf.d/10-auth.conf

#!include auth-system.conf.ext
!include auth-passwdfile.conf.ext

Mit service dovecot restart Postfix neu starten.

erneut email von einem externen email account an einen virtuellen User senden (hostmaster@eigener-server.ch).

IMAP unverschlüsselt öffnen: iptables -A INPUT -p tcp --match multiport --dport imap -j ACCEPT

dovecot_2Mit telnet mail.eigener-server.ch imap Dovecot testen.

dovecot_4Mit User anmelden: a1 Login hostmaster@eigener-server.ch passwort123 (Falls Ihr putty nutzt kann es sein dass bei der ersten Eingabe eine Fehlermeldung kommt. Dann die Eingabe wiederholen.)

dovecot_5Postfächer ansehen mit a2 list "" "*"

dovecot_6Zum Postfach wechseln: a3 EXAMINE INBOX

dovecot_7email ansehen: a4 FETCH 1 BODY[]

dovecot_8abmelden mit a5 logout

IMAP unverschlüsselt sperren: iptables -D INPUT -p tcp --match multiport --dport imap -j ACCEPT

Dovecot LMTP mit Postfix verbinden

dovecot_9Mit apt-get install dovecot-lmtpd LMTP für Dovecot installieren.

Ändere pder füge hinter der Zeile !include_try /usr/share/dovecot/protocols.d/*.protocol folgende Zeilen hinzu: vi /etc/dovecot/dovecot.conf

protocols = imap pop3 lmtp

Anpassen des Eintrages in der Datei: vi /etc/dovecot/conf.d/10-master.conf

service lmtp {
 unix_listener /var/spool/postfix/private/dovecot-lmtp {
   mode = 0600
   user = postfix
   group = postfix
  }
  # Create inet listener only if you can't use the above UNIX socket
  #inet_listener lmtp {
    # Avoid making LMTP visible for the entire internet
    #address =
    #port =
  #}
}

dovecot_10Mit service dovecot restart Dovecot neu starten.

dovecot_11Prüfen ob die Datei existiert mit ls /var/spool/postfix/private/dovecot-lmtp.

Zeile am Ende der Datei anfügen: vi /etc/postfix/main.cf.

virtual_transport = lmtp:unix:private/dovecot-lmtp

dovecot_12Mit service postfix restart Postfix neu starten.

erneut email von einem externen email account an einen virtuellen User senden (hostmaster@eigener-server.ch).

IMAP unverschlüsselt öffnen: iptables -A INPUT -p tcp --match multiport --dport imap -j ACCEPT

dovecot_2Mit telnet mail.eigener-server.ch imap Dovecot testen.

dovecot_4Mit User anmelden: a1 Login hostmaster@eigener-server.ch passwort123 (Falls Ihr putty nutzt kann es sein dass bei der ersten Eingabe eine Fehlermeldung kommt. Dann die Eingabe wiederholen.)

dovecot_5Postfächer ansehen mit a2 list "" "*"

dovecot_13Zum Postfach wechseln (Anzahl der email prüfen): a3 EXAMINE INBOX

dovecot_14email ansehen (Bitte schauen wie viele emails in der Inbox sind und die letzte anzeigen): a4 FETCH 18 BODY[]

dovecot_8abmelden mit a5 logout

IMAP unverschlüsselt sperren: iptables -D INPUT -p tcp --match multiport --dport imap -j ACCEPT

Dovecot User erlauben über Postfix eMails zu versenden

Einträge in Datei anpassen / Einträge hinzufügen zur Datei: vi /etc/dovecot/conf.d/10-master.conf

service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
    #group =
  }

  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }

  # Postfix smtp-auth
  #unix_listener /var/spool/postfix/private/auth {
  #  mode = 0666
  #}

  # Auth process is run as this user.
  #user = $default_internal_user
}

User in Datei anpassen und # entfernen: vi /etc/dovecot/conf.d/10-master.conf

service auth-worker {
  # Auth worker process is run as root by default, so that it can access
  # /etc/shadow. If this isn't necessary, the user should be changed to
  # $default_internal_user.
  user = vmail
}

dovecot_10Mit service dovecot restart Dovecot neu starten.

Für Postfix folgende Zeilen in der Datei hinzufügen: vi /etc/postfix/main.cf

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

dovecot_12Mit service postfix restart Postfix neu starten.

erneut email von einem externen email account an einen virtuellen User senden (hostmaster@eigener-server.ch).

IMAP unverschlüsselt öffnen: iptables -A INPUT -p tcp --match multiport --dport imap -j ACCEPT

dovecot_2Mit telnet mail.eigener-server.ch imap Dovecot testen.

dovecot_4Mit User anmelden: a1 Login hostmaster@eigener-server.ch passwort123 (Falls Ihr putty nutzt kann es sein dass bei der ersten Eingabe eine Fehlermeldung kommt. Dann die Eingabe wiederholen.)

dovecot_5Postfächer ansehen mit a2 list "" "*"

dovecot_15Zum Postfach wechseln (Anzahl der email prüfen): a3 EXAMINE INBOX

dovecot_16email ansehen (Bitte schauen wie viele emails in der Inbox sind und die letzte anzeigen): a4 FETCH 19 BODY[]

dovecot_8abmelden mit a5 logout

IMAP unverschlüsselt sperren: iptables -D INPUT -p tcp --match multiport --dport imap -j ACCEPT

SSL Verschlüsselung

Verzeichnis Vorbereiten falls es noch nicht existiert:

mkdir  /etc/ssl/my_certs
mkdir  /etc/ssl/my_private
chmod 0444 /etc/ssl/my_certs
chmod 0400 /etc/ssl/my_private

ssl_dovecot_1Key mit openssl genrsa -out /etc/ssl/my_private/dovecot_2014.pem 2048 generieren.

ssl_dovecot_2Zertifikat mit openssl req -new -x509 -nodes -days 1000 -key /etc/ssl/my_private/dovecot_2014.pem -out /etc/ssl/my_certs/dovecot_2014.pem generieren. Eingaben überspringen kann man mit ..

Rechte anpassen:

chmod 0444 /etc/ssl/my_certs/dovecot_2014.pem
chmod 0400 /etc/ssl/my_private/dovecot_2014.pem

ssl_dovecot_3Zertifikat anzeigen und Datum prüfen: openssl x509 -noout -issuer -subject -dates -in /etc/ssl/my_certs/dovecot_2014.pem

Das Zertifikat für Dovecot austauschen: vi /etc/dovecot/conf.d/10-ssl.conf

ssl_cert = </etc/ssl/my_certs/dovecot_2014.pem
ssl_key = </etc/ssl/my_private/dovecot_2014.pem

Eintrag hinzufügen / bzw. anpassen und # entfernen: vi /etc/dovecot/conf.d/10-ssl.conf

ssl = required

Eintrag von no auf yes ändern: vi /etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = yes

Jetzt nur noch Verschlüsselte Ports zulassen (port = 0 deaktiviert imap und pop3): vi /etc/dovecot/conf.d/10-master.conf

service imap-login {
  inet_listener imap {
    #port = 143
    port = 0
  }
...
service pop3-login {
  inet_listener pop3 {
    #port = 110
    port = 0
  }
...

ssl_dovecot_4Aktivieren in dem man Dovecot neu startet mit service dovecot restart.

SMTP Verbindung

Die SMTP Verbindung benötigt Ihr um eMails von Eurem eMail Client zu senden.

Zur Aktivierung der Verschlüsselung folgende Zeilen anpassen/ergänzen: vi /etc/postfix/main.cf

smtpd_tls_cert_file=/etc/ssl/my_certs/dovecot_2014.pem
smtpd_tls_key_file=/etc/ssl/my_private/dovecot_2014.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

Sicherheitskopie vom File erstellen: cp /etc/postfix/master.cf /etc/postfix/master.cf.org

Vor folgenden Zeilen die # entfernen: vi /etc/postfix/master.cf

submission inet n       -       -       -       -       smtpd
smtps     inet  n       -       -       -       -       smtpd

dovecot_12Mit service postfix restart Postfix neu starten.

SSL für IMAP und SMTP testen

Richtet Euren eMail Client auf Eurem PC ein und testet eingehende und ausgehende eMails.

ssl_test_1IMAP Einstellungen. (eingehende eMails)

ssl_test_2Erweiterte IMAP Einstellungen.

ssl_test_3SMTP Einstellungen. (ausgehende eMails)

ssl_test_4Erweiterte SMTP Einstellungen.

ssl_test_5Wenn ein Fehler mit dem Zertifikat angezeigt wird diesen bitte bestätigen.

Sollte es Probleme geben findest Du im Wiki unter der Rubrik Fehlersuche nützliche Infos.

MySql DB für virtual user, alias und Domain

Solltet Ihr den MySql Server noch nicht installiert haben findest Du hier den Beitrag zur Installation.

mail_mysql_1MySql addons installieren mit: apt-get install postfix-mysql dovecot-mysql

mail_mysql_2Als root user an MySql anmelden: mysql -u root -p

mail_mysql_3Datenbank und User erstellen (Bitte Passwort anpassen):

CREATE DATABASE mailserver; 
USE mailserver; 
GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1' IDENTIFIED BY 'PASSWORT';

mail_mysql_4Domain Tabelle anlegen:

CREATE TABLE `virtual_domains` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

mail_mysql_5User Tabelle anlegen:

CREATE TABLE `virtual_users` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `password` varchar(106) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

mail_mysql_6Alias Tabelle anlegen:

CREATE TABLE `virtual_aliases` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `source` varchar(100) NOT NULL,
  `destination` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

mail_mysql_7Domain Eintrag anlegen (bitte Domain Name anpassen):

INSERT INTO `mailserver`.`virtual_domains`
  (`name`)
VALUES
  ('eigener-server.ch');

mail_mysql_8User anlegen (bitte Passwort und eMail anpassen):

INSERT INTO `mailserver`.`virtual_users`
  (`domain_id`, `password` , `email`)
VALUES
  ('1', ENCRYPT('USER_PASSWORT', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'hostmaster@eigener-server.ch');

mail_mysql_9Alias anlegen (bitte email anpassen):

INSERT INTO `mailserver`.`virtual_aliases`
  (`domain_id`, `source`, `destination`)
VALUES
  ('1', 'webmaster@eigener-server.ch', 'hostmaster@eigener-server.ch');

mail_mysql_10quit

Einträge in der Datei anpassen: vi /etc/postfix/main.cf

virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

Einträge in der Datei hinzufügen: vi /etc/postfix/main.cf

virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Neue Datei anlegen (Passwort anpassen): vi /etc/postfix/mysql-virtual-mailbox-domains.cf

user = mailuser
password = PASSWORT
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'

Neue Datei anlegen (Passwort anpassen): vi /etc/postfix/mysql-virtual-mailbox-maps.cf

user = mailuser
password = PASSWORT
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'

Neue Datei anlegen (Passwort anpassen): vi /etc/postfix/mysql-virtual-alias-maps.cf

user = mailuser
password = PASSWORT
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'

mail_mysql_11Domain testen mit postmap -q eigener-Server.ch mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf (Domain anpassen). Rückgabewert = 1.

mail_mysql_12eMail testen mit postmap -q hostmaster@eigener-server.ch mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf (Domain anpassen). Rückgabewert = 1.

mail_mysql_13Alias testen mit postmap -q webmaster@eigener-server.ch mysql:/etc/postfix/mysql-virtual-alias-maps.cf (Domain anpassen). Rückgabewert = hostmaster@eigener-server.ch.

mail_mysql_14Postfix neu starten mit service postfix restart.

Eintrag kontrollieren: vi /etc/dovecot/conf.d/auth-sql.conf.ext

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

Anpassen der Datei (Passwort anpassen): vi /etc/dovecot/dovecot-sql.conf.ext

driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=PASSWORT
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

Die # vor dem Eintrag entfernen: vi /etc/dovecot/conf.d/10-auth.conf

!include auth-sql.conf.ext

Rechte anpassen:

chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot

Anpassen der Datei: vi /etc/dovecot/conf.d/10-master.conf

service auth {
  # Auth process is run as this user.
  user = dovecot
}

mail_mysql_15Dovecot neu starten mit service dovecot restart

Hier endet die geführte Tour. Im Wiki gibt es weitere Interessante Beiträge zum Thema Backup, Einrichtung neuer eMail user, neue Webseiten und Domains, Owncloud, Roundcube, Piwik, Piwigo, SEO und vieles mehr. Das Wiki wird regelmässig erweitert. Tragt Euch bei mir ein damit Ihr über neue Beiträge informiert werdet oder schaut regelmässig vorbei.