Gentoo Logo

Disclaimer : Dit document is niet juist en is niet meer onderhouden.


Virteel Mailhosting Systeem Gids

Inhoud:

1.  Introductie

Voor de meeste Gentoo gebruikers zal een eenvoudige mailclient en fetchmail volstaan. Indien je echter een domein host op je systeem heb je nood aan een volledig geintegreerde MTA (Mail Transfer Agent). En indien je meerdere domeinen host heb je zeker behoefte aan een robuuste oplossing die alle e-mail voor je gebruikers afhandelt. Het systeem dat we hier beschrijven is ontworpen om een elegante oplossing te zijn voor dit probleem.

Een virtueel mailsysteem moet e-mails kunnen afhandelen van verschillende domeinen met verschillende gebruikers langs verschillende interfaces. Dit zorgt voor enkele moeilijkheden die opgelost moeten worden. Wat moet je bijvoorbeeld doen indien er 2 gebruikers zijn van verschillende domeinen met een gelijke gebruikersnaam? Indien je imap-toegang wil geven en via smtp-auth wil werken, hoe combineer je dan de verschillende identiteits verificatiedaemons in een enkelvoudig systeem? Hoe zorg je voor de veiligheid tussen de verschillende componenten op je systeem? Hoe beheer je dit allemaal?

Deze howto zal je tonen hoe je een mailsysteem opstelt dat mails kan afhandelen voor verschillende domeinen, virtuele mailgebruikers ondersteunt die geen shelltoegang moeten hebben, domeinafhankelijke gebruikersnamen ondersteunt, via http, imap, smtp en pop3 kan laten identificeren tegen een enkelvoudige database, gebruik maakt van ssl voor de transportlaag veiligheid, een webinterface aanbiedt, mailinglists ondersteunt voor alle domeinen en onderhouden kan worden via een eenvoudige, centrale MySQL database.

Er zijn verschillende methodes om een virtueel mailhosting systeem op te stellen. Met al die mogelijkheden is het mogelijk dat een andere oplossing een betere keuze is voor jouw situatie. Overweeg het onderzoeken van http://www.qmail.org/ en http://www.exim.org/ om alle mogelijkheden te kennen.

De volgende pakketten worden in deze setup gebruikt: apache, courier-imap, pam_mysql, postfix, mod_php, mod_ssl, phpmyadmin, squirrelmail, cyrus-sasl, mysql, php, en mailman.

Zorg ervoor dat je de volgende USE variabelen in /etc/make.conf activeert alvorens je de pakketten compileert: USE="mysql imap libwww maildir sasl ssl". Anders zal je hoogstwaarschijnlijk de pakketten moeten hercompileren voor welke je ondersteuning vereist van alle protocollen. Verder is het een goed idee om alle andere netwerk-gerelateerde variabelen, zoals ipv6, uit te schakelen.

Belangrijk: Deze howto is geschreven voor postfix versie 2.0.x. Indien je postfix < 2 gebruikt zullen enkele variabelen in dit document anders zijn. Een update is aangeraden. Sommige pakketten in deze howto zijn ook zeer verschillend tussen onderlinge versies. Je wordt aangeraden om de documentatie te lezen die bij de pakketten bijgeleverd wordt indien je problemen tegen komt.

Belangrijk: Dit document gebruikt apache-1.3.x. Apache-2 is als stabiel aangeduid in Portage. Er zijn echter nog steeds enkele problemen met PHP-integratie. Totdat php ondersteuning in apache-2.0.x stabiel is aangeduid zal deze handleiding de 1.3.x versie blijven gebruiken.

Belangrijk: Je moet een domeinnaam hebben om een publieke mailserver te draaien, of toch op zijn minst een MX record voor een domein. Idealiter heb je controle over minstens 2 domeinen om de volledige potentiaal van het virtuele domeinhosting te kunnen benutten.

Belangrijk: Zorg ervoor dat /etc/hostname de juiste hostname van je mailserver bevat. Verifieer of je hostname correct ingesteld is met hostname. Verifieer tevens of er geen conflicten zitten in /etc/hosts.

Nota: Het is aangeraden dat je dit volledige document leest en jezelf vertrouwd maakt met alle stappen alvorens je de installatie begint. Indien je problemen tegenkomt in een van de stappen, bekijk dan de probleemoplosser gids op het eind van dit document. Niet alle gerefereerde pakketten zijn broodnodig, deze setup is zeer flexibel. Indien je bijvoorbeeld geen webinterface nodig hebt, dan mag je gerust de squirrelmail sectie overslaan.

2.  Postfix Basics

Codevoorbeeld 2.1: Installeren van postfix

# emerge postfix

Waarschuwing: Verifieer dat je niet een andere MTA geinstalleerd hebt, zoals ssmtp, exim of qmail, want anders zal je zeker in de problemen komen.

Nadat postfix geinstalleerd is, is het tijd om te configureren. Pas de volgende opties aan in /etc/postfix/main.cf:

Codevoorbeeld 2.2: /etc/postfix/main.cf

myhostname = $host.domain.name
mydomain = $domain.name
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain $mydomain
mynetworks = my.ip.net.work/24, 127.0.0.0/8
home_mailbox = .maildir/
local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10

Pas dan het volgende in /etc/postfix/master.cf aan. Dit zal meer uitvoer geven wat handig is voor het debuggen:

Codevoorbeeld 2.3: /etc/postfix/master.cf

# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (50)
#
==========================================================================
smtp      inet  n       -       n       -       -       smtpd -v
Voeg gewoon -v toe achter de smtpd

Vervolgens pas je /etc/mail/aliases aan en voeg je je lokale aliassen toe. Er moet minstens een alias beschikbaar zijn voor root, zoals root: je@email.adres.

Codevoorbeeld 2.4: Postfix voor de eerste keer opstarten

# /usr/bin/newaliases
Dit zal de nieuwe aliassen aanmaken. Je moet dit enkel doen 
wanneer je aliassen aanmaakt of aanpast.
# /etc/init.d/postfix start

Nu postfix draait probeer je jezelf een mailtje sturen met je favoriete mail programma. Ik gebruik mutt voor al mijn consolemails. Verifieer dat postfix inderdaad de mails afhandelt voor je lokale gebruikers. Eenmaal dat in orde is, is het tijd voor de volgende stappen.

Nota: Ik raad je ten sterkste aan dat je deze configuratie test alvorens je verder gaat.

3.  Courier-imap

Codevoorbeeld 3.1: Installatie courier-imap

# emerge courier-imap

Codevoorbeeld 3.2: Courier-imap configuratie

# cd /etc/courier-imap
Indien je de ssl mogelijkheden van courier-imap of pop3 wenst te
gebruiken moet je certificaten aanmaken voor dit doel.
Dit is aangeraden. Indien je geen ssl wenst, sla dit dan over.
# nano -w pop3d.cnf
# nano -w imapd.cnf
Verander de C, ST, L, CN, en email parameters zodat deze je server
gebruiken
# mkpop3dcert
# mkimapdcert

Codevoorbeeld 3.3: Start de courier-services die je nodig hebt

# /etc/init.d/courier-imapd start
# /etc/init.d/courier-imapd-ssl start
# /etc/init.d/courier-pop3d start
# /etc/init.d/courier-pop3d-ssl start

Start je favoriete mailclient op en verifieer dat alle connecties die je gestart hebt werken om mails te verzenden of te ontvangen. Nu dat deze basis-zaken werken gaan we vanalles en nogwat in 1 trek uitvoeren om de rest van je systeem werkende te krijgen. Nogmaals, verifieer of je configuratie op dit moment werkt.

4.  Cyrus-sasl

Allereerst gaan we cyrus-sasl installeren. Sasl zal de identiteits verificatie afhandelen door de identificatievariabelen aan pam te geven, welke deze informatie zal doorgeven aan mysql om de smtp-gebruikers te kunnen identificeren. Voor deze howto gaan we niet verifieren of sasl werkt of niet totdat mysql draaiende is en een testgebruiker bevat. En dit is eigenlijk geen probleem aangezien we uiteindelijk toch tegen de mysql-database gaan identificeren.

Nota: Nu, om een of andere bizarre reden wil sasl niet goed samenwerken met pam via shadow bestanden. Ik heb al lang zitten zoeken naar een oplossing, zonder resultaat. Indien je weet waarom sasl niet tegen het shadow bestand wil identificeren, gelieve mij (Engels) te e-mailen aangezien ik dolgraag een oplossing hiervoor wil hebben.

Codevoorbeeld 4.1: Configuratie en installatie van de cyrus-sasl ebuild

# USE='-ldap -mysql' emerge cyrus-sasl
We hebben geen ldap en we gaan sasl's mysql-mogelijkheden *niet* gebruiken.

Pas nu /usr/lib/sasl2/smtp.conf aan.

Codevoorbeeld 4.2: sasl starten

# nano -w /usr/lib/sasl2/smtp.conf
pwcheck_method: saslauthd
mech_list: LOGIN PLAIN
Het is belangrijk om de verificatieprocessen die we niet gebruiken
uit te schakelen. Ze zorgen namelijk voor problemen bij sommige
mailclients.
# /etc/init.d/saslauthd start

5.  SSL Certs voor Postfix en Apache

Nu maken we een set ssl-certificaten aan voor postfix en apache.

Codevoorbeeld 5.1: Certificaten aanmaken

# cd /etc/ssl/
# nano -w openssl.cnf
Pas de volgende default waarden aan naar je eigen domein:
countryName_default
stateOrProvinceName_default
localityName_default
0.organizationName_default
commonName_default
emailAddress_default.
Indien de variabelen nog niet aanwezig zijn, voeg ze dan gewoon toe
# cd misc
# nano -w CA.pl
We moeten -nodes toevoegen aan de "create certificate" en
"create certificate request" code opdat onze nieuwe ssl
certificaten geladen kunnen worden zonder paswoord. Anders zal je
geen geldige ssl certificaten meer hebben na reboot.
# create a certificate
system ("$REQ -new -nodes -x509 -keyout newreq.pem -out newreq.pem $DAYS");
# create a certificate request
system ("$REQ -new -nodes -keyout newreq.pem -out newreq.pem $DAYS");
# ./CA.pl -newca
# ./CA.pl -newreq
# ./CA.pl -sign
# cp newcert.pem /etc/postfix
# cp newreq.pem /etc/postfix
# cp demoCA/cacert.pem /etc/postfix
We doen nu hetzelfde voor apache
# openssl req -new > new.cert.csr
# openssl rsa -in privkey.pem -out new.cert.key
# openssl x509 -in new.cert.csr -out new.cert.cert -req -signkey new.cert.key -days 365
Laat de certificaten momenteel staan.
We zullen deze later installeren wanneer Apache geinstalleerd is.

6.  Toevoegen van SSL en SASL support voor Postfix

Pas nu postfix' configuratiebestanden aan zodat het weet van je sasl installatie en ssl mogelijkheden. Voeg de volgende parameters aan het eind van je bestand toe waar je ze later gemakkelijk kan vinden.

Codevoorbeeld 6.1: /etc/postfix/main.cf

# nano -w /etc/postfix/main.cf
smtpd_sasl_auth_enable = yes
smtpd_sasl2_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain =
De broken_sasl_auth_clients optie en login auth methode
zijn enkel voor outlook en outlook express en niet gedocumenteerd.
Is het niet leuk software aan te moeten passen voor het domme, lelijke
kapotte en slecht geprogrammeerde M$ BS?
smtpd_sasl_local_domain voegen een domeinnaam toe aan de clients die
smtp-auth gebruiken. Zorg ervoor dat ze blanko is want anders zullen
hun namen door postfix verandert worden en zullen ze niet kunnen
identificeren.
smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination
smtpd_use_tls = yes
#smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/newreq.pem
smtpd_tls_cert_file = /etc/postfix/newcert.pem
smtpd_tls_CAfile = /etc/postfix/cacert.pem
smtpd_tls_loglevel = 3
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
smtpd_tls_auth_only is uitgecommentarieerd om het testen te
vereenvoudigen
Je kan dit later aanschakelen.

# postfix reload

Nu gaan we de configuratie verifieren.

Codevoorbeeld 6.2: Verifieren van sasl en tls ondersteuning

# telnet localhost 25

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.domain.com ESMTP Postfix
EHLO domain.com
250-mail.domain.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-XVERP
250 8BITMIME
^]
telnet> quit

Verifieer dat de bovenstaande AUTH en STARTTLS regels in je postfix installatie. Zoals ik al zei, op dit moment zal AUTH nog niet werken, aangezien sasl tegen sasldb wil identificeren in plaats van de shadow paswoordfile, welke (sasldb) we niet opgemaakt hebben. Dus gaan we gewoon verder doen en mysql instellen om alle identificatie- en virtuele domeininformatie te bevatten.

7.  MySQL

Nu installeren en configureren we MySQL. Je hebt genericmailsql.sql 's dumpbestand nodig om deze stap tot een goed einde te brengen.

Codevoorbeeld 7.1: Installatie en configuratie van MySQL

# emerge mysql
# /usr/sbin/mysql_install_db
Na dit commando volg je de commando's op het scherm
om mysql's rootpaswoord in te geven,
zijnde verschillend van mysqladmin, want anders is je db wijd open.
# /etc/init.d/mysql start
# mysqladmin -u root -p create mailsql
# mysql -u root -p --opt mailsql < genericmailsql.sql
# mysql -u root -p mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE
   ->     ON mailsql.*
   ->     TO mailsql@localhost
   ->     IDENTIFIED BY '$password';

   ->     quit
Verifieer dat de nieuwe mailsql gebruiker kan verbinden naar de mysql
server.
# mysql -u mailsql -p mailsql

Je nieuwe database heeft default waarden en tabellen opsteld voor twee domeinen. De volgende tabellen zijn bijgeleverd:

  • alias - lokale e-mail en mailmain informatie.
  • relocated - geherloceerde gebruiker e-mailadressen.
  • transport - default mail transport informatie voor alle domeinen die je host
  • users - alle gebruikers hun account-informatie
  • virtual - virtueel domein e-mail aliassen

Codevoorbeeld 7.2: alias table voorbeeld

id   alias    destination
1    root     foo@bar.com
2  postmaster foo@bar.com

Codevoorbeeld 7.3: user table voorbeeld

Regels afgebroken voor de leesbaarheid
id email            clear     name     uid     gid     homedir     \
 maildir                                quota  postfix
10 foo@virt-bar.org $password realname virtid  virtid  /home/vmail \
 /home/vmail/virt-bar.org/foo/.maildir/        y
13 foo@bar.com      $password realname localid localid /home/foo   \
 /home/foo/.maildir/

Codevoorbeeld 7.4: transport table voorbeeld

  id   domain       destination
  1    bar.com      local:
  2    virt-bar.org virtual:

Codevoorbeeld 7.5: virtual table voorbeeld

  id   email            destination
  3   root@virt-bar.org other@email.address

8.  Apache en phpMyAdmin

We stellen nu apache in en voegen een interface toe waarmee hij gemakkelijk met de database kan interageren.

Codevoorbeeld 8.1: Apache en phpmyadmin installeren en configureren

# emerge apache mod_php mod_ssl phpmyadmin

Er zijn verschillende handleidingen beschikbaar over hoe je apache met php installeert. Een daarvan is http://www.linuxguruz.org/z.php?id=31. Er zijn tevens verschillende postings hierover op http://forums.gentoo.org die uitleggen hoe je problemen met de installatie oplost (zoek naar 'apache php'). Dus, met dat gezegd zijnde, ga ik hier niet uitleggen hoe je dat doet. Installeer apache en php, en ga dan verder met deze handleiding. Nu een woordje voor de mensen die opletten: .htaccess de directorie waarin je phpmyadmin installeert. Indien je dat niet doet zullen zoekrobotten langskomen en de pagina indexeren waardoor iedereen je phpmyadmin-pagina via google kan vinden en je database kan aanpassen. Dit is SLECHT! Er zijn verschillende howto's hieromtrent, zoals http://docs.csoft.net/micro/black-htaccess.html.

Nu gaan we de Apache certificaten installeren die we eerder gemaakt hebben. De Apache-SSL opdrachten die je nodig hebt om de certificaten te laten gebruiken zijn:

  • SSLCertificateFile /path/to/certs/new.cert.cert
  • SSLCertificateKeyFile /path/to/certs/new.cert.key

Codevoorbeeld 8.2: Installeer de Apache SSL certificaten

# cp /etc/ssl/misc/new.cert.cert /etc/apache/conf/ssl/
# cp /etc/ssl/misc/new.cert.key /etc/apache/conf/ssl/
# nano -w /etc/apache/conf/vhosts/ssl.default-vhost.conf
Verander de volgende parameters
ServerName host.domain.name
ServerAdmin your@email.address
SSLCertificateFile /etc/apache/conf/ssl/new.cert.cert
SSLCertificateKeyFile /etc/apache/conf/ssl/new.cert.key
# /etc/init.d/apache restart

Nota: Indien je een bestaande apache installatie hebt is het waarschijnlijk dat je een volledige serverreboot zal moeten doen om je nieuwe certificaten te laten gebruiken. Controleer je logs en verifieer of Apache correct herstart werd.

Configureer nu phpMyAdmin.

Codevoorbeeld 8.3: phpMyAdmin configureren

# nano -w /home/httpd/htdocs/phpmyadmin/config.inc.php
Verander de volgende parameters
$cfg['Servers'][$i]['host'] = 'localhost';  // MySQL hostname
$cfg['Servers'][$i]['controluser'] = 'mailsql';     // MySQL control user settings
// (this user must have read-only
$cfg['Servers'][$i]['controlpass'] = '$password'; // access to the "mysql/user"
// and "mysql/db" tables)
$cfg['Servers'][$i]['user'] = 'mailsql';       // MySQL user
$cfg['Servers'][$i]['password'] = '$password';  // MySQL password
 

Ga nu naar de phpmyadmin pagina en bezoek de tabellen. Je zal er je eigen lokale aliassen in willen steken, je gebruikertabel aanvullen met een testgebruiker en je transport-table aanpassen zodat ze informatie over jouw domeinen bevat. De default waarden in de dumpfile zouden een voldoende handleiding moeten zijn om te weten welke variabelen waar moeten staan. Zorg ervoor dat de informatie die je in de database steekt accuraat is. Zorg er bijvoorbeeld voor dat de homedirectories van de gebruikers bestaan en een correcte uid/gid waarde hebben. De maildirs worden automatisch aangemaakt wanneer de gebruiker zijn eerste e-mail verkrijgt. Algemeen is het dus een goed idee om een "Welkom" mail te verzenden naar elke nieuwe gebruiker zodat je er zeker van bent dat zijn ~/.maildir aangemaakt wordt.

9.  De vmail gebruiker

Op dit punt vraag je je misschien af welke gebruikers en directories je moet gebruiken voor virtuele mailgebruikers, en dat is maar goed ook. Dus laten we dat eens in elkaar knutselen.

Codevoorbeeld 9.1: De vmail gebruiker aanmaken

# adduser -d /home/vmail -s /bin/false vmail
# uid=`cat /etc/passwd | grep vmail | cut -f 3 -d :`
# groupadd -g $uid vmail
# mkdir /home/vmail
# chown vmail. /home/vmail

Bij het aanmaken van de vmail gebruikeraccount noteer je de uid, gid en homedirectorie. Wanneer we de lokale gebruikeraccounts aanmaken zijn het die uid, gid en homedirectorie die je zal moeten gebruiken. We zouden eigenlijk een php beheerspagina kunnen aanmaken waarin al deze configuratie via een mooie interface gebeurt, maar we zijn daar nog niet aan toegekomen omdat phpmyadmin voor ons meer dan voldoende is.

10.  Configureren van MySQL Identiteits verificatie en vhosts

Nu gaan we de identiteits verificatie aanpassen zodat deze de mailsql database gebruikt voor courier-imap en postfix. In alle volgende voorbeelden vervang je $password met het paswoord dat je ingegeven hebt voor de mailsql mysql-gebruiker.

Codevoorbeeld 10.1: Identiteits verificatie aanpassen

# emerge /usr/portage/sys-libs/pam_mysql/pam_mysql-$currentversion.ebuild
Deze package is momenteel gemaskeerd, dus moet je het volledige pad ingeven
of de package unmasken. Indien de package niet meer gemaskeerd is mag je de 
gewone manier gebruiken (emerge pam_mysql)
# nano -w /etc/pam.d/imap
Commentarieer de bestaande auth-regels uit en voeg er andere aan
toe:
#auth       required     pam_nologin.so
#auth       required     pam_stack.so service=system-auth
#account    required     pam_stack.so service=system-auth
#session    required     pam_stack.so service=system-auth
auth     optional       pam_mysql.so server=localhost db=mailsql user=mailsql \
passwd=$password table=users usercolumn=email passwdcolumn=clear crypt=0
account  required       pam_mysql.so server=localhost db=mailsql user=mailsql \
passwd=$password table=users usercolumn=email passwdcolumn=clear crypt=0
# nano -w /etc/pam.d/pop3
# nano -w /etc/pam.d/smtp
Maak dezelfde aanpassingen in de pop3 en smtp bestanden

Nu moeten we courier's identiteits verificatie configuratie aanpassen.

Codevoorbeeld 10.2: Courier's identiteits verificatie aanpassen

# nano -w /etc/courier-imap/authdaemonrc
authmodulelist="authmysql authpam"

# nano -w /etc/courier-imap/authdaemond.conf
AUTHDAEMOND="authdaemond.mysql"

# nano -w /etc/courier-imap/authmysqlrc
MYSQL_SERVER            localhost
MYSQL_USERNAME          mailsql
MYSQL_PASSWORD          $password
MYSQL_DATABASE          mailsql
MYSQL_USER_TABLE        users
#MYSQL_CRYPT_PWFIELD    crypt (make sure this is commented out since we're storing plaintext)
MYSQL_CLEAR_PWFIELD     clear
MYSQL_UID_FIELD         uid
MYSQL_GID_FIELD         gid
MYSQL_LOGIN_FIELD       email
MYSQL_HOME_FIELD        homedir
MYSQL_NAME_FIELD        name
MYSQL_MAILDIR_FIELD     maildir

# /etc/init.d/authdaemond restart
# /etc/init.d/saslauthd restart

We zijn er bijna! Nu moeten we de rest van de nodige configuraties aanpassen zodat postfix via de database werkt voor al zijn transport-functies.

Codevoorbeeld 10.3: /etc/postfix/mysql-aliases.cf

# nano -w /etc/postfix/mysql-aliases.cf
# mysql-aliases.cf
user          = mailsql
password      = $password
dbname        = mailsql
table         = alias
select_field  = destination
where_field   = alias
hosts         = unix:/var/run/mysqld/mysqld.sock

Codevoorbeeld 10.4: /etc/postfix/mysql-relocated.cf

# nano -w /etc/postfix/mysql-relocated.cf
# mysql-relocated.cf
user          = mailsql
password      = $password
dbname        = mailsql
table         = relocated
select_field  = destination
where_field   = email
hosts         = unix:/var/run/mysqld/mysqld.sock

Codevoorbeeld 10.5: /etc/postfix/mysql-transport.cf (optional)

# nano -w /etc/postfix/mysql-transport.cf
# mysql-transport.cf
user          = mailsql
password      = $password
dbname        = mailsql
table         = transport
select_field  = destination
where_field   = domain
hosts         = unix:/var/run/mysqld/mysqld.sock

Codevoorbeeld 10.6: /etc/postfix/mysql-virtual-gid.cf (optional)

# nano -w /etc/postfix/mysql-virtual-gid.cf
#myql-virtual-gid.cf
user           = mailsql
password        = $password
dbname         = mailsql
table           = users
select_field    = gid
where_field     = email
additional_conditions = and postfix = 'y'
hosts          = unix:/var/run/mysqld/mysqld.sock

Codevoorbeeld 10.7: /etc/postfix/mysql-virtual-maps.cf

# nano -w /etc/postfix/mysql-virtual-maps.cf
#myql-virtual-maps.cf
user         = mailsql
password        = $password
dbname          = mailsql
table           = users
select_field    = maildir
where_field    = email
additional_conditions = and postfix = 'y'
hosts           = unix:/var/run/mysqld/mysqld.sock

Codevoorbeeld 10.8: /etc/postfix/mysql-virtual-uid.cf (optional)

# nano -w /etc/postfix/mysql-virtual-uid.cf
 # mysql-virtual-uid.cf
user            = mailsql
password        = $password
dbname          = mailsql
table           = users
select_field    = uid
where_field     = email
additional_conditions = and postfix = 'y'
hosts           = unix:/var/run/mysqld/mysqld.sock

Codevoorbeeld 10.9: /etc/postfix/mysql-virtual.cf

# nano -w /etc/postfix/mysql-virtual.cf
# mysql-virtual.cf
user          = mailsql
password      = $password
dbname        = mailsql
table         = virtual
select_field  = destination
where_field   = email
hosts         = unix:/var/run/mysqld/mysqld.sock

Pas nu /etc/postfix/main.cf als volgt aan:

Codevoorbeeld 10.10: /etc/postfix/main.cf

# nano -w /etc/postfix/main.cf
alias_maps = mysql:/etc/postfix/mysql-aliases.cf
relocated_maps = mysql:/etc/postfix/mysql-relocated.cf

local_transport = local
local_recipient_maps = $alias_maps $virtual_mailbox_maps unix:passwd.byname

virtual_transport = virtual
virtual_mailbox_domains =
 virt-bar.com,
$other-virtual-domain.com
virtual_minimum_uid = 1000
virtual_gid_maps = static:$vmail-gid
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual.cf
virtual_uid_maps = static:$vmail-uid
virtual_mailbox_base = /
#virtual_mailbox_limit =

Vanaf PostFix versie 2.0.x zijn er verschillende aanpassingen gemaakt ten opzichte van de 1.1.x versie, onder andere zijn de transport, virtual-gid en virtual-uid tabellen niet meer nodig. Ze zijn wel nog steeds beschikbaar indien je deze wenst te gebruiken.

Nota: Het is aangeraden dat je VIRTUAL_README leest die in de postfix documentatie zit indien je meer informatie wenst.

Codevoorbeeld 10.11: postfix herladen

# postfix reload

Indien alles goed ging heb je nu een werkende mailhost. Gebruikers hebben de mogelijkheid te identificeren tegen de sql database via hun volledige e-mailadres, dit zowel met pop3, imap als smtp. Ik raad ten zeerste aan dat je alles verifieert en kijkt of alles werkt. Indien je problemen tegenkomt (wat zeer goed mogelijk is met alle aanpassingen die we gemaakt hebben) controleer dan best de probleemoplosser sectie in deze handleiding.

11.  Squirrelmail

Codevoorbeeld 11.1: squirrelmail installeren

# emerge squirrelmail
Ik leg graag een link naar de htdocs ruimte om een kortere url
te verkrijgen

# ln -s /home/httpd/htdocs/squirrelmail/ /home/httpd/htdocs/mail
# cd /home/httpd/htdocs/mail/conf
# ./conf.pl
Verander je organisatie, server en folderinstellingen voor squirrelmail.
Nu kan je inloggen via squirrelmail via je volledige e-mailadres,
en kan je je nieuwe webmail installatie gebruiken.

12.  Mailman

De laatste stap: mailman. De nieuwe versie van mailman heeft een zeer goede virtuele domeinen-mogelijkheid, welke de reden is waarom ik het graag gebruik, en het is trouwens een prachtige tool. Om deze te installeren en werkende te krijgen hebben we wel nog een beetje nood aan hacking. Ik raad ten zeerste aan om de mailman documentatie te lezen, inclusief README.POSTFIX.gz, om te weten te komen wat we hier doen.

Verder installeren de huidige versies van mailman zich in /usr/local/mailman. Indien je de default locatie wil aanpassen kan je de INSTALLDIR variabele aanpassen.

Codevoorbeeld 12.1: /usr/portage/net-mail/mailman/mailman-$ver.ebuild

# nano -w /usr/portage/net-mail/mailman/mailman-$ver.ebuild
MAILGID="280"
Stel MAILGID in naar de mailman groep ipv nobody
Dit is nodig voor de PostFix integratie

Codevoorbeeld 12.2: mailman installeren

# emerge mailman
Deze package is op dit moment ook gemaskeerd, dus moet je het unmaskenof emerge 
een volledig pad te geven naar de ebuild. Eenmaal geinstalleerd, volg dan de 
aanwijzingen in README.gentoo.gz *behalve* dat je je aliassen
niet in /etc/mail/aliases moet plaatsen. We zullen daarentegen de 
gehele alias db in postfix linken.

# zless /usr/share/doc/mailman-$ver/README.gentoo.gz

Codevoorbeeld 12.3: Defaults instellen: Mailman/Defaults.py

# nano -w /var/mailman/Mailman/Defaults.py
Verander de waarden hieronder om je primair domein aan te duiden
Daarop volgen de virtuals
DEFAULT_EMAIL_HOST='domain.com'
DEFAULT_URL_HOST='www.domain.com'

Codevoorbeeld 12.4: mailman config: mm_cfg.py

# nano -w /var/mailman/Mailman/mm_cfg.py
MTA = "Postfix"
POSTFIX_STYLE_VIRTUAL_DOMAINS = ['virt-domain.com', 'virt.domain2.com']
add_virtualhost('www.virt.domain.com', 'virt.domain.com')
add_virtualhost('www.virt.domain2.com', 'virt.domain2.com')
Dit is nodig om je virtuele domeinen werkende te krijgen

Codevoorbeeld 12.5: Een mailinglist aanmaken

Eenmaal dit voltooid is is het tijd om je eerste mailinglist aan te voegen.
# su mailman
# cd ~
# bin/newlist test
Enter the email of the person running the list: your@email.address
Initial test password:
Hit enter to continue with test owner notification...
Virtuele domeinenlijsten kunnen in lijst@domein.com vorm gespecifieerd worden
# bin/genaliases
Nu dat je aliassen aangemaakt zijn verifieer je best dat ze correct
toegevoegd werden.
# nano -w data/aliases
# STANZA START: test
# CREATED:
test:             "|/var/mailman/mail/mailman post test"
test-admin:       "|/var/mailman/mail/mailman admin test"
test-bounces:     "|/var/mailman/mail/mailman bounces test"
test-confirm:     "|/var/mailman/mail/mailman confirm test"
test-join:        "|/var/mailman/mail/mailman join test"
test-leave:       "|/var/mailman/mail/mailman leave test"
test-owner:       "|/var/mailman/mail/mailman owner test"
test-request:     "|/var/mailman/mail/mailman request test"
test-subscribe:   "|/var/mailman/mail/mailman subscribe test"
test-unsubscribe: "|/var/mailman/mail/mailman unsubscribe test"
# STANZA END: test

# /etc/init.d/mailman start
# rc-update add mailman default
Start mailman en laat het tevens automatisch opstarten

Codevoorbeeld 12.6: Mailman alias ondersteuning voor postfix toevoegen

# nano -w /etc/postfix/main.cf
owner_request_special = no
recipient_delimiter = +
Lees README.POSTFIX.gz voor meer details
alias_maps     =
  hash:/var/mailman/data/aliases,
  mysql:/etc/postfix/mysql-aliases.cf
virtual_alias_maps =
  hash:/var/mailman/data/virtual-mailman,
  mysql:/etc/postfix/mysql-virtual.cf
Dit voegt mailman alias file support toe aan postfix
je mag natuurlijk de MySQL tabellen gebruiken,
maar ik haat het om dat manueel te doen.

Indien je geen virtuele domeinen gebruikt
dan kan postfix problemen opleveren indien je 
de virtual alias mappen toevoegt. Wees dus gewaarschuwd.

Je kan nu je mailinglists instellen op eender welk domein op je server. Als laatste opmerking vraag ik je om alle mailmancommando's als gebruiker mailman uit te voeren (su mailman) want anders zullen de permissies verkeerd zijn en zal je ze moeten aanpassen. Lees de mailman documentatie voor meer informatie over hoe je de mailman lijsten onderhoudt.

13.  Content Filtering en Anti-Virus

Dit komt later... Het is al bijna af, maar ik heb nog wat perl-help en tests nodig om het af te werken. Indien je vrijwilliger bent, mail me dan.

14.  Afwerken

Voila, je bent klaar en opgelapt; verander /etc/postfix/master.cf en verwijder de verbose-mode voor het productie-gebruik. Je zal waarschijnlijk enkele services willen toevoegen aan je opstartroutine om ervoor te zorgen dat ze allemaal opgestart worden tijdens het booten. Zorg ervoor dat alle services die je draait (apache, mysql, saslauthd, postfix, courier-imapd, courier-imapd-ssl, courier-pop3d, courier-pop3d-ssl) allemaal werken (naargelang of je bepaalde ondersteuning niet wenst natuurlijk). Ik heb alle services aan staan.

Codevoorbeeld 14.1: Afwerken

# postfix reload
# rc-update add $service default

Veel plezier!

15.  Probleemoplosser

Introductie

Dit is een kleine probleemoplosser die de voorheen besproken stappen bespreekt. Ze is niet heel uitgebreid, maar eerder bedoelt als plaats waar je met je eerste problemen kan afkomen. Met een dergelijke gecompliceerde installatie is het belangrijk dat je je probleem isoleert zodat je weet wat er eigenlijk misloopt. In het algemeen doe ik dat in 5 stappen. We starten vanuit de basis van het systeem en werken zo naar het probleem toe terwijl we andere componenten als potentieel probleem elimineren, totdat we het defecte component vinden.

Stap 1: Controleer je configuratiebestanden.

Typo's zijn dodelijk, vooral indien je met identiteits verificatiesystemen w erkt. Scan je config en mailsql database voor typefouten. Je kan debuggen zoveel je wil, maar als je niet de juiste informatie tussen de systemen stuurt, zal het niet werken. Indien je een aanpassing aan een configuratiebestand gemaakt hebt, zorg er dan voor dat je de service herstart zodat hij zijn configuratie-aanpassingen inleest.

Codevoorbeeld 15.1: Services herstarten

# /etc/init.d/service restart

Stap 2: Zijn alle services werkelijk aan het draaien?

Indien het niet draait, start het dan op. Het is enorm moeilijk om een service te debuggen indien die niet draait :) Soms lijkt het alsof een service draait maar niet functioneert. Soms gebeurt het, bij slechte configuratie of slechte transmissie in een of ander component, dat de service blijft hangen en bijgevolg de poort zelf niet vrijgeeft voor een nieuw proces. Je kan dit soms detecteren met netstat. Of, indien je al een tijdje aan het probleem bezig bent, neem dan een pauze en herstart de server. Dit zal alle hangende services elimineren. Na je pauze kom je (verfrist) terug en probeer je opnieuw.

Codevoorbeeld 15.2: De service status bekijken

# /etc/init.d/$service status
# netstat -a | grep $service (or $port)

Stap 3: Gebruiken alle services de laatste configuratiebestanden?

Indien je onlangs een aanpassing hebt gemaakt aan een configuratiebestand, herstart dan de service om er zeker van te zijn dat hij de recentste versie gebruikt. Sommige componenten zullen hun configuratie ook op het scherm weergeven, zoals postfix.

Codevoorbeeld 15.3: Alles herstarten

# apachectl fullstatus (vereist lynx)
# apachectl configtest (controleert de configuratiebestanden)
# postconf -n (vertelt je welke parameters postfix gebruikt)
# /etc/init.d/$service restart

Stap 4: Controleer de logs

Zeg het luidop: logbestanden zijn mijn vrienden. Mijn volgende stap is altijd het controleren van de logbestanden. Soms is het handig om een mislukte operatie opnieuw uit te voeren en de logs te bekijken zodat de foutmelding helemaal onderaan staat (of bovenaan afhankelijk van je logger) in plaats van ergens in het midden te zweven. Kijk of er geen informatie geleverd wordt die je kan helpen met het oplossen van het probleem, of toch op zijn minst informatie levert over welke component er mislukt.

Codevoorbeeld 15.4: Log bestanden lezen

# kill -USR1 `ps -C metalog -o pid=`(schakel metalog buffering uit)
# nano -w /var/log/mail/current
# cat /var/log/mysql/mysql.log
# tail /var/log/apache/error_log

Je kan tevens de debug_peer parameters in main.cf handig vinden. Deze zal de logs uitgebreider maken, wat soms zeer handig kan zijn.

Codevoorbeeld 15.5: debug_peer ondersteuning activeren

# nano -w /etc/postfix/main.cf
debug_peer_level = 5
debug_peer_list = $host.domain.name
Decommentarieer een van de debugger commando's

Stap 5: Babbel zelf met de services

SMTP, IMAP en POP3 kunnen alle 3 met gewone tekst aangesproken worden via een telnet sessie. Dit hebben we al eerder gedaan toen we de PostFix configuratie verifieerden. Soms is het handig om een telnet sessie op te starten om met de service zelf te communiceren zodat we zien wat er gebeurt.

Codevoorbeeld 15.6: Testen met telnet

# telnet localhost $port
SMTP is 25, IMAP is 143, POP3 is 110. Je zou op zijn minst een "OK" moeten zien
welke je informeert dat de service draait en klaar is om commando's te ontvangen
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK Courier-IMAP ready. Copyright 1998-2002 Double Precision, Inc.

Stap 6: Soms is het echt zware geschut nodig: strace

strace is een zeer belangrijke tool voor het debuggen van software. Je kan commando's opstarten van de commandoregel met strace en dan alle systeemoproepen bekijken terwijl ze gebeuren. strace levert massaal veel informatie dus ofwel bekijk je het in realtime, ofwel dump je alle tekst in een bestand voor later.

Codevoorbeeld 15.7: Strace installeren en gebruiken

# emerge strace
# strace $command
# strace -p `ps -C $service -o pid=`

Stap 7: Onderzoeken

Eenmaal je alle informatie hebt kan je het probleem opsporen en oplossen. Neen? Toch niet? Wel, dan zal je op het internet op zoek moeten gaan naar informatie die je verder kan helpen. Hieronder is een lijst van websites waarop je je error kan opzoeken en zien of er iemand al een oplossing voor heeft. Er is ook een zeer goede howto over hoe je smtp-auth installeert welke veel goede debugging-ideeen voorstelt.



Print

Upgedate op 4 september 2006

De originele versie van dit document wordt niet meer onderhouden

Korte inhoud: Dit document legt je uit hoe je een virtueel mailhosting systeem creeert gebaseerd op postfix, mysql, courier-imap en cyrus-sasl.

Ken Nowack
Auteur

Ezra Gorman
Auteur

Zack Gilburd
Editor

Scygro
Editor

Sven Vermeulen
Vertaler

Tiemo Kieft
Vertaler

Alexander Zuliani
Vertaler

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.