Dear everyone,

I'm working on some Antispam-Proxy, using Postfix as MTA. Postfix is
2.6.2-RC1 on an Ubuntu 8.04 LTS base-system.


Preconditions:
* Postfix shall only accept mails addressed to valid (=existing)
  recipients. To accomplish this, I'm using a regexp:/ map on
  relay_recipient_maps (the specific file is called "usermaps").
* This usermaps file is automatically generated from an hourly cron-job,
  fetching all valid email-addresses via LDAP (however, the Postfix
  installation doesn't care about LDAP at all, this is autonomously done
  by some perl script).
* The data gathered from LDAP is stuffed into a temporary file until
  finished, and then "atomatically" copied over the original usermaps
  file, before Postfix is triggered to reload.

Problem:
* At very irregular intervals, varying in time and quantity, Postfix
  refuses to accept Mails because the recipient address is seemingly
  unknown, altough that specific mail address (changes every time,
  unpredictable) is correctly defined in the usermaps file. The
  log-messages are like:

2010-01-26T15:10:29+01:00 hostmail postfix/smtpd[22884]: NOQUEUE:
reject: RCPT from smtp.citrix.com[66.165.176.89]: 550 5.1.1
<alexxxx...@xxxxxxx.de>: Recipient address rejected: User unknown in
relay recipient table; from=<no.repl...@citrix.com>
to=<alexxxxx...@xxxxxxxx.de> proto=ESMTP helo=<SMTP.CITRIX.COM>

* Assuming the hourly cron-job is executed 24 times a day, 1-4 times
  Postfix logs the following message:

2010-01-26T08:57:25+01:00 hostmail postfix/smtpd[3398]: warning: regexp
map /etc/postfix/usermaps, line 2434: no closing regexp delimiter "/":
skipping this rule

The lines-number is always randomly changing, and I have made quite some
effort to make sure that the usermaps file is always complete,
syntactically correct and consistent. As you see, the logentry above is
timed "08:57:25" (the cron-job begins fetching addresses via LDAP always
at *:57).
Interestingly, my 'watch stat /etc/postfix/usermaps' shows this:

# Before the 08:57 cron-job touches usermaps
@Tue Jan 26 08:57:24 CET 2010
Access: 2010-01-26 07:57:24.000000000 +0100
Modify: 2010-01-26 07:57:22.000000000 +0100
Change: 2010-01-26 07:57:22.000000000 +0100

# After the 08:57 cron-job re-wrote usermaps, but Postfix hasn't read it
# yet
@Tue Jan 26 08:57:26 CET 2010
Access: 2010-01-26 08:57:25.000000000 +0100
Modify: 2010-01-26 08:57:25.000000000 +0100
Change: 2010-01-26 08:57:25.000000000 +0100

# After Postfix read the new usermaps after reloading
@Tue Jan 26 08:57:36 CET 2010
Access: 2010-01-26 08:57:35.000000000 +0100
Modify: 2010-01-26 08:57:25.000000000 +0100
Change: 2010-01-26 08:57:25.000000000 +0100

If you look at these times, the file is *read* by Postfix at 08:57:35,
but the log-line above claims the warning at 07:57:25. How can this be?
The 10 seconds delay is because of an intended sleep() between writing
the usermaps and reloading Postfix.

Moreover, when mails a rejected as described above, the *time* these
rejects happen do not seem to correlate with the regexp-warnings, nor do
the rejected recipient mail-addresses. It seems like everything happens
quite random here.

What I've already checked:
* Generation of usermaps file is OK and always succeeds. All addresses
  are successfully fetched, the file is writen syntactically correct and
  complete.
* I/O- and buffering-issues have been tested and shouldn't be the
  problem (e.g. reloading Postfix while I/O buffer hasn't been flushed
  yet).
* The basic Postfix configuration works perfectly and never made any
  troubles. That usermaps issue seems to occur only then the usermaps is
  getting large (>1k lines; in this specific case, it's about 10k lines
  large).

The installation runs on a virtualized platform, using XEN. Postfinger
output is attached. I should also mention that, for various reasons,
it's not *easily* possible for me to simply upgrade the Postfix version.


Thank you very much,
Erik
postfinger - postfix configuration on Tue Jan 26 15:18:25 CET 2010
version: 1.30

Warning: postfinger output may show private configuration information,
such as ip addresses and/or domain names which you do not want to show
to the public.  If this is the case it is your responsibility to modify
the output to hide this private information.  [Remove this warning with
the --nowarn option.]

--System Parameters--
mail_version = 2.6.2-RC1
hostname = hostmail
uname = Linux hostmail 2.6.24-24-server #1 SMP Tue Jun 30 21:03:25 UTC 2009 
i686 GNU/Linux

--Packaging information--
looks like this postfix comes from deb package: postfix-2.6.2~rc1-1

--main.cf non-default parameters--
alias_maps = hash:/etc/aliases
anvil_rate_time_unit = 30m
append_dot_mydomain = no
biff = no
bounce_queue_lifetime = 1h
broken_sasl_auth_clients = yes
content_filter = smtp-amavis:[127.0.0.1]:10024
header_checks = regexp:/etc/postfix/header_checks
local_recipient_maps = hash:/etc/postfix/local_rcpt_map
mailbox_size_limit = 0
mailbox_transport_maps = hash:/etc/postfix/mbox_transport
maximal_queue_lifetime = 6h
message_size_limit = 500000000
mydestination = localhost, $myhostname
myhostname = hostmail.XXXXXXXX.de
mynetworks = 127.0.0.0/8
queue_minfree = 1000000000
recipient_delimiter = +
relay_domains = hash:/etc/postfix/transport
relay_recipient_maps = regexp:/etc/postfix/usermaps
smtpd_banner = $myhostname ANTISPAM PROXY
smtpd_client_connection_rate_limit = 200
smtpd_client_restrictions = check_client_access 
cidr:/etc/postfix/amavis_bypass_internal_warn, check_client_access 
cidr:/etc/postfix/amavis_bypass_internal_filter, check_client_access 
cidr:/etc/postfix/amavis_bypass_filter_smtpcrypt, check_client_access 
cidr:/etc/postfix/amavis_bypass_filter, check_client_access 
cidr:/etc/postfix/amavis_bypass_accept, check_client_access 
cidr:/etc/postfix/amavis_bypass_internal_accept,
smtpd_data_restrictions = reject_unauth_pipelining,
smtpd_helo_required = yes
smtpd_recipient_restrictions = check_client_access 
cidr:/etc/postfix/amavis_bypass_internal_accept, check_recipient_access 
regexp:/etc/postfix/filter-quarantine.regexp, check_policy_service 
inet:127.0.0.1:10040, permit_sasl_authenticated, permit_mynetworks, 
reject_unauth_destination, reject_non_fqdn_sender, 
reject_unknown_sender_domain, permit
smtpd_restriction_classes = rc_greylisting
smtpd_sasl_authenticated_header = yes
smtpd_sender_restrictions = permit_sasl_authenticated, check_sender_access 
regexp:/etc/postfix/amavis_senderbypass_filter, permit_mynetworks, permit
smtpd_timeout = 60
transport_maps = hash:/etc/postfix/transport
virtual_gid_maps = static:114
virtual_mailbox_base = /var/quarantine
virtual_mailbox_limit = 1000000000
virtual_mailbox_maps = hash:/etc/postfix/virtual_mbox
virtual_uid_maps = static:106

--master.cf--
0.0.0.0:smtp      inet  n       -       -       -       48       smtpd
pickup    fifo  n       -       -       60      1       pickup
        -o content_filter=
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
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
        -o fallback_relay=
showq     unix  n       -       -       -       -       showq
error     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
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
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 -          -       n       -       16      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  -       n       -       -  smtpd
 -o content_filter=
 -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 smtpd_milters=
 -o local_header_rewrite_clients=
 -o local_recipient_maps=
 -o relay_recipient_maps=
 -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
smtpcrypt  unix  - n n - - pipe
  flags=Rq  user=smtpcrypt argv=/usr/local/bin/smtpcrypt.pl sasl${sasl_method} 
${client_address} ${sender} ${recipient} 
retry     unix  -       -       -       -       -       error

-- end of postfinger output --

Reply via email to