Pour l'install j'utilise une distrib lenny x86_64 avec un noyau patche linux-vserver, un vserver tournant sur cette machine
ainsi qu'un dns local tournant sur une autre distrib lenny i686 qui gère les noms de domaine fictifs suivants:
domaine.zar, domaine2.zar, net.pat, domaine.pat, domaine2.pat, venoix.loc.

Un collègue utilisera sa machine (debian lenny) juste pour envoyer un mail.

Le but du jeu est de répartir la charge, sachant qu'avec cette config les 2 serveurs de mails utiliseront le même serveur spamassassin.
Il faudra donc paramétrer postfix, amavis de telle sorte qu'ils écoutent sur des ip spécifiques et non pas sur l'interface lo.


srvglus238:~# uname -a
Linux srvglus238 2.6.28-vs2.3.0.36.2-VIRT #8 Mon Feb 16 13:17:53 CET 2009 x86_64 GNU/Linux

srvglus238:~# cat /etc/issue.net
Debian GNU/Linux 5.0

srvglus238:~# ifconfig | grep 192
          inet adr:192.168.1.241  Bcast:192.168.1.255  Masque:255.255.255.0

Sur ce "maitre" vserver il y a un server qmail qui fonctionne déjà ainsi que spamassassin, vpopmail.
J'ai simplement ajouté le paquet amavisd-new (et ses dépendances).

Comme déjà souligné sur un autre billet, l'utilisation de serveurs virtuels nécessite de préciser l'ip
sur laquelle tournent certains services lorsque ceux-ci doivent s'exécuter sur plusieurs hôtes, d'autant
que c'est le but recherché ici (vserver ou pas).

 
Dans ce cas, spamassassin s'exécutant sur la même machine que amavis, je n'ai pas touché à la conf de celui-ci.
Pour paramétrer spamassassin sur une ip spécifique il aurait fallu modifier /etc/default/spamassassin comme suit:

OPTIONS="--create-prefs --max-children 5 --helper-home-dir --listen-ip=192.168.1.241"
#OPTIONS="--create-prefs --max-children 5 --helper-home-dir"


srvglus238:~# netstat -tpan
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 127.0.0.1:783           0.0.0.0:*               LISTEN      7741/spamd.pid 
tcp        0      0 192.168.1.241:143       0.0.0.0:*               LISTEN      2011/couriertcpd
tcp        0      0 192.168.1.241:80        0.0.0.0:*               LISTEN      2089/apache2   
tcp        0      0 192.168.1.241:21        0.0.0.0:*               LISTEN      2037/pure-ftpd (SER
tcp        0      0 192.168.1.241:22        0.0.0.0:*               LISTEN      1631/sshd      
tcp        0      0 192.168.1.241:25        0.0.0.0:*               LISTEN      2048/tcpserver 
tcp        0      0 192.168.1.241:10024     0.0.0.0:*               LISTEN      9083/amavisd (maste
tcp        0      0 192.168.1.241:3306      0.0.0.0:*               LISTEN      1713/mysqld    
tcp        0      0 192.168.1.241:110       0.0.0.0:*               LISTEN      2058/tcpserver 
tcp        0      0 192.168.1.241:22        192.168.1.244:44141     ESTABLISHED 2484/2         
tcp        0      0 192.168.1.241:22        192.168.1.244:44119     ESTABLISHED 2439/0         
tcp        0      0 192.168.1.241:22        192.168.1.244:36015     ESTABLISHED 8184/3

Pour qmail c'est configuré dans le script de démarrage /etc/init.d/qmail :

Extrait:
....
 --exec /usr/bin/tcpserver -- -H -P -R -l 0 \
   -u `id -u qmaild` -g `id -g nobody` -x /etc/tcp.smtp.cdb 192.168.1.241 smtp \
   $rblsmtpd /usr/sbin/qmail-smtpd /usr/sbin/vchkpw /bin/true 2>&1 | $logger &"
.....

Idem pour vpopmail dans /etc/init.d/vpopmail:

Extrait:
.....
  --exec /usr/bin/tcpserver -- \
    -H -R 192.168.1.241 pop3 /usr/sbin/qmail-popup `hostname`.`dnsdomainname` \
    $DAEMON /usr/sbin/qmail-pop3d Maildir &"
....

Pour amavis voici la conf que j'utilise:

Je ne touche pas aux fichiers de conf livrés par défaut mais je personnalise le 50-user:

srvglus238:/etc/amavis/conf.d# cat 50-user | egrep -v '^#|^$'
use strict;
@inet_acl = qw( 192.168.1.241 192.168.1.246 );
@local_domains_acl = ( "net.caen", "net.pat", "domaine.pat", "domaine2.pat","domaine.zar", "domaine2.zar" );
$inet_socket_bind = '192.168.1.241';
@mynetworks = qw( 127.0.0.0/8 [::1] [FE80::]/10 [FEC0::]/10 192.168.1.0/24 );
@mynetworks_maps = (\@mynetworks);
$forward_method = 'smtp:[192.168.1.246]:10025';  # where to forward checked mail
$notify_method = $forward_method;            # where to submit notifications
1;  # ensure a defined return


Le nom de domaine fqdn existe bien sur le réseau...

srvglus238:~# hostname --fqdn
srvglus238.net.pat

... et il est géré par:

srvglus238:~# dig soa net.pat (extrait)

; <<>> DiG 9.5.1-P1 <<>> soa net.pat
;; ANSWER SECTION:
net.pat.        3600    IN    SOA    sn2caen.venoix.loc. root.venoix.loc. 2009030202 28800 7200 604800 86400
net.pat.        3600    IN    NS    ns.venoix.loc.
ns.venoix.loc.        3600    IN    A    192.168.1.80

Le mx pour domaine.zar correspond (voir plus bas) au vserver:

srvglus238:/# dig mx domaine.zar | egrep -v '^$'
; <<>> DiG 9.5.1-P1 <<>> mx domaine.zar
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10396
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; QUESTION SECTION:
;domaine.zar.            IN    MX
;; ANSWER SECTION:
domaine.zar.        3600    IN    MX    15 mx.domaine.zar.
;; AUTHORITY SECTION:
domaine.zar.        3600    IN    NS    ns.venoix.loc.
;; ADDITIONAL SECTION:
mx.domaine.zar.        3600    IN    A    192.168.1.246
ns.venoix.loc.        3600    IN    A    192.168.1.80
;; Query time: 13 msec
;; SERVER: 192.168.1.80#53(192.168.1.80)
;; WHEN: Wed Apr 29 14:30:05 2009
;; MSG SIZE  rcvd: 107


Pour la démo un seul vserver en fonctionnement:

srvglus238:~# vserver-stat
CTX   PROC    VSZ    RSS  userTIME   sysTIME    UPTIME NAME
40011   30   2.4G 133.3M   0m29s42   0m59s50   2d04h04 vweb4

C'est tout côté maitre vserver.



Allons voir maintenant le serveur virtuel:

srvglus238:/etc/amavis/conf.d# vserver vweb4 enter

vweb4:/# ifconfig | grep 192
          inet adr:192.168.1.246  Bcast:192.168.1.255  Masque:255.255.255.0

C'est bien l'adresse IP renvoyée par dig mx domaine.zar.

Les services en cours d'exécution sur cette machine:

vweb4:/# netstat -tpan
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 192.168.1.246:80        0.0.0.0:*               LISTEN      2423/apache2   
tcp        0      0 192.168.1.246:25        0.0.0.0:*               LISTEN      8689/master    
tcp        0      0 127.0.0.1:891           0.0.0.0:*               LISTEN      5803/famd      
tcp        0      0 192.168.1.246:10025     0.0.0.0:*               LISTEN      8689/master    
tcp        0      0 192.168.1.246:110       0.0.0.0:*               LISTEN      6001/couriertcpd

Postfix recevra le mail (192.168.1.246:25), le passera à amavis sur le maitre (192.168.1.241:10024) qui le passera à spamassassin sur le maitre toujours (127.0.0.1:783) et selon le résultat (spam, nospam) le mail sera retourné vers vweb4 (192.168.1.246:10025) pour être délivré dans le maildir de l'utilisateur.

Postfix a été configuré pour gérer des domaines virtuels avec mysql
(voir par exemple: http://www.howtoforge.com/virtual-users-domains-postfix-courier-mysql-squirrelmail-debian-lenny)


Les fichiers de config main.cf et master.cf de postfix ont été modifiés comme suit:

vweb4:/etc/postfix# cat main.cf
myhostname = vweb4.domaine.zar
mydestination = vweb4.domaine.zar, localhost, localhost.localdomain
mynetworks = 127.0.0.0/8 192.168.1.0/24
message_size_limit = 30720000
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
#smtpd_sasl_auth_enable = no
#broken_sasl_auth_clients = no
#smtpd_sasl_authenticated_header = no
#smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
#smtpd_use_tls = no
#smtpd_tls_cert_file = /etc/postfix/smtpd.cert
#smtpd_tls_key_file = /etc/postfix/smtpd.key
transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf
virtual_create_maildirsize = yes
virtual_maildir_extended = yes
virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = "The user you are trying to reach is over quota."
virtual_overquota_bounce = yes
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps
# Content Filtering
content_filter = smtp-amavis:[192.168.1.241]:10024


Je n'ai pas activé l'auth-smtp (ce n'était pas le but du jeu et l'article de howtoforge est suffisament clair)

vweb4:/etc/postfix# cat master.cf
#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
192.168.1.246:smtp      inet  n       -       -       -       -       smtpd
#submission inet n       -       -       -       -       smtpd
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#smtps     inet  n       -       -       -       -       smtpd
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#628      inet  n       -       -       -       -       qmqpd
pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
#qmgr     fifo  n       -       -       300     1       oqmgr
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
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops
relay     unix  -       -       -       -       -       smtp
    -o smtp_fallback_relay=
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
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
# amavisd-new
smtp-amavis unix -      -       n     -       8  lmtp
    -o smtp_data_done_timeout=1200
    -o disable_dns_lookups=yes

192.168.1.246:10025 inet n  -       n     -       -  smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o smtpd_helo_restrictions=
    -o smtpd_client_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks=192.168.1.0/24
#
# ====================================================================
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
#
# Many of the following services use the Postfix pipe(8) delivery
# agent.  See the pipe(8) man page for information about ${recipient}
# and other message envelope options.
# ====================================================================
#
# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
#
# See the Postfix UUCP_README file for configuration details.
#
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
#
# Other external delivery methods.
#
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}

 


Passons aux tests:

1) Envoi d'un mail normal à patrick@domaine.zar depuis le poste du collègue (ip 192.168.1.22)

Logs sur le mx (vserver donc avec postfix-mysql)

Apr 29 11:35:15 vweb4 postfix/smtpd[9160]: connect from unknown[192.168.1.22]
Apr 29 11:35:15 vweb4 postfix/smtpd[9160]: 46BE41B003: client=unknown[192.168.1.22]
Apr 29 11:35:15 vweb4 postfix/cleanup[9164]: 46BE41B003: message-id=<20090429122822.29CE6409D@yoda.local>
Apr 29 11:35:15 vweb4 postfix/qmgr[8693]: 46BE41B003: from=<marco@yoda.local>, size=524, nrcpt=1 (queue active)
Apr 29 11:35:15 vweb4 postfix/smtpd[9160]: disconnect from unknown[192.168.1.22]
Apr 29 11:35:15 vweb4 postfix/smtpd[9167]: connect from vweb4.domaine.zar[192.168.1.246]
Apr 29 11:35:15 vweb4 postfix/smtpd[9167]: BAB941B007: client=vweb4.domaine.zar[192.168.1.246]
Apr 29 11:35:15 vweb4 postfix/cleanup[9164]: BAB941B007: message-id=<20090429122822.29CE6409D@yoda.local>
Apr 29 11:35:15 vweb4 postfix/qmgr[8693]: BAB941B007: from=<marco@yoda.local>, size=1130, nrcpt=1 (queue active)
Apr 29 11:35:15 vweb4 postfix/smtpd[9167]: disconnect from vweb4.domaine.zar[192.168.1.246]
Apr 29 11:35:15 vweb4 postfix/virtual[9168]: BAB941B007: to=<patrick@domaine.zar>, relay=virtual, delay=0.07, delays=0.03/0.01/0/0.02, dsn=2.0.0, status=sent (delivered to maildir)
Apr 29 11:35:15 vweb4 postfix/qmgr[8693]: BAB941B007: removed
Apr 29 11:35:15 vweb4 postfix/lmtp[9165]: 46BE41B003: to=<patrick@domaine.zar>, relay=192.168.1.241[192.168.1.241]:10024, delay=0.59, delays=0.09/0/0.01/0.48, dsn=2.0.0, status=sent (250 2.0.0 Ok, id=09086-03, from MTA([192.168.1.246]:10025): 250 2.0.0 Ok: queued as BAB941B007)
Apr 29 11:35:15 vweb4 postfix/qmgr[8693]: 46BE41B003: removed

Logs sur le maitre-vserver (avec qmail, amavis, spamassassin):

Apr 29 13:35:15 srvglus238 amavis[9086]: (09086-03) Passed CLEAN, [192.168.1.22] [192.168.1.22] <marco@yoda.local> -> <patrick@domaine.zar>, Message-ID: <20090429122822.29CE6409D@yoda.local>, mail_id: snKekpZcYN70, Hits: 2.744, size: 524, queued_as: BAB941B007, 479 ms


2) Envoi d'un spam à patrick@domaine.zar depuis le poste du collègue (ip 192.168.1.22)

Logs sur le mx

Apr 29 11:40:03 vweb4 postfix/smtpd[9175]: connect from unknown[192.168.1.22]
Apr 29 11:40:04 vweb4 postfix/smtpd[9175]: 059831B003: client=unknown[192.168.1.22]
Apr 29 11:40:04 vweb4 postfix/cleanup[9179]: 059831B003: message-id=<20090429123310.B1CCB409D@yoda.local>
Apr 29 11:40:04 vweb4 postfix/qmgr[8693]: 059831B003: from=<marco@yoda.local>, size=1257, nrcpt=1 (queue active)
Apr 29 11:40:04 vweb4 postfix/smtpd[9175]: disconnect from unknown[192.168.1.22]
Apr 29 11:40:04 vweb4 postfix/lmtp[9180]: 059831B003: to=<patrick@domaine.zar>, relay=192.168.1.241[192.168.1.241]:10024, delay=0.53, delays=0.06/0.02/0.01/0.44, dsn=2.5.0, status=sent (250 2.5.0 Ok <patrick@domaine.zar>, DSN suppressed (554 5.7.0 Reject, id=09085-04 - SPAM))
Apr 29 11:40:04 vweb4 postfix/qmgr[8693]: 059831B003: removed

Logs sur l'antispam:

Apr 29 13:40:04 srvglus238 amavis[9085]: (09085-04) Blocked SPAM, [192.168.1.22] [192.168.1.22] <marco@yoda.local> -> <patrick@domaine.zar>, quarantine: 4/spam-43WXp-K4vZ-t.gz, Message-ID: <20090429123310.B1CCB409D@yoda.local>, mail_id: 43WXp-K4vZ-t, Hits: 1001.294, size: 1257, 424 ms


Ca tourne impec.