Mailserver auf Debian Jessie

Wir haben uns in unserer Multi-Gaming.Community Daddeltreff nach langer Zeit einen neuen Server gegönnt. Aus Kostengründen haben wir uns gegen einen Windows-Server (20 € Aufpreis monatlich) entschieden und sind wieder zurück zu einem Linux-Server gegangen. Entschieden haben wir uns für Debian 8.0 Jessie als Betriebsystem, hier gab es vom Server-Hoster Server4you allerdings zum Zeitpunkt der Installation nur ein Image in der Minimal-Version, also ein Linux wo noch alle benötigten Dienste nachinstalliert werden müssen.

Nach der Installation und Konfiguration des Webservers auf Basis von Apache 2 mit allen benötigten Komponenten ging es dann an einen Mailserver. Nach einiger Suche im Netz bin ich dann auf eine gute Anleitung gestossen, die eine Installation auf Debian Jessie sehr gut und ausführlich erklärt hat. Lediglich der verwendete Webserver war ein anderer. Dank der Kommentare zu dem Artikel war es aber auch kein Problem, die Anleitung mit dem von mir verwendeten Apache 2 umzusetzen.
Hier der Link zur sehr guten Anleitung: https://www.debinux.de/2015/05/mailserver-from-scratch-debian-8/

An dieser Stelle fasse ich die Schritte mit dem Webserver Apache2 nochmal zusammen, um anderen und vor allem mir eine Installation in Zukunft zu erleichtern.

Grundkonfiguration

Nach der Installation von Debaian Jessie, sollte erstmal kontrolliert werden, ob die Grundkonfiguration stimmt.

timedatectl set-timezone Europe/Berlin
hostnamectl set-hostname mail.domain.tld<

Falls die obigen Befehle zu einem Fehler ("Failed to create bus connection: No such file or directory") führen, dann muss noch dbus nachinsatlliert werden:

apt-get update && apt-get install -y dbus

Als Hostname sollte ein FQDN verwendet werden, der sich aus Hostname und Dömane zusammensetzt. domain.tld alleine ist kein Hostname.

In der Datei /etc/hosts sollten mindestens folgende Einträge zu finden sein:

127.0.0.1 localhost
1.2.3.4 mail.domain.tld mail
# ...

Webserver

Falls noch nicht geschehen, werden jetzt die benötigten Komponenten für den Webserver installiert und konfiguriert:

  • Apache2
  • PHP
  • MySQL
apt-get -y install apache2  apache2-mpm-prefork libapache2-mod-php5 php-auth-sasl php-http-request php-mail php-mail-mime php-mail-mimedecode php-net-dime php-net-smtp php-net-socket php-net-url php-pear php-soap php5 php5-cli php5-common php5-curl php5-fpm php5-gd php5-imap php-apc php5-intl php5-mcrypt php5-mysql libawl-php php5-xmlrpc mysql-client mysql-server ca-certificates

Die Mailboxverwaltung sollte verschlüsselt erfolgen, dazu wird vorab ein selbst-signiertes Zertifikat in /etc/ssl/ erstellte, dass den Namen der FQDN trägt:

openssl req -new -newkey rsa:4096 -sha256 -days 1095 -nodes -x509 -subj "/C=DE/ST=STATE/L=CITY/O=MAIL/CN=`hostname -f`" -keyout /etc/ssl/`hostname -f`.key  -out /etc/ssl/`hostname -f`.cer

Anschliessend wird das Zertifikat noch vor unberechtigten Zugriffen geschützt:

chmod 600 /etc/ssl/`hostname -f`.key

Bei einem selbstsignierten Zertifikat dann noch folgendes ausführen:

cp /etc/ssl/`hostname -f`.cer /usr/local/share/ca-certificates/
update-ca-certificates

In der php.ini muss eine kleine Änderung durchgeführt werden, damit PHP auch die richitge Zeitzone kennt:

nano /etc/php5/apache2/php.ini

Eine Zeile wird angepasst:

date.timezone = Europe/Berlin

Im Anschluss muss der Dienst noch neu geladen werden:

systemctl reload php5-fpm.service

Im Webserver Apache2 müssen noch einige Module aktiviert werden:

a2enmod ssl
a2enmod rewrite
a2enmod php5

Jetzt kann ein neuer vHost erstellt werden:

nano /etc/apache2/sites-available/mail.domain.tld
<VirtualHost *:80>
  ServerName mail.domain.tld
  Redirect permanent / https://mail.domain.tld/
</VirtualHost>

<VirtualHost *:443>
  SSLEngine on
  SSLCertificateFile /etc/ssl/mail.domain.tld.crt
  SSLCertificateKeyFile /etc/ssl/mail.domain.tld.key
  # Intermediate Zertifikat
  # SSLCertificateChainFile /etc/ssl/sub.class1.server.sha2.ca.pem
  # Root Zertifikat
  # SSLCACertificateFile /etc/ssl/ca.pem

  ServerName mail.domain.tld
  CustomLog ${APACHE_LOG_DIR}/mail.domain.tld_access.log combined
  ErrorLog ${APACHE_LOG_DIR}/mail.domain.tld_error.log
  DocumentRoot /var/www/html

  HostnameLookups Off
  UseCanonicalName Off
  ServerSignature Off
  Header always set Strict-Transport-Security "max-age=10886400"

  <Directory "/var/www/html">
    SSLRequireSSL
    Options FollowSymLinks
    AllowOverride FileInfo Indexes Limit

    Require all granted
    DirectoryIndex index.php index.html index.htm
  </Directory>
</VirtualHost>

Im Anschluß sind noch unsichere Verschlüsselungsmethoden in der Datei /etc/apache2/mods-enabled/ssl.conf zu deaktivieren. Dazu muss in der Datei folgendes am Ende, aber vor hinzugefügt werden:

SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:DES-CBC3-SHA:!ECDHE-RSA-DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!LOW:!MD5:!EXP:!PSK:!SRP:!DSS
SSLHonorCipherOrder on
SSLProtocol ALL -SSLv2 -SSLv3

Abschliessend wird der vHost noch aktiviert und der Dienst neu gestartet:

a2ensite mail.domain.tld
systemctl reload apache2.service

Im nächsten Schritt werden zwei Datenbanken angelegt. Dabei wird jweils ein Benutzer das Recht erhalten, in der Datenbank zu arbeiten. In beiden Befehlen changeme bitte durch ein sicheres Kennwort ersetzen!

# ViMbAdmin: Datenbankname vimbadmin, Username vimbadmin
mysql --defaults-file=/etc/mysql/debian.cnf -e "CREATE DATABASE vimbadmin; GRANT ALL ON vimbadmin.* TO 'vimbadmin'@'localhost' IDENTIFIED BY 'changeme'; FLUSH PRIVILEGES;"
# Roundcube: Datenbankname roundcube, Username roundcube
mysql --defaults-file=/etc/mysql/debian.cnf -e "CREATE DATABASE roundcube; GRANT ALL ON roundcube.* TO 'roundcube'@'localhost' IDENTIFIED BY 'changeme'; FLUSH PRIVILEGES;

Webanwendungen

Nachdem der Webserver vorbereitet wurde, können nun die benötigten Webanwendungen installiert werden.

Zunächst werden die Abhängigkeiten installiert. Mit cURL wird in einem späterer der PHP-Composer heruntergeladen, git ist eine direkte Abhängigkeit dessen:

apt-get install -y git curl

Nun wird Roundcube runtergeladen und entpacket, anschliessen wird der Ordner in webmail umbenannt:

cd /var/www/html
wget --content-disposition -O - http://sourceforge.net/projects/roundcubemail/files/latest/download | tar xfvz -
mv roundcubemail-* webmail

Für Roundcube muss noch eine Konfigurationsdatei angelegt werden:

nano /var/www/html/webmail/config/config.inc.php

Hier wird folgender Inhalt, wobei die Werte für db_dsnw, default_host und smtp_server noch angepasst werden müssen, reinkopiert:

<?php $config = array(); $config['db_dsnw'] = 'mysql://roundcube:changeme@localhost/roundcube'; /* Auch lokal wird mit TLS gearbeitet (Stichwort: Sniffer) Der FQDN sollte "localhost" vorgezogen werden (Zertifikatsvalidierung) */ $config['default_host'] = 'tls://mail.domain.tld'; $config['smtp_server'] = 'tls://mail.domain.tld'; $config['smtp_port'] = 587; $config['smtp_user'] = '%u'; $config['smtp_pass'] = '%p'; $config['support_url'] = ''; $config['product_name'] = $_SERVER['HTTP_HOST']; /* Roundcube erhält die Möglichkeit, ACLs und Sieve Filter durch Plugins zu verwalten. */ $config['plugins'] = array( 'acl', 'managesieve', ); $config['login_autocomplete'] = 2; $config['imap_cache'] = 'apc'; $config['username_domain'] = '%d'; $config['default_list_mode'] = 'threads'; $config['preview_pane'] = true; /* Da ein selbst-signiertes Zertifikat verwendet wird, gestaltet sich die Zertifikatsvalidierung weniger restriktiv */ $config['imap_conn_options'] = array( 'ssl' => array(
      'allow_self_signed' => true,
      'verify_peer'       => false,
      'verify_peer_name'  => false,
    ),
);
$config['smtp_conn_options'] = array(
   'ssl'         => array(
      'allow_self_signed' => true,
      'verify_peer'       => false,
      'verify_peer_name'  => false,
   ),
);

Im nächsten Schritt muss die Datenbank initialisiert werden:

mysql --defaults-file=/etc/mysql/debian.cnf roundcube < /var/www/html/webmail/SQL/mysql.initial.sql

Damit es keine Zugriffsprobleme gibt, muss das Verzeichniss rekursiv auf den Benutzer www-data gesetzt werden:

chown -R www-data: /var/www/html

Nun wird ViMbAdmin mit dem PHP Composer installiert.
Vorab muss der Composer installiert werden, die ausführbahre Datei composer.phar wird nach /usr/local/bin/ verschoben:

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

Anschliessend wird die Installation von ViMbAdmin gestartet:

composer create-project opensolutions/vimbadmin /srv/vimbadmin -s dev -n --keep-vcs

Nach der Installation müssen die noch die Rechte von Unterverzeichnissen an den Webserver angepasst werden:

chown -R www-data: /srv/vimbadmin/{public,var}

Zuletzt wird eine symbolische Verknüpfung angelegt, um mit dem Browser später die Weboberfläche via URL https://mail.domain.tld/admin zu erreichen:

ln -s /srv/vimbadmin/public/ /var/www/html/admin

ViMbAdmin bringt bereits eine Beispiel-Konfiguration mit, an der man sich orientieren kann:

cp /srv/vimbadmin/application/configs/application.ini.dist /srv/vimbadmin/application/configs/application.ini
nano /srv/vimbadmin/application/configs/application.ini

Hier sind die wichtigsten Punkte zusammengefasst, die geändert werden müssen:

;; Die sontigen MySQL-Parameter wie Datenbankname und Benutzer (vimbadmin) stimmen bereits überein, daher brauche ich nur noch das Kennwort durch das vorab festgelegte zu ersetzen
resources.doctrine2.connection.options.password = 'changeme'
;; Entspricht dem späteren vmail-Benutzer, dem stellvertretend alle Mailverzeichnisse "gehören"
defaults.mailbox.uid = 5000
defaults.mailbox.gid = 5000
;; Das Maildir wird im Dovecot-Format festgehalten
defaults.mailbox.maildir = "maildir:/var/vmail/%d/%u/Maildir:LAYOUT=fs"
defaults.mailbox.homedir = "/var/vmail/%d/%u"
;; Einige Details, der Transport sollte per Standard lmtps sein, mit Zeiger auf den passenden Socket
defaults.domain.transport = "lmtps:unix:private/dovecot-lmtp"
;; Erlaubt das endgültige Löschen von Mailboxen vom Dateisystem
mailbox_deletion_fs_enabled = true
;; Den stärksten Hash-Algorithmus bietet Dovecot durch "doveadm"
defaults.mailbox.password_scheme = "dovecot:SHA512-CRYPT"
defaults.mailbox.dovecot_pw_binary = "/usr/bin/doveadm pw"
;; Hierbei handelt es sich um die Informationen der Willkommensmail.
;; "mail.%d" (= "mail.domain.tld") trifft für diesen Artikel zu, sollte dem eigenen Hostnamen nach angepasst werden.
server.smtp.host    = "mail.%d"
server.smtp.port    = "587"
server.smtp.crypt   = "TLS"
;; POP3 wird in diesem Artikel nicht verwendet/konfiguriert
server.pop3.enabled = 0
;; Wieder verwende ich "mail.%d"
server.imap.host  = "mail.%d"
server.imap.port  = "143"
server.imap.crypt = "TLS"
;; Der Webmailer Roundcube ist unter URL/webmail 
server.webmail.host  = "https://mail.%d/webmail"

Jetzt wird noch ein Archiv-Verzeichniss erstellt:

mkdir /srv/archives

ViMbAdmin benötigt noch eine .htaccess-Datei, auch hier bringt die Installation bereits eine brauchbare Beispiel-Datei mit:

cp /srv/vimbadmin/public/.htaccess.dist /srv/vimbadmin/public/.htaccess

Nun kann die Datenbank eingerichtet werden:

cd /srv/vimbadmin/
./bin/doctrine2-cli.php orm:schema-tool:create

Wenn alles erfolgreich eingerichtet wurde, gibt das Tool folgenden Meldung aus:

ATTENTION: This operation should not be executed in a production environment.
Creating database schema...
Database schema created successfully!

Um letzte Informationen in die Konfigurationsdatei einzufügen, wird die Datei nochmal in einem Editor aufgerufen:

nano /srv/vimbadmin/application/configs/application.ini

Parallel dazu wird wird die URL https://mail.domain.tld/admin im Browser aufgerufen.
Dann wird den Anweisungen nach die fehlenden Informationen in der geöffneten Konfigurations-Datei ergänzt. Nachdem der Administrative Account eingerichtet wurde, ist ViMbAdmin als Webanwendung fertig nistalliert und konfiguriert.

Anschließend wird Cron noch angewiesen, die Archiv- und Löschfiunktion von ViMbAdmin zu automatisieren:

corntab -e

An das Ende der Datei wird eingefügt:

# Die 10. Minute jeder 2. Stunde
10 */2 * * * /srv/vimbadmin/bin/vimbtool.php -a archive.cli-archive-pendings
# Die 30. Minute jeder 2. Stunde
30 */2 * * * /srv/vimbadmin/bin/vimbtool.php -a archive.cli-restore-pendings
# Die 50. Minute jeder 2. Stunde
50 */2 * * * /srv/vimbadmin/bin/vimbtool.php -a archive.cli-delete-pendings
# 3:15 AM
15 3 * * * /srv/vimbadmin/bin/vimbtool.php -a mailbox.cli-delete-pending

Mailserver

Zuerst wird der Dienst Postfix installiert:

apt-get install postfix-mysql postfix-pcre postfix

Während der Installation wird man um den „server configuration type“ gebeten. Da die Konfiguration überschrieben wird, spielt die Auswahl hier keine Rolle.

Zu Beginn wird ein Verzeichniss /etc/postfix/mysql/ erstellt. In diesem Verzeichniss werdem die SQL-Queries gespeichert:

mkdir /etc/postfix/mysql/

In diesem Verzeichniss werden jetzt vier Dateien angelegt:

  • postfix-mysql-virtual_alias_maps.cf
  • postfix-mysql-virtual_domains_maps.cf
  • postfix-mysql-virtual_mailbox_maps.cf
  • postfix-mysql-virtual_transport_maps.cf

In jeder der Dateien wird das Kennwort changeme durch das MySQL-Kennwort des Benutzers der Datenbank „vimbadmin“ ersetzt!

/etc/postfix/mysql/postfix-mysql-virtual_alias_maps.cf

user = vimbadmin
password = changeme
hosts = 127.0.0.1
dbname = vimbadmin
query = SELECT goto FROM alias WHERE address = '%s' AND active = '1'

/etc/postfix/mysql/postfix-mysql-virtual_domains_maps.cf

user = vimbadmin
password = changeme
hosts = 127.0.0.1
dbname = vimbadmin
query = SELECT domain FROM domain WHERE domain = '%s' AND backupmx = '0' AND active = '1'

/etc/postfix/mysql/postfix-mysql-virtual_mailbox_maps.cf

user = vimbadmin
password = changeme
hosts = 127.0.0.1
dbname = vimbadmin
table = mailbox
select_field = maildir
where_field = username

/etc/postfix/mysql/postfix-mysql-virtual_transport_maps.cf

user = vimbadmin
password = changeme
hosts = 127.0.0.1
dbname = vimbadmin
table = domain
select_field = transport
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'

Die Konfigurationsdateien werden wieder vor unbefugten Zugriff gesichert:

chown -R root:postfix /etc/postfix/mysql
chmod 750 /etc/postfix/mysql/
chmod 640 /etc/postfix/mysql/*

Nun wird der Postfix-Server konfiguriert. Dazu wird die bestehende Konfiguration gelöscht und eine neue, leere Datei angelegt:

rm /etc/postfix/main.cf
nano /etc/postfix/main.cf

Hier wird dann die neue Postfix-Konfiguration eingefügt. DIe Angaben für mail.domain.tld muss noch angepasst werden. Unter „mydestination“ darf die Domäne domain.tld nicht aufgeführt sein.

# SMTPd greeting banner: You MUST specify $myhostname at the start of the text. This is required by the SMTP protocol.
smtpd_banner = $myhostname

# Disable local biff service
biff = no

# Do not append the string $mydomain to -locally- submitted email.
append_dot_mydomain = no

# Readme directory
readme_directory = /usr/share/doc/postfix

# HTML directory
html_directory = /usr/share/doc/postfix/html

# Certificates
smtpd_tls_cert_file = /etc/ssl/mail.domain.tld.cer
smtpd_tls_key_file = /etc/ssl/mail.domain.tld.key

# Opportunistic TLS. TLS auth only.
smtpd_tls_security_level=may
smtpd_tls_auth_only=yes

smtpd_tls_exclude_ciphers = aNULL, DES, RC4, MD5
smtpd_tls_mandatory_exclude_ciphers = aNULL, DES, RC4, MD5

# TLS session cache for SMTPd
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

# Disallow SSLv2 and SSLv3, only accept secure ciphers
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_mandatory_ciphers=high

# Log TLS handling
smtpd_tls_loglevel = 1
smtp_tls_loglevel = 1

# Delay reject until RCPT TO
smtpd_delay_reject = yes

# Enable elliptic curve cryptography, "ultra" needs more cpu time
smtpd_tls_eecdh_grade = strong

# Sender, recipient, client and data restrictions
# !! non-FQDN HELOs are rejected on Port 25 only, see master.cf

# Auth. Benutzer dürfen auch innerhalb der "mynetworks" nur von den Adressen senden, die ihnen zugehörig sind.
smtpd_sender_restrictions = reject_authenticated_sender_login_mismatch,
# Erst jetzt werden "mynetworks" zugelassen
# Unauth. Benutzer wie der Cron-Dienst können so weiterhin Mails versenden, etwa
# als cron@fqdn
   permit_mynetworks,
# Anderen unauth. Benutzern das Benutzen jeder Adresse verbieten.
   reject_sender_login_mismatch,
# Alle auth. jetzt zulassen.
   permit_sasl_authenticated,
# Nicht im System vorhandene Absender jetzt ablehnen
   reject_unlisted_sender,
# Ablehnen, wenn die Sender-Domäne nicht existiert
   reject_unknown_sender_domain

# Akzeptiere alle Empfänger, die ein authentifizierter Absender oder ein Absender aus "mynetworks" angibt
smtpd_recipient_restrictions = permit_sasl_authenticated,
   permit_mynetworks,
# Schnittstelle zu Dovecot, um die Quota live zu überprüfen (verhindert Bounces)
   check_policy_service unix:private/quota-status,
# Ablehnen, wenn der HELO FQDN nicht aufzulösen ist
   reject_unknown_helo_hostname,
# Ablehnen, wenn KEIN PTR zu dieser IP existiert
# Verhindert nicht, dass ein FALSCHER PTR abgelehnt wird!
# Hierfür würde "reject_unknown_client_hostname" verwendet.
   reject_unknown_reverse_client_hostname,
# Kein offenes Relay
   reject_unauth_destination

# Unauth. Benutzer dürfen ihre Befehle nicht "pipen"
smtpd_data_restrictions =
   reject_unauth_pipelining,
   permit

# Eine Art Tabelle mit vorhanden Identitäten und ihren Zugehörigkeiten
smtpd_sender_login_maps = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_alias_maps.cf

# Certificates
smtp_tls_cert_file = /etc/ssl/mail.domain.tld.cer
smtp_tls_key_file = /etc/ssl/mail.domain.tld.key

# Opportunistic TLS. Use TLS if this is supported by the remote SMTP server, otherwise use plaintext.
smtp_tls_security_level=may

# TLS session cache for SMTP
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# A custom list with secure ciphers.
tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA

# Use the FQDN for the local hostname!
myhostname = mail.domain.tld

# Alias maps and database for -local- delivery only
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

# The domain name that locally-posted mail appears to come from, and that locally posted mail is delivered to.
myorigin = mail.domain.tld

# The list of domains that are delivered via the -local- mail delivery transport. No external domains like "domain.tld" belong here! "mail.domain.tld" is fine.
mydestination = mail.domain.tld, localhost

# We lookup MX records to send non-local mail, so this stays empty
relayhost =

# Trusted SMTP clients with more privileges. Trusted clients can relay mail.
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

# The maximal size of any -local- individual mailbox
mailbox_size_limit = 0

# The maximal size of any -virtual- individual mailbox
virtual_mailbox_limit = 0

# Handle Postfix-style extensions
recipient_delimiter = +

# The network interface addresses that this mail system receives mail on.
inet_interfaces = all

# Specifies what protocols Postfix will use when it makes or accepts network connections, and also controls what DNS lookups Postfix will use when it makes network connections.
inet_protocols = ipv4

# VRFY command is not really needed anymore
disable_vrfy_command = yes

# Please say hello first...
smtpd_helo_required = yes

# The SASL plug-in type that the Postfix SMTP server should use for authentication.
smtpd_sasl_type=dovecot

# Where to passthrough our authentication information for the above plug-in
smtpd_sasl_path=private/auth_dovecot

# Enable SASL authentication in the Postfix SMTP server.
smtpd_sasl_auth_enable = yes

# Report the SASL authenticated user name in the smtpd Received message header.
smtpd_sasl_authenticated_header = yes

# Have Postfix advertise AUTH support in a non-standard way.
broken_sasl_auth_clients = yes

# The lookup tables that the proxymap server is allowed to access for the read-only service.
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps

## Virtual transport configuration
# A prefix that the virtual delivery agent prepends to all pathname results from $virtual_mailbox_maps
virtual_mailbox_base = /

# THIS contains a list of domains we are the final destination for (unlike "mydestination").
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_domains_maps.cf

# Alias specific mail addresses or domains to other local or remote address.
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_alias_maps.cf

# Specify a left-hand side of "@domain.tld" to match any user in the specified domain
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_mailbox_maps.cf

# The minimum user ID value that the virtual delivery agent accepts
virtual_minimum_uid = 5000

# We use "vmail" user with UID/GID 5000 to lookup tables
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

# The default mail delivery transport and next-hop destination for final delivery to domains listed with "virtual_mailbox_domains"
virtual_transport = lmtps:unix:private/dovecot-lmtp

transport_maps = mysql:/etc/postfix/mysql/postfix-mysql-virtual_transport_maps.cf

## Queue configuration
# Consider a message as undeliverable, when delivery fails with a temporary error, and the time in the queue has reached this limit.
maximal_queue_lifetime = 1d

# Consider a bounce message as undeliverable, when delivery fails with a temporary error, and the time in the queue has reached this limit.
bounce_queue_lifetime = 1d

# The time between deferred queue scans by the queue manager.
queue_run_delay = 300s

# The maximal/minimal time between attempts to deliver a deferred message.
maximal_backoff_time = 1800s
minimal_backoff_time = 300s

# Maximum mail size (500 MiB)
message_size_limit = 524288000

# This tarpits a client after 3 erroneous commands for 10s
smtpd_soft_error_limit = 3
smtpd_error_sleep_time = 10s
smtpd_hard_error_limit = ${stress?1}${stress:5}

postscreen_access_list = permit_mynetworks

# Drop connections from blacklisted servers with a 521 reply
postscreen_blacklist_action = drop

# Clean Postscreen cache after 24h
postscreen_cache_cleanup_interval = 24h

postscreen_dnsbl_ttl = 5m
postscreen_dnsbl_threshold = 8
postscreen_dnsbl_action = enforce
postscreen_dnsbl_sites =
  b.barracudacentral.org=127.0.0.2*7
  dnsbl.inps.de=127.0.0.2*7
  bl.mailspike.net=127.0.0.2*5
  bl.mailspike.net=127.0.0.[10;11;12]*4
  dnsbl.sorbs.net=127.0.0.10*8
  dnsbl.sorbs.net=127.0.0.5*6
  dnsbl.sorbs.net=127.0.0.7*3
  dnsbl.sorbs.net=127.0.0.8*2
  dnsbl.sorbs.net=127.0.0.6*2
  dnsbl.sorbs.net=127.0.0.9*2
  zen.spamhaus.org=127.0.0.[10;11]*8
  zen.spamhaus.org=127.0.0.[4..7]*6
  zen.spamhaus.org=127.0.0.3*4
  zen.spamhaus.org=127.0.0.2*3
  hostkarma.junkemailfilter.com=127.0.0.2*3
  hostkarma.junkemailfilter.com=127.0.0.4*1
  hostkarma.junkemailfilter.com=127.0.1.2*1
  wl.mailspike.net=127.0.0.[18;19;20]*-2
  hostkarma.junkemailfilter.com=127.0.0.1*-2
postscreen_greet_banner = $smtpd_banner
postscreen_greet_action = enforce
postscreen_greet_wait = 3s
postscreen_greet_ttl = 2d
postscreen_bare_newline_enable = no
postscreen_non_smtp_command_enable = no
postscreen_pipelining_enable = no
postscreen_cache_map = proxy:btree:$data_directory/postscreen_cache

Die Dienste, die Postfix bereitstellt, werden in der Datei /etc/postfix/master.cf definiert. Diese Datei wird ebenfalls ersetzt:

rm /etc/postfix/master.cf
nano /etc/postfix/master.cf

Der Inhalt, es muss nichts angepasst werden:

# Postscreen on Port 25/tcp, filters zombies (spam machines) on first level with lowest costs.
smtp      inet  n       -       n       -       1       postscreen

# Postscreen passes sane clients to the real SMTP daemon here.
smtpd      pass  -       -       n       -       -       smtpd
# Reject non-FQDN HELOs on Port 25 (after passing postscreen process)
  -o smtpd_helo_restrictions=permit_mynetworks,reject_non_fqdn_helo_hostname
  -o smtpd_proxy_filter=127.0.0.1:10024
  -o smtpd_client_connection_count_limit=10
  -o smtpd_proxy_options=speed_adjust

# For mail submitting users. Authenticated clients and known networks only.
submission inet n       -       -       -       -       smtpd
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_proxy_filter=127.0.0.1:10025
  -o smtpd_client_connection_count_limit=10
  -o smtpd_proxy_options=speed_adjust

# Handles TLS connections for postscreen to make them readable
tlsproxy  unix  -       -       n       -       0       tlsproxy
# This implements an ad-hoc DNS white/blacklist lookup service
dnsblog   unix  -       -       n       -       0       dnsblog

pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache

# LMTP with STARTTLS support, needs newer Dovecot versions
lmtps     unix  -       -       -       -       -       lmtp
  -o lmtp_use_tls=yes
  -o lmtp_tls_loglevel=1
  -o lmtp_tls_CAfile=/etc/ssl/certs/ca-certificates.crt
  -o lmtp_enforce_tls=yes
  -o lmtp_tls_mandatory_protocols=!SSLv2,!SSLv3
  -o lmtp_tls_protocols=!SSLv2,!SSLv3
  -o lmtp_tls_mandatory_ciphers=high
  -o lmtp_tls_ciphers=high
  -o lmtp_send_xforward_command=yes
  -o lmtp_tls_security_level=encrypt
  -o lmtp_tls_note_starttls_offer=yes

# Amavis reinjection, maximal 5 smtpd Prozesse, muss den Amavis Prozessen entsprechen!
127.0.0.1:10035 inet    n       -       -       -       5       smtpd
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8
  -o smtpd_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o smtpd_data_restrictions=
  -o mynetworks=127.0.0.0/8
  -o receive_override_options=no_unknown_recipient_checks

Dovecot

Die Installation erfolgt aus dem offiziellen Dovecot Repository. Dieser muss noch eingebunden werden:

echo 'deb http://xi.rename-it.nl/debian/ stable-auto/dovecot-2.2 main' > /etc/apt/sources.list.d/dovecot.list
apt-get update -y
apt-get install --force-yes debian-dovecot-auto-keyring
apt-get install dovecot-common dovecot-core dovecot-imapd dovecot-lmtpd dovecot-managesieved dovecot-sieve dovecot-mysql

Für Dovecot wird ein Benutzer „vmail“ mit der UID und GID 5000 mit Homeverzeichniss angelegt:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/vmail
mkdir /var/vmail
chown -R vmail: /var/vmail/

Auch hier wird die bestehende Konfigurationsdatei gelöscht und eine leere angelegt:

rm /etc/dovecot/dovecot.conf
nano /etc/dovecot/dovecot.conf

Im Inhalt müssen neben mail.domain.tld auch die beiden Postmaster-Adressen angepasst werden:

auth_mechanisms = plain login
disable_plaintext_auth = yes
login_log_format_elements = "user=<%u> method=%m rip=%r lip=%l mpid=%e %c %k"
mail_home = /var/vmail/%d/%n
mail_location = maildir:~/Maildir:LAYOUT=fs
mail_uid = vmail
mail_gid = vmail
# notify wird von mail_log benötigt. mail_log informiert in diesem Fall über DELETE und EXPUNGE (weiter unten)
mail_plugins = quota acl mail_log notify
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
ssl_protocols = !SSLv3 !SSLv2
ssl_cipher_list = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
log_timestamp = "%Y-%m-%d %H:%M:%S "
passdb {
  args = /etc/dovecot/dovecot-mysql.conf
  driver = sql
}
# Der "namespace separator" sollte "/" lauten, da es zusammen mit der ACL zu Konflikten käme, wenn der Benutzername das Zeichen "." enthält.
namespace inbox {
  inbox = yes
  location =
  separator = /
  mailbox Trash {
    auto = subscribe
    special_use = \Trash
  }
    mailbox "Deleted Messages" {
      special_use = \Trash
    }
    mailbox "Gelöschte Objekte" {
      special_use = \Trash
    }
    mailbox "Papierkorb" {
      special_use = \Trash
    }
  mailbox Archive {
    auto = subscribe
    special_use = \Archive
  }
    mailbox Archiv {
      special_use = \Archive
    }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
    mailbox "Sent Messages" {
      special_use = \Sent
    }
    mailbox "Gesendet" {
      special_use = \Sent
    }
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
    mailbox Entwürfe {
      special_use = \Drafts
    }
  mailbox Junk {
    auto = subscribe
    special_use = \Junk
  }
  prefix =
}
# Dieser Namespace wird für die ACL Erweiterung benötigt.
# Freigegebene Ordner erscheinen automatisch in der Ordnerliste.
namespace {
    type = shared
    separator = /
    prefix = Shared/%%u/
    location = maildir:%%h/Maildir:LAYOUT=fs:INDEXPVT=~/Maildir/Shared/%%u
    subscriptions = yes
    list = yes
}
protocols = imap sieve lmtp
service dict {
  unix_listener dict {
    mode = 0660
    user = vmail
    group = vmail
  }
}
service auth {
  unix_listener /var/spool/postfix/private/auth_dovecot {
    group = postfix
    mode = 0660
    user = postfix
  }
  unix_listener auth-master {
    mode = 0600
    user = vmail
  }
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }
  user = root
}
service managesieve-login {
  inet_listener sieve {
    port = 4190
  }
  service_count = 1
  process_min_avail = 2
  vsz_limit = 128M
}
service managesieve {
  process_limit = 256
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    group = postfix
    mode = 0600
    user = postfix
  }
  user = vmail
}
listen = *
ssl_cert = </etc/ssl/mail.domain.tld.cer
ssl_key = </etc/ssl/mail.domain.tld.key
userdb {
  args = /etc/dovecot/dovecot-mysql.conf
  driver = sql
}
protocol imap {
  mail_plugins = quota imap_quota imap_acl acl mail_log notify
}
protocol lmtp {
  mail_plugins = quota sieve acl notify
  auth_socket_path = /var/run/dovecot/auth-master
  postmaster_address = postmaster@domain.tld
}
protocol sieve {
  managesieve_logout_format = bytes=%i/%o
}
protocol lda {
  mail_plugins = sieve quota acl notify
  postmaster_address = postmaster@domain.tld
}
plugin {
  mail_log_events = delete undelete expunge
# Um quasi-öffentliche Ordner für authentifizierte Benutzer via ACL zu erstellen
  acl_anyone = allow
# Wird automatisch verwaltet und beinhaltet eine Übersicht der Freigaben
  acl_shared_dict = file:/var/vmail/shared-mailboxes.db
# In jeder Mailbox wird von Dovecot eine Datei gepflegt, die die Freigaben regelt
  acl = vfile
  quota = maildir:User quota
# Die Ordner Trash und Sent erhalten +10% auf die Quota
  quota_rule = Trash:storage=+10%%
  quota_rule = Sent:storage=+10%%
# Eigene Sieve Filter liegen im Heimverzeichnis
  sieve = ~/sieve/dovecot.sieve
  sieve_dir = ~/sieve
# Der globale Filter außerhalb
  sieve_before = /var/vmail/before.sieve
  sieve_max_script_size = 1M
  sieve_quota_max_scripts = 0
  sieve_quota_max_storage = 0
# Auch dann weitermachen, wenn die Quota nicht ermittelt werden kann
# Gilt für den von Dovecot bereitgestellten Postfix policy service
  quota_status_success = DUNNO
  quota_status_nouser = DUNNO
  quota_status_overquota = "552 5.2.2 Mailbox is over quota"
}
service quota-status {
  executable = quota-status -p postfix
  unix_listener /var/spool/postfix/private/quota-status {
   group = postfix
   mode = 0660
   user = postfix
  }
  client_limit = 1
}

Auch Dovecot erhält Anweisungen für den Zugriff auf die MySQL-Datenbank:

nano /etc/dovecot/dovecot-mysql.conf

changeme wieder durch das Passwort des DB-Benutzers vimbadmin ersetzen:

driver = mysql
connect = "host=localhost dbname=vimbadmin user=vimbadmin password=changeme"
default_pass_scheme = SHA512-CRYPT
password_query = SELECT username as user, password as password, \
        homedir AS home, \
        maildir AS mail, uid, gid, \
        concat('*:bytes=', quota) as quota_rule \
        FROM mailbox WHERE username = '%Lu' AND active = '1' \
        AND ( access_restriction = 'ALL' OR LOCATE( '%Us', access_restriction ) > 0 )
user_query = SELECT homedir AS home, \
        maildir AS mail, uid, gid, \
        concat('*:bytes=', quota) as quota_rule \
        FROM mailbox WHERE username = '%u'
iterate_query = SELECT username FROM mailbox;

Auch diese Datei wird vor unberechtigten Zugriff geschützt:

chown root:vmail /etc/dovecot/dovecot-mysql.conf
chmod 640 /etc/dovecot/dovecot-mysql.conf

Die Datei „/var/vmail/before.sieve“ kann als globales Sieve-Script erstellt werden. Mit solch einem Script können zum Beuspiel Junk-Nachrichten automatisiert in den Junk-Ordner verschoben werden:

require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
  fileinto "Junk";
}

Von einem Client erzeugt Scripte sind sofort lauffähig, das gloabl angelegte Sript muss erst noch kompiliert und berehtigt werden:

# sievec erstellt eine neue Datei before.svbin
sievec /var/vmail/before.sieve
# Beide Dateien möchten wir vmail zuweisen
chown vmail: /var/vmail/before.*

Inhalts-Filter

Sollen auch Anhänge gefiltert werden, die mit Rar gepackt wurden, dann muss das „non-free“ Repository aktiviert werden.

apt-get install zip rar unrar unzip p7zip-full amavisd-new clamav-daemon spamassassin

Zuerst wird der Amavis Filter angepasst. Bitte nur in der Datei „/etc/amavis/conf.d/50-user“ arbeiten, da Änderungen der Datei bestehende Parameter überschreiben.

nano /etc/amavis/conf.d/50-user

Bitte die Vorlage der Datei 50-user gründlich durchlesen und ergänzen/anpassen:

use strict;

# Maximale Anzahl an Prozessen, die Amavis vorhält.
# Siehe auch Anmerkung in master.cf im Listener für Reinjection
$max_servers = 5;

# Amavis wird mitgeteilt, wie auf die MySQL-Datenbank zugegriffen werden kann.
# "changeme" bitte anpassen
@lookup_sql_dsn = (
    ['DBI:mysql:database=vimbadmin;host=127.0.0.1;port=3306',
     'vimbadmin',
     'changeme']);

# Hierdurch ermittelt Amavis die lokalen Domänen
$sql_select_policy = 'SELECT domain FROM domain WHERE CONCAT("@",domain) IN (%k)';

# Ein Listener für die Herkunft "external" sowie "submission"
$inet_socket_port = [10024,10025];

# Mails werden auf Port 10035 zurückgeführt
$forward_method = 'smtp:[127.0.0.1]:10035';
$notify_method  = 'smtp:[127.0.0.1]:10035';

# Listener :10025 bekommt eine eigene Policy
$interface_policy{'10025'} = 'SUBMISSION';

$policy_bank{'SUBMISSION'} = {
        # Diese Mails kommen von einem vertrauten System
        originating => 1,
        # 7-bit Kodierung erzwingen, damit ein späteres Kodieren die DKIM-Signatur nicht zerstört
        smtpd_discard_ehlo_keywords => ['8BITMIME'],
        # Viren auch von auth. Sendern ablehnen
        final_virus_destiny => D_REJECT,
        final_bad_header_destiny => D_PASS,
        final_spam_destiny => D_PASS,
        terminate_dsn_on_notify_success => 0,
        warnbadhsender => 1,
};

# "mail.domain.tld" bitte anpassen
$myhostname = "mail.domain.tld";

# Wer wird über Viren, Spam und "bad header mails" informiert?
# Den Benutzer "postmaster" bitte nachträglich in ViMbAdmin erstellen (Alias möglich)
$virus_admin = "postmaster\@$mydomain";
$spam_admin = "postmaster\@$mydomain";
$banned_quarantine_to = "postmaster\@$mydomain";
$bad_header_quarantine_to = "postmaster\@$mydomain";

# DKIM kann verifiziert werden.
$enable_dkim_verification = 1;

# AR-Header darf gesetzt werden
$allowed_added_header_fields{lc('Authentication-Results')} = 1;

# DKIM-Signatur
# Gilt nur, wenn "originating = 1", ergo für die SUBMISSION policy bank
# "default" ist hierbei der Selector
# "domain.tld" als Domäne bitte anpassen
# "enable_dkim_signing" nur "1" setzen, wenn Mails wirklich signiert werden sollen.
# "/var/lib/amavis/db/dkim_domain.tld.key" sollte ebenso dem Namen der Domäne angepasst werden.
# Die TTL beträgt im Beispiel 7 Tage
# relaxed/relaxed beschreibt die Header/Body canonicalization, relaxed ist weniger restriktiv

$enable_dkim_signing = 1;
dkim_key('domain.tld', 'default', '/var/lib/amavis/db/dkim_domain.tld.key');
@dkim_signature_options_bysender_maps = (
    { '.' =>
        {
                ttl => 7*24*3600,
                c => 'relaxed/relaxed'
        }
    }
);

# Viren- und Spamfilter ACL; werden automatisch ermittelt
@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

#------------ Do not modify anything below this line -------------
1;  # ensure a defined return

Jetzt wird ein privater Schlüssel für die DKIM-Signatur erstellt. Ein sicherer Schlüssel ist 2048 Bits lang:

amavisd-new genrsa /var/lib/amavis/db/dkim_domain.tld.key 2048

In der Amavis-Konfiguration sollte der Name des Schlüssels /var/lib/amavis/db/dkim_domain.tld.key schon angepasst worden sein.

Nachdem der Schlüssel geschrieben wurde, kann der notwendige Parameter für die DNS-Zone ausgelesen werden:

amavisd-new showkey domain.tld

Die Ausgabe sollte nun dem DNS-Serve zugeführt werden. Wenn der DNS-Server nicht angepasst wird, sollten DKIM-Signaturen vermieden werden.

Einige letzten Anpassungen sind nötig, um Amavis die Verwendung des Virenscanners ClamAV zu erlauben:

# User clamav der Gruppe amavis hinzufügen
adduser clamav amavis
# Gestatte Gruppen, denen clamav zugehört, das Scannen
sed -i 's/AllowSupplementaryGroups false/AllowSupplementaryGroups true/g' /etc/clamav/clamd.conf

Dienste neu starten

Jetzt wird es Zeit, alle Dienste einmal neu zu starten:

systemctl restart {dovecot,postfix,amavis,spamassassin,clamav-daemon,apache2,php5-fpm,mysql}

Jetzt kann man sich das Werk unter https://mail.domain.tld/webmail und https://mail.domain.tld/admin bewundert werden und auch die Funktion des Mailservers testen.

Ich habe versucht, mich hier sehr kurz zu halten, da der Artikel ja eigentlich auf der Seite https://www.debinux.de/2015/05/mailserver-from-scratch-debian-8 zu finden ist. Dort ist alles viel ausführlicher erklärt. An dieser Stelle habe ich das ganze mehr als Anleitung für mich mit dem Apache2-Webserver geschrieben und will diese Anleitung auch anderen zur Verfügung stellen.

Mailserver mit einem Client nutzen

Neben dem Webmailer kann man den Mailserver auch mit einem Client wie Thunderbird benutzen.
Dafür stellt man im Client folgendes ein:

IMAP – Mit STARTTLS auf Port 143, im SSL Wrapper auf Port 993
SMTP – Mit STARTTLS auf Port 587, Port 25 wird als Client bitte nie verwendet.

Über Carsten Heine 42 Artikel
Carsten Heine, Feuerwehrmann asu Überzeugung, begeisterter Geocacher, Hobbyfotograf und Webdesigner.

16 Kommentare

  1. Hey,
    sehr cooles Tutorial.
    Ich habe leider ein Problem mit vimbadmin, für welches ich keine Lösung finde.
    Habe alles so eingerichtet wie du es beschrieben hast kommte auch auf die Seite
    https://mail.domain.tld/admin wenn ich dort jedoch irgend etwas anklicke kommt index.php not found
    Ich habe leider keine Ahnung was falsch sein könnte, weißt du da eventuell etwas?

    Gruß
    Moritz Weichert

    • Hallo Moritz,
      sorry das ich erst jetzt Antworte.
      Ich kann mich dran erinnern, dass ich beim ersten Versuch auch Probleme damit hatte. Wodran es lag, konnte ich mir auch nichr erklären.
      Ich hatte die gesamte Installation nochmal komplett Rückgängig gemacht und habe alles nochmal neu gemacht. Danach ging es auf einmal.
      Ich würde vermuten, das bei dem symbolischen Link etwas falsch ist. Die Daten von vimbadmin sind ja nicht da gespeichert, wo der Apache-Server drauf zugreift.
      Viele Grüße
      Carsten

      • Ich habe das gleiche Problem. Es wird auf admin/auth/login weitergeleitet, wo natürlich die index.php nicht zu finden ist. Wenn man die URL manuell korrigiert, passt alles, nur dass ich plain html angezeigt bekomme, ohne jede Formatierung. Und wenn man auf einen der Links klickt, die im System was machen sollten, wird auch wieder eine fehlende index.php bemängelt…

  2. Da der vimadmin wo anders haust (admin -> /srv/vimbadmin/public/),du mittlerweile den apache2.4 am start haben wirst, gibt es da ein minimales Problem.

    Du musst in der apache2.conf runter scrollen und den teil mit der Directory für /srv/ aktivieren. Vorher verbietet apache2 generell den Zugriff.

  3. Ich bekomme unter Jessie folgenden Fehler:

    v22015051170525156 ~ # a2ensite v22015051170525156.yourvserver.net
    ERROR: Site v22015051170525156.yourvserver.net does not exist!

    Zuvor habe ich wie in der Anleitung beschrieben den Hosteintrag gesetzt:
    127.0.0.1 localhost
    127.0.1.1 kvmimageinstall.yourvserver.net kvmimageinstall
    1.2.3.4 v22015051170525156.yourvserver.net mail

    # The following lines are desirable for IPv6 capable hosts
    ::1 localhost ip6-localhost ip6-loopback
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    37.120.178.34 v22015051170525156.yourvserver.net v22015051170525156

    Und den apt-get install ausgeführt, allerdings den apache ausgelassen, da ich diesen bereits installiert hatte (Webseiten laufen bereits).

    In /etc/apache2/sites-available/v22015051170525156.yourvserver.net habe ich dann folgendes eingetragen:

    ServerName v22015051170525156.yourvserver.net
    Redirect permanent / https://v22015051170525156.yourvserver.net/

    SSLEngine on
    SSLCertificateFile /etc/ssl/v22015051170525156.yourvserver.net.crt
    SSLCertificateKeyFile /etc/ssl/v22015051170525156.yourvserver.net.key
    # Intermediate Zertifikat
    # SSLCertificateChainFile /etc/ssl/sub.class1.server.sha2.ca.pem
    # Root Zertifikat
    # SSLCACertificateFile /etc/ssl/ca.pem

    ServerName mail.domain.tld
    CustomLog ${APACHE_LOG_DIR}/mail.domain.tld_access.log combined
    ErrorLog ${APACHE_LOG_DIR}/mail.domain.tld_error.log
    DocumentRoot /var/www/html

    HostnameLookups Off
    UseCanonicalName Off
    ServerSignature Off
    Header always set Strict-Transport-Security „max-age=10886400“

    SSLRequireSSL
    Options FollowSymLinks
    AllowOverride FileInfo Indexes Limit

    Require all granted
    DirectoryIndex index.php index.html index.htm

    Und natürlich brav auch den Neustart nicht vergessen.

    Wo könnte der Fehler liegen? Ist gar der Domainname unfug?

  4. Guten Morgen.

    Leider scheitere ich schon am anfang des Tutorials.
    Die Befehle:
    * timedatectl set-timezone Europe/Berlin
    * hostnamectl set-hostname mail.domain.tld
    Werden bei mir mit einem Time Out abgebrochen.

    Beim überprüfen der Zeit/Datums mit ‚date‘ wurde mir zumindest die aktuelle Uhrzeit und Datum angezeigt.
    Wodurch ich diesen schritt überspringen und den Hostnamen per Hand ändern wollte. Daher habe ich folgende Dateien editiert:
    * /etc/hostname
    * /etc/host
    * /etc/dhcp/dhcpclient.conf
    Nach einem Neustart der ‚hostname.sh‘, wollte ich natürlich mit ‚hostname -f‘ überprüfen ob der per Hand eingegebene Hostname angenommen wird. Allerdings wird mir, immer noch der Hostname angezeigt, den mir mein Server-Anbieter zugewiesen hat.

    Daher meine Frage:
    Wie kann ich den Server einrichten ohne den Hostnamen in den Systemdateien zu ändern bzw. nur mit einem entsprechenden Eintrag in der ‚/etc/host‘?

    Denn mit dem Tutorial von Nefarius/Högi habe ich es bei Debian Lenny vor etlichen Jahren geschaft. Und musste in den 3 oben genannten Systemdateien nix verändern bzw. nachtragen.

  5. a2ensite is simply a perl script that only works with filenames ending .conf
    rename your file from v22015051170525156.yourvserver.net to v22015051170525156.yourvserver.net.conf and try it again

  6. Danke für das tolle Tutorial, es hat mir bis hier hin wunderbar geholfen. Allerdings liegt „bis hier hin“ noch nicht am Ende, ich komme nur bis zu einem gewissen Punkt:

    Wenn ich domain.de/admin aufrufen will bekomme ich den Fehlercode 404.

    Auch eine extensive Google-Suche hat bis jetzt noch kein brauchbares Ergebnis hervorgebracht. Eine Idee woran das liegen könnte?

    • Siehe mein Kommentar am Ende der Seite:
      Hast du Sonderzeichen wie #$% im Passwort? Dann versuch mal dich lokal via „mysql -u -p“ und dem Passwort einzuloggen. Ging bei mir auch nicht, bis ich das Passwort auf Buchstaben und Zahlen beschränkt habe.

      Gruß

  7. Ich bin in ein paar Fehler reingelaufen, diese konnte ich nun aber beheben:

    – Passwörter mit Sonderzeichen für die Datenbankuser können Fehler verursachen
    – In /srv/vimbadmin/public/.htaccess war der rewrite auf /vimbadmin und nicht auf /admin gesetzt. Hat mich einige graue Haare gekostet
    – Hab statt Symlink einen Alias verwendet, geht aber beides

    Hoffe es hilft jemandem weiter 🙂

  8. Hallo,
    wer es zu kompliziert findet und einen automatischen Installer (bulletproof) das ganze Mailserver system mit allen und drum dran aufsetzen möchte, kann ich iRedMail Community version sehr empfehlen.

1 Trackback / Pingback

  1. [Debian 8] Mailserver konfigurieren: Postfix, Roundcube, ViMbAdmin, Dovecot, Amavis - Yannici's Blog

Antworten

Deine E-Mail-Adresse wird nicht veröffentlicht.


*


Time limit is exhausted. Please reload CAPTCHA.