Zurück  

Mail-Server mit Postfix + Dovecot

Oben Rechts im Proxmox-Frontend auf 'Create CT' klicken um den Container zu erstellen.

bild

bild

bild

bild

bild

bild

bild

bild

bild

ClamAV braucht recht viel Resourcen. 1024M Ram sind Minimum, sonst startet der Dienst gar nicht erst!!
Je nach Mail-Volumen müssen die Resourcen nach oben angepasst werden. Es ist sicher nicht falsch, regelmässig zu überprüfen, ob dieser Container am Limit läuft und gegebenenfalls Korrekturen vorzunehmen.

Netzwerk

Der Mail-Server ist in allen Netzen erreichbar. Also müssen wir noch die weiteren Karten installieren.

eth1 (neu)

bild

eth0 (neu)

bild

Auto-Start

Der Web-Server muss automatisch gestartet werden. Also die entsprechende Option aktivieren.

bild

Grund-Konfiguration

etc/host.OK

Dieser Server ist in einer eigenen Domain!!

Die im CT, nicht die vom Host, also die "/Pool1/subvol-228-disk-1/etc/hosts"

DL
127.0.0.1	localhost
192.168.0.228	mail.local.comasys.ch
62.2.169.228	mail.kunden.email
192.168.99.228	mail.intern.comasys.ch mail
::1		localhost ip6-localhost ip6-loopback
ff02::1		ip6-allnodes
ff02::2		ip6-allrouters

Container Starten

Und gleich mit SSH Auf den Container:

DL
ssh root@192.168.0.228 -p55

Apache

Wir haben im CT für die Dienste bereits einen Apache installiert. Ich verzichte darauf, das hier zu wiederholen, sondern verweise auf die entprechenden Abschnitte beim CT für die Dienste.

Die Installation, der Test und die Konfiguration sind (fast) identisch:
Die ID muss beim Test und der Konfiguration von "220" jeweils auf die des Mail-Servers "228",
und der Servername muss von "dienste" auf "mail" angepasst werden.

Der Mailserver ist jetzt erreichbar unter http://192.168.0.228.

https: aktivieren

Mit "a2enmod ssl" wird SSL aktiviert, und mit "a2ensite default-ssl" aktivieren wir https. Der Apache muss noch mit "service apache2 restart" neu gestartet werden.

Der Mailserver ist jetzt erreichbar unter https://192.168.0.228.

Auch von extern müsste es funktionnieren: https://62.2.169.228.

Vorbereitung

Damit Mail-Anhänge sauber gescannt werden können, brauchen wir noch weitere Entpacker:

DL
apt-get install
 sudo
 arj
 cabextract
 nomarch                  // pkarc
 pax                      // ar,bcpio,tar
 unrar
 rar
 zip
 zoo
 lhasa                    // lha,lzh
 lzop                     // gzip(schnell)
 rpm
 rpm2cpio
 rpm-i18n

PHP brauchen wir auch auch als CLI (für das eine oder andere Script) und zu PHP braucht es auch noch weitere Modules:

DL
apt-get install
 php5
 php5-imap
 php-mail-mime
 php5-intl

MySQL-Datenbank

Auf dem SQL-Server wird eine neue Datenbank angelegt. Bei mir heisst die 'mailserver' mit 'utf8_general_ci'. Der dazugeörige Benutzer heisst auch 'mailserver', hat als host '196.168.%' und alle Rechte auf der neuen Datenbank (bis auf 'Grant').

Postfix

DL
apt-get install
 postfix-mysql

Datenbank

Auf dem SQL-Server mit folgendem Script die Tabellen anlegen:

DL
DROP TABLE IF EXISTS `virtual_access`;
CREATE TABLE IF NOT EXISTS `virtual_access` (
  `id` int(2) NOT NULL AUTO_INCREMENT,
  `amatch` varchar(255) NOT NULL,
  `akey` char(1) NOT NULL,
  `response` varchar(255) NOT NULL,
  `active` tinyint(1) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  `modiby` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `key` (`akey`,`amatch`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1006 ;


DROP TABLE IF EXISTS `virtual_admins`;
CREATE TABLE IF NOT EXISTS `virtual_admins` (
  `domain_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `access` int(1) NOT NULL,
  PRIMARY KEY (`user_id`,`domain_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `virtual_domains`;
CREATE TABLE IF NOT EXISTS `virtual_domains` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `domain` varchar(50) NOT NULL,
  `description` varchar(100) DEFAULT NULL,
  `active` int(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;


DROP TABLE IF EXISTS `virtual_users`;
CREATE TABLE IF NOT EXISTS `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,
  `forward` varchar(100) NOT NULL,
  `fwonly` int(11) NOT NULL DEFAULT '0',
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  `modiby` varchar(100) NOT NULL,
  `active` int(1) NOT NULL DEFAULT '1',
  `isadmin` int(1) NOT NULL,
  `name` varchar(100) NOT NULL,
  `adr1` varchar(100) NOT NULL,
  `adr2` varchar(100) NOT NULL,
  `plzort` varchar(100) NOT NULL,
  `telefon` varchar(100) NOT NULL,
  `mobile` varchar(100) NOT NULL,
  `sosmail` varchar(100) NOT NULL,
  `quota` varchar(10) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  KEY `domain_id` (`domain_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;


ALTER TABLE `virtual_users`
  ADD CONSTRAINT `virtual_users_ibfk_1` FOREIGN KEY (`domain_id`) REFERENCES `virtual_domains` (`id`) ON DELETE CASCADE;

Neue Config-Dateien für Postfix

unter /etc/postfix die folgenden Dateien anlegen:

mysql-client.cf

user = mailserver
password = MailServerPW
hosts = 192.168.99.247
dbname = mailserver
query = SELECT response FROM virtual_access WHERE akey='C' AND amatch='%s' AND active=1

mysql-recipient.cf

user = mailserver
password = MailServerPW
hosts = 192.168.99.247
dbname = mailserver
query = SELECT response FROM virtual_access WHERE akey='R' AND amatch='%s' AND active=1

mysql-sender.cf

user = mailserver
password = MailServerPW
hosts = 192.168.99.247
dbname = mailserver
query = SELECT response FROM virtual_access WHERE akey='S' AND amatch='%s' AND active=1

mysql-domains.cf

user = mailserver
password = MailServerPW
hosts = 192.168.99.247
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE domain='%s' AND active=1

mysql-maps.cf

user = mailserver
password = MailServerPW
hosts = 192.168.99.247
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s' AND fwonly=0 AND active=1

mysql-forward.cf

user = mailserver
password = MailServerPW
hosts = 192.168.99.247
dbname = mailserver
query = SELECT forward FROM virtual_users WHERE email='%s' AND fwonly=1 AND active=1

mysql-user.cf

user = mailserver
password = MailServerPW
hosts = 192.168.99.247
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s' AND fwonly=0 AND active=1

main.cf (ersetzen)

DL
myhostname = mail.kunden.email
myorigin = kunden.email
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
#relayhost =
inet_interfaces = all
recipient_delimiter = +
sender_canonical_maps = hash://etc/postfix/sender_canonical
mailbox_size_limit = 0
inet_protocols = ipv4
#(mailman)alias_maps = hash:/etc/aliases
#(mailman)alias_database = hash:/etc/aliases
transport_maps = hash:/etc/postfix/transport
smtpd_tls_cert_file = /etc/letsencrypt/live/www.kunden.email/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/www.kunden.email/privkey.pem
smtpd_use_tls = yes
# alternativ: smtpd_tls_auth_only = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_helo_required = yes
smtpd_helo_restrictions =
    reject_invalid_helo_hostname,
    permit
smtpd_recipient_restrictions =
    check_recipient_access mysql:/etc/postfix/mysql-recipient.cf,
    permit_sasl_authenticated,
    permit_mynetworks,
    reject_unauth_destination,
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain,
    check_policy_service inet:127.0.0.1:10023,
    permit
smtpd_sender_restrictions =
    check_sender_access mysql:/etc/postfix/mysql-sender.cf,
    reject_unknown_sender_domain,
    reject_non_fqdn_sender,
    permit
smtpd_client_restrictions =
    check_client_access mysql:/etc/postfix/mysql-client.cf,
    reject_rbl_client sbl-xbl.spamhaus.org,
    permit
smtpd_data_restrictions =
    reject_unauth_pipelining,
    permit
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_mailbox_domains = mysql:/etc/postfix/mysql-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-maps.cf
virtual_alias_maps =
    mysql:/etc/postfix/mysql-forward.cf,
    mysql:/etc/postfix/mysql-users.cf
#------------
# amavis
content_filter = smtp-amavis:[127.0.0.1]:10024
# dkim
milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301
# mailman
owner_request_special = no
unknown_local_recipient_reject_code = 550
mailman_destination_recipient_limit = 1
alias_maps = hash:/var/lib/mailman/data/aliases, hash:/etc/aliases
alias_database = hash:/var/lib/mailman/data/aliases, hash:/etc/aliases
relay_domains = listen.kunden.email
virtual_maps = hash:/var/lib/mailman/data/aliases

master.cf (ersetzen)

DL
smtp       inet  n  -  -  -     -  smtpd
submission inet  n  -  -  -     -  smtpd
465        inet  n  -  -  -     -  smtpd
  -o smtpd_tls_wrappermode=Yes
  -o smtpd_sasl_auth_enable=Yes
pickup     fifo  n  -  -  60    1  pickup
  -o content_filter=
  -o receive_override_options=no_header_body_checks
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
maildrop   unix  -  n  n  -     -  pipe
uucp       unix  -  n  n  -     -  pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -  n  n  -     -  pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -  n  n  -     -  pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix - n n - 2  pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}

mailman unix - n n - - pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}

smtp-amavis unix - - - - 2 smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
  -o max_use=20

127.0.0.1:10025 inet n - - - - smtpd
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_delay_reject=no
  -o smtpd_client_restrictions=permit_mynetworks,reject
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o smtpd_data_restrictions=reject_unauth_pipelining
  -o smtpd_end_of_data_restrictions=
  -o mynetworks=127.0.0.0/8
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000
  -o smtpd_client_connection_count_limit=0
  -o smtpd_client_connection_rate_limit=0
  -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

Dovecot

DL
apt-get install
 dovecot-core
 dovecot-imapd
 dovecot-pop3d
 dovecot-lmtpd
 dovecot-mysql
 dovecot-sieve
 dovecot-managesieved

unter /etc/dovecot die folgende Datei ersetzen:

dovecot-sql.conf

driver = mysql
connect = host=192.168.99.247 dbname=mailserver user=mailserver password=MailServerPW
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password, \
  concat('*:bytes=', quota) as userdb_quota_rule \
  FROM virtual_users WHERE email='%u' AND fwonly=0 AND active=1;

groupadd -g 5000 vmail
useradd -g 5000 -u 5000 vmail
mkdir /var/mail/vhosts
chown 5000.5000 /var/mail/vhosts

/etc/dovecot/conf.d/10-master.conf
service auth {
...
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
...
}

../10-mail.conf

Anti-Spam und -Virus

DL
apt-get install
 amavisd-new
 spamassassin
 clamav-daemon
 clamav
 postgrey
 libnet-dns-perl
 libmail-spf-perl
 libdbd-mysql-perl
 pyzor
 razor

Spamassassin muss nicht laufen, Amavis nutzt direkt die Libs von SA. Somit muss SA auch nicht konfiguriert werden.

Aber razor und pyzor müssen aktiviert werden:

su - amavis -s /bin/bash
razor-admin -create
razor-admin -register
pyzor discover
exit

Amavis muss angepasst werden. In der Datei "/etc/amavis/conf.d/15-content_filter_mode"müssen die Zeilen mit "bypass_.." aktiviert werden und dann amavis mit "service amavis restart" neu gestartet werden.

Gruppenzugehörigkeit fehlt:

usermod -a -G clamav amavis
usermod -a -G amavis clamav
service amavis restart
service clamav-daemon restart
postgrey
    /usr/share/postgrey
    -> /etc/postgrey/whitelist*
    -> /etc/default/postgrey

OpenDKIM

DL
apt-get install
 opendkim
 opendkim-tools
 postfix-policyd-spf-python
dns: v=spf1 mx -all
https://www.linode.com/docs/email/postfix/configure-spf-and-dkim-in-postfix-on-debian-8
exept: socket!!

Ref:

RoundCube

http://roundcube.net/download/
https://github.com/roundcube/roundcubemail/wiki/Installation
https://getcomposer.org/download/

/etc/php5/apache2/conf.d
    99-short.ini
    99-timezone.ini

Bind

ToDo: OpenDKIM sollte regelmässig updates im DNS machen. Deshalb ist es am einfachsten, den BIND9 auch auf diesem Server zu installieren.