Oben Rechts im Proxmox-Frontend auf 'Create CT' klicken um den Container zu erstellen.
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.
Der Mail-Server ist in allen Netzen erreichbar. Also müssen wir noch die weiteren Karten installieren.
Der Web-Server muss automatisch gestartet werden. Also die entsprechende Option aktivieren.
Dieser Server ist in einer eigenen Domain!!
Die im CT, nicht die vom Host, also die "/Pool1/subvol-228-disk-1/etc/hosts"
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
Und gleich mit SSH Auf den Container:
ssh root@192.168.0.228 -p55
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.
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.
Damit Mail-Anhänge sauber gescannt werden können, brauchen wir noch weitere Entpacker:
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:
apt-get install php5 php5-imap php-mail-mime php5-intl
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').
apt-get install postfix-mysql
Auf dem SQL-Server mit folgendem Script die Tabellen anlegen:
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;
unter /etc/postfix die folgenden Dateien anlegen:
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
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
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
user = mailserver password = MailServerPW hosts = 192.168.99.247 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE domain='%s' AND active=1
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
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
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
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
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
apt-get install dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-sieve dovecot-managesieved
unter /etc/dovecot die folgende Datei ersetzen:
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
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
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!!
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
ToDo: OpenDKIM sollte regelmässig updates im DNS machen. Deshalb ist es am einfachsten, den BIND9 auch auf diesem Server zu installieren.