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. |
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. |
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.
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.
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:
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 |
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:
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.
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.
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. |
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.
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!
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 |
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=` |
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.