Verständnisfrage: OpenSMTPd und Empfängervalidierung

thorwin

Well-Known Member
Moin,

ich sehe mir grade OpenSMTPd an, weil mich die Einfachheit sehr anspricht, habe allerdings ein Verständnisproblem bzgl. der Validierung von Empfängeradressen.

Gegeben sei folgender Auszug der smtpd.conf:
Code:
listen on lo0 port 10026 tag SPAM_IN
table aliases db:/etc/mail/aliases.db
table vusers file:/etc/mail/vusers
table vdomains file:/etc/mail/vdomains
accept tagged SPAM_IN for domain <vdomains> virtual <vusers> deliver to lmtp "/var/dovecot/lmtp"
accept from any for domain <vdomains> relay via smtp://127.0.0.1:10025

Auf Port 10025 läuft ein spampd, der auf 10026 re-injected. Da wird jetzt aber doch jede Mail für die Domains in <vdomains> angenommen, unabhängig davon, ob der Alias zustellbar ist oder nicht. Kann ich das irgendwie verhindern? Leider ist virtual <vusers> nicht im Zusammenhang mit relay nutzbar, wenn aber Mails auch für unbekannte Empfänger angenommen werden und smtpd dann lokal einen Bounce erzeugt, ist das ja nicht benutzbar (zumindest nicht für mich).

Übersehe ich da etwas?
 
Hmm... scheint wirklich nicht zu gehen, selbst in der aktuellen Version 5.7.3 findet sich in parse.y noch
Code:
rule            : ACCEPT {
                        rule = xcalloc(1, sizeof(*rule), "parse rule: ACCEPT");
                        rule->r_action = A_NONE;
                        rule->r_decision = R_ACCEPT;
                        rule->r_desttype = DEST_DOM;
                        rule->r_qexpire = -1;
                } decision lookup action accept_params {
                        if (! rule->r_sources)
                                rule->r_sources = table_find("<localhost>", NULL);
                        if (! rule->r_destination)
                                rule->r_destination = table_find("<localnames>", NULL);
                        if (! rule->r_userbase)
                                rule->r_userbase = table_find("<getpwnam>", NULL);
                        if (rule->r_qexpire == -1)
                                rule->r_qexpire = conf->sc_qexpire;
                        if (rule->r_action == A_RELAY || rule->r_action == A_RELAYVIA) {
                                if (rule->r_userbase != table_find("<getpwnam>", NULL)) {
                                        yyerror("userbase may not be used with a relay rule");
                                        YYERROR;
                                }
                                if (rule->r_mapping) {
                                        yyerror("aliases/virtual may not be used with a relay rule");
                                        YYERROR;
                                }
                        }

Wie krieg ich das denn hin, dass er nur Mails an gültige Empfänger annimmt und den Rest verweigert?

Kann ich ein
Code:
reject from any for ! domain <vdomains> virtual <vusers>

vorschalten um den Kram sofort zu bouncen?
 
Ich hab das bei mir in etwa genauso wie du eingerichtet. Lustigerweise hatte ich auch mal vor das entsprechend umzustellen fand aber noch keine Zeit dafür. Selten kommt es mal vor, dass ein bounce wegen der Konfig hängen bleibt, da hast du Recht. Bei mir hat es bisher noch nicht gestört, da es sich sehr in Grenzen hielt und die dann einfach irgendwann verworfen werden. Aber sag Bescheid wenn du eine Lösung findest... Ich hab leider aktuell keine Zeit das zu testen.
 
So wie ich es mir oben gedacht hatte, geht es leider nicht, wei ich virtual <vusers> nicht in der reject-Regel verwenden kann. Was aber geht ist
Code:
table recipients file:/etc/mail/recipients
...
reject from any for ! <recipients>
...
Braucht halt ein weiteres File, das nur die Empfänger-Adressen enthält:
Code:
foo@example.com
bar@example.com
baz@example.org
 
Zurück
Oben