PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Domain Part wird von Sendmail nicht an den cyrusv2 mailer korrekt übergeben



Me
17.06.05, 16:07
Moinsen erstmal,
ich hab' folgendes, kleines Problem:

Zielsetzung: Imapserver für multiple Domains bereitstellen
Ist Bestand: Sendmail 8.13.3- selbstkompiliert (SASL, BDB Support),
CyrusIMAPd 2.2.12- selbstkompiliert, CyrusSASL 2.1.12-selbstkompiliert (PAM,mysql)

Alles schön und gut. Läuft auch alles. Solange ich unqualifizierte Benutzer im Cyrus anlege und den Cyrus ohne virtdomain support laufen habe.

Sobald ich eine Domainenbasierte Benutzerverwaltung erstelle (user.foo@bar.org) bekomme ich folgendes Problem:
Sendmail strippt den Domainpart des rcpt to: 'raus.
Was passiert: der cyrusv2 mailer bekommt einen unqualified user mitgeteilt und hängt seine defaultdomain an (anstatt user@foobar.org, user@meinlocaler-arp-eintrag.de) ..
Dieses Konto exisitert im günstigsten Fall nicht, .. so und jetzt seit ihr 'dran :)

Zur allgemeinen Info:
Benutzerauthentifizierung läuft über's sql-plugin des sasl-auxprop mechs (die geht auch, ohne Prob)
virtdomain option in der imapd.conf steht auf 'userid' (ansonsten löst er immer über die arp-table auf :( )
Aber ich denke, dass Problem liegt weder an der User Auth, noch am Cyrus selbst, sondern an dem, was sendmail dem mailer (cyrusv2) übergibt:

Also hab ich da angesetzt und folgendes schon getestet:
Mein sendmail.mc:


divert(-1)
#
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
# All rights reserved.
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
# Copyright (c) 1988, 1993
# The Regents of the University of California. All rights reserved.
#
# Meine .mc
divert(0)dnl
VERSIONID(`$Id: incoming.mc, 2005/00/00 14:00:00 Me $')
OSTYPE(linux)dnl
DOMAIN(generic)dnl
define(`ALIAS_FILE',`/etc/mail/aliases')
define(`STATUS_FILE',`/etc/mail/statistics.smtp.in')
define(`confCW_FILE',`/etc/mail/local-host-names')
define(`confPID_FILE',`/var/run/sendmail-cyrus.in.pid')
define(`confDELIVERY_MODE',`background')
define(`confLOCAL_MAILER', `cyrusv2')
define(`_NO_MSA_')
undefine(`confAUTH_MECHANISMS')
DAEMON_OPTIONS(``Name=MTA, Addr=xxx.xxx.xxx.xxx, Port=25'')
define(`confPRIVACY_FLAGS',``noetrn,authwarnings,n eedmailhelo,noexpn'')
define(`QUEUE_DIR',`/var/spool/inqueue.cyrus')
FEATURE(`dnsbl', `relays.ordb.org', `"550 Email rejected - see http://www.ordb.org"')dnl
FEATURE(`dnsbl', `dnsbl.sorbs.net', `"550 Email rejected - see http://www.dnsbl.nl.sorbs.net"')dnl
FEATURE(`preserve_local_plus_detail')
FEATURE(`always_add_domain')
FEATURE(`nouucp')
FEATURE(`nocanonify')
MAILER(`smtp')
MAILER(`local')
MAILER(`cyrusv2')


Leider kann man die S= und R= Rule Flags nur direkt in der 'sendmail-source/cf/mailer/cyrusv2.m4' ändern, dort habe ich also noch folgendes gemacht:



PUSHDIVERT(-1)
#
# Copyright (c) 2002 Sendmail, Inc. and its suppliers.
# All rights reserved.
#
# By using this file, you agree to the terms and conditions set
# forth in the LICENSE file which can be found at the top level of
# the sendmail distribution.
#
# Contributed by Kenneth Murchison.
#

_DEFIFNOT(`_DEF_CYRUSV2_MAILER_FLAGS', `lsDFMnqXzC')
_DEFIFNOT(`CYRUSV2_MAILER_FLAGS', `A@/:|m')
ifdef(`CYRUSV2_MAILER_ARGS',, `define(`CYRUSV2_MAILER_ARGS', `FILE /var/imap/socket/lmtp')')
define(`_CYRUSV2_QGRP', `ifelse(defn(`CYRUSV2_MAILER_QGRP'),`',`', ` Q=CYRUSV2_MAILER_QGRP,')')dnl

POPDIVERT

#########################################
### Cyrus V2 Mailer specification ###
#########################################

VERSIONID(`$Id: cyrusv2.m4,v 1.1 2002/06/01 21:14:57 ca Exp $')

Mcyrusv2, P=[IPC], F=_MODMF_(CONCAT(_DEF_CYRUSV2_MAILER_FLAGS, CYRUSV2_MAILER_FLAGS), `CYRUSV2'),
S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP/HdrToSMTP, E=\r\n,
_OPTINS(`CYRUSV2_MAILER_MAXMSGS', `m=', `, ')_OPTINS(`CYRUSV2_MAILER_MAXRCPTS', `r=', `, ')_OPTINS(`CYRUSV2_MAILER_CHARSET', `C=', `, ')T=DNS/RFC822/SMTP,_CYRUSV2_QGRP
A=CYRUSV2_MAILER_ARGS


Das Fettgedruckte ist das vom Original, laut Cyrus Doku, geänderte. Ausnahme ist folgende:
An letzter Stelle von den MailerFlags (F=) ist C eingefügt, welches normalerweise dazu zwingt, dass sendmail den user in der form user@domain an den Mailer übergibt. Hier noch mal die Zeile
_DEFIFNOT(`_DEF_CYRUSV2_MAILER_FLAGS', `lsDFMnqXzC')
Das habe ich selbsttätig hinzugefügt.

Egal wie, Original oder modifiziert: Es mag mich nicht ;)


Bitte keine Antwort: Nimm doch Postfix oder Exim oder sonst-irgendwas.. Beide lassen keine Regelüberprüfung SMTP-AUTH User gegen Datenbankbasierte Mailaddressen zu. Ich kenne Postfix und Exim, beide sind zu starr und nicht für meinen Bedarf geeignet.

Hier die Fehlermeldung:



Jun 17 14:17:13 lmtpunix[4459]: accepted connection
Jun 17 14:17:13 lmtpunix[4459]: lmtp connection preauth'd as postman
Jun 17 14:17:13 lmtpunix[4459]: verify_user(user.xyz) failed: Mailbox does not exist
Jun 17 14:17:13 sendmail[4465]: j5HCGeoH004461: to=xyz@empfängerdomain.de, delay=00:00:06, xdelay=00:00:00, mailer=cyrusv2, pri=120004, relay=localhost, dsn=5.1.1, stat=User unknown
Jun 17 14:17:13 sendmail[4465]: j5HCGeoH004461: j5HCHDoH004465: DSN: User unknown


Wie man erkennen kann, beschwert sich der Cyrus über den nichtexistenten Benutzer user.xyz
Richtig. Der exisitiert auch nicht. Es exisitiert aber user.xyz@empfängerdomain, und sendmail plottet auch genau diesen in der nächsten Zeile 'raus .. mmhhh

Irgenwer 'ne Idee ?!?!

Thx im voraus

Me

Me
19.06.05, 00:25
So, hab's selbst hinbekommen. Der Thread kann geschlossen werden.
RTFM ist gut, wenn man's denne auch liest:
Also, falls jemand ähnliche Probleme hat:
die Durchschleusung der Domain funzt nicht, solange sendmail für die Domain zuständig ist -- also das Makro w für die Domain gesetzt ist.
Dieses wird aus den local-host-names ausgelesen. Sobald sendmail merkt, dass er die Domain besitzt, streicht er sie aus der Adresse.
Entgegen allen wissens muss die Domain also aus den local-host-names ENTFERNT werden, jaaa .. richtig gehört ;)
Da er jetzt nicht mehr zuständig ist, bekommt man natürlich ein "Relaying-denied" (PS: Falls man das nicht bekommt, sollte man seine Config checken und ggf. promiscous relay deaktivieren :ugly: )
Die mailertable ist die wahl, genau da gehört es 'rein. Damit sage ich ihm: Hey, Du bist zwar nicht zuständig, aber gib die Mail mal dem xyz mailer. Und da trägt man jetzt den cyrus ein .. sendmail lässt die Domain 'dran und die Welt ist in Ordnung.

Klartext: in das .mc skript


divert(-1)
#
# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
# All rights reserved.
# Copyright (c) 1983 Eric P. Allman. All rights reserved.
# Copyright (c) 1988, 1993
# The Regents of the University of California. All rights reserved.
#

divert(0)dnl
VERSIONID(`$Id: incoming.mc, 2005/02/25 14:00:00 Michael Becker $')
OSTYPE(linux)dnl
DOMAIN(generic)dnl
define(`ALIAS_FILE',`/etc/mail/aliases')
define(`STATUS_FILE',`/etc/mail/statistics.smtp.in')
define(`confCW_FILE',`/etc/mail/local-host-names-cyrus')
define(`confPID_FILE',`/var/run/sendmail-cyrus.in.pid')
define(`confDELIVERY_MODE',`background')
define(`confLOCAL_MAILER', `cyrusv2')
define(`_NO_MSA_')
undefine(`confAUTH_MECHANISMS')
DAEMON_OPTIONS(``Name=MTA, Addr=xxx.xxx.xxx, Port=25'')
define(`confPRIVACY_FLAGS',``noetrn,authwarnings,n eedmailhelo,noexpn'')
define(`QUEUE_DIR',`/var/spool/inqueue.cyrus')
FEATURE(`mailertable')
FEATURE(`always_add_domain')
FEATURE(`dnsbl', `relays.ordb.org', `"550 Email rejected"')dnl
FEATURE(`dnsbl', `dnsbl.sorbs.net', `"550 Email rejected"')dnl
FEATURE(`preserve_local_plus_detail')
FEATURE(`use_cw_file')
MAILER(`smtp')
MAILER(`local')
MAILER(`cyrusv2')


Ok, das fettgedruckte sollte auf jeden Fall hinzugefügt werden.

Dann muss leider dennoch das zuständige Mailer cyrusv2.m4 für den Cyrus im Verz. cf/mailer geändert werden:



PUSHDIVERT(-1)
#
# Copyright (c) 2002 Sendmail, Inc. and its suppliers.
# All rights reserved.
#
# By using this file, you agree to the terms and conditions set
# forth in the LICENSE file which can be found at the top level of
# the sendmail distribution.
#
# Contributed by Kenneth Murchison.
#

_DEFIFNOT(`_DEF_CYRUSV2_MAILER_FLAGS', `lsDFMnqXz')
_DEFIFNOT(`CYRUSV2_MAILER_FLAGS', `A@/:|m')
ifdef(`CYRUSV2_MAILER_ARGS',, `define(`CYRUSV2_MAILER_ARGS', `FILE /var/imap/socket/lmtp')')
define(`_CYRUSV2_QGRP', `ifelse(defn(`CYRUSV2_MAILER_QGRP'),`',`', ` Q=CYRUSV2_MAILER_QGRP,')')dnl

POPDIVERT

#########################################
### Cyrus V2 Mailer specification ###
#########################################

VERSIONID(`$Id: cyrusv2.m4,v 1.1 2002/06/01 21:14:57 ca Exp $')

Mcyrusv2, P=[IPC], F=_MODMF_(CONCAT(_DEF_CYRUSV2_MAILER_FLAGS, CYRUSV2_MAILER_FLAGS), `CYRUSV2'),
S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP, E=\r\n,
_OPTINS(`CYRUSV2_MAILER_MAXMSGS', `m=', `, ')_OPTINS(`CYRUSV2_MAILER_MAXRCPTS', `r=', `, ')_OPTINS(`CYRUSV2_MAILER_CHARSET', `C=', `, ')T=DNS/RFC822/SMTP,_CYRUSV2_QGRP
A=CYRUSV2_MAILER_ARGS



.. allerding nur das fettgedruckte, sonst nix

so, mit ./Build meine-sendmail.cf im cf/cf Unterv. nun die .cf aus dem obigen .mc erstellen und selbige an den Platz der Wahl (i.d.R. /etc/mail) kopieren.

danach die mailertable in /etc/mail erstellen und folgendes hineinschreiben:


meine-domain.de cyrusv2:/var/imap/socket/lmtp


dann noch ein 'makemap -C /meine/sendmail.cf hash mailertable.db < mailertable'

auf der Console und restart von sendmail

Feddisch :)