# [Postfix] Routing abhängig von Sender-Adresse [gelöst]

## Advo

Hallo zusammen!

Ich habe ein kleines Heimnetz, das per dsl mit dem Internet verbunden ist. Als Mailserver setze ich Postfix (2.0.16) ein. Leider (oder Gott sei Dank) blockieren ja viele Provider dial-up IP's, also muß die Post per relayhost ausgeliefert werden. Einer "meiner" Nutzer administriert nun mehrere Webseiten. Daher wäre es schön, abhängig von der Sender-Adresse jeweils den zur Domäne gehörenden Mailserver als Relay zu nutzen. "sender_based_routing" existiert laut postconf -d bzw. -d nicht. Beim Googlen bin ich  hier auf folgendes gestoßen: *Quote:*   

> Natürlich kann Postfix ein Routing in Abhängigkeit der Absendermailadresse. Dazu kann man in einer access-Table, die man mittels "check_sender_access" abfragt, einfach ein "FILTER smtp:netxhop" gesetzt, wobei "nexthop" eben ein anderer Mailserver sein kann

 

So richtig werde daraus allerdings nicht schlau. Kann das jemand allgemeinverständlich erklären oder hat sonst einer eine Lösung für mein Problem?

~ AdvoLast edited by Advo on Mon Apr 26, 2004 11:25 am; edited 1 time in total

----------

## steveb

das ist eigendlich ganz einfach. 

auf der von dir gelinkten seite sind zwei varianten aufgeführt.

die eine ist über die transport tabelle gelöst:

du musst in deiner transport tabelle einen eintrag für die domäne machen und dann den server spezifizieren, welcher das mail für die domäne empfängt. zum beispiel:

$cat /etc/postfix/transport

```
@meine.domain.de smtp:isp.domain.de

@meine.andere.domain.de smtp:[123.123.123.123]
```

das kannst du natürlich beliebig erweitern und so viele domänen einstellen wie du willst.

die andere variante geht über die access tabelle. in der access tabelle definierst du normalerweise die zugriffe fürs mail. aber genau dort kannst du auch einen nexthop (nächster schritt oder nächster server in der sende-schlange) spezifizieren. zum beispiel:

$cat /etc/postfix/access

```
advo.seine.domain.de OK 

advo.andere.domain.de OK 

meine.dritte.domain OK

spamer-adresse.de REJECT

weitergeleitete.domain.de smtp:isp.domain.de
```

am besten du schaust dir mal die beispiele von deine postfix an:

```
ls /usr/share/doc/postfix-*/sample/sample-*-access.cf -lah
```

damit die access tabelle funktioniert, musst du sie bei den 

smtpd_sender_restrictions aktivieren (einfach die option "check_sender_access" einstellen und auf die access tabelle zeigen). zum beispiel:

```
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access
```

das muss übrigens nicht zwingend eine hash tabelle sein. es kann auch durchaus eine mysql tabelle sein. aber das würde zu weit führen, dir das alles zu erklären. ich auf jeden fall habe bei mir alles in einer mysql tabelle gelegt.

gruss

SteveB

----------

## Advo

Danke für Deine Erklärung. Die erste Methode (transport-map) paßt bei mir nicht, weil da entsprechend der Empfänger-Adresse geroutet wird. Es soll zwar mit "sender_based_routing" möglich sein, daß nach Absender entschieden wird. Aber die Options gibt's bei meinem Postfix nicht.

Variante zwei ist da schon interessanter. Macht, soweit ich das nach ein paar Tests sagen kann, auch das was ich will. Die Sache hat nur einen Haken: Schickt jemand aus dem lokalen Netz eine Mail einem anderen lokalen User an dessen nichtlokale Adresse mit seiner nichtlokalen Absender-Adresse, dann springt die Mail zwischen meinem Server und dem ISP-Server hin und her. Ist ja auch logisch, weil mit FILTER:[nexthop] die lokale Auslieferung verhindert wird. Ich suche grade noch nach einer eleganten Lösung, den Loop zu verhindern. Im Zweifel muß wohl jede externe Adresse in der transport-map abgefangen werden. Gott sei Dank ist mein Netz hier nicht sehr groß, da brauch dann keine Datenbank dahinter stehen:)

Oder hat jemand eine bessere Idee?

~Advo

----------

## Carlo

Wir hatten schon zwei Threads zu diesem Thema im deutschen Forum. Such mal ein bißchen!

Carlo

----------

## Advo

Die Threads, die ich gefunden habe, verweisen nur auf exim als "leichtere" Alternative. Bevor ich umsteige und mir (mal wieder) eine komplett andere Syntax zu Gemüte führen muß, will ich alle Möglichkeiten im bestehenden System ausloten. Und bis auf den seltenen Fall Lokaler --> Lokaler mit jeweils externen Adressen funzt es ja.

~ Advo

----------

## Carlo

Du hast alle Möglichkeiten ausgelotet. Leider.

Carlo

----------

## Advo

Einen hab' ich noch, Einen hab' ich noch  :Very Happy: 

Die Mails aus den externen Postfächern werden per fetchmail abgeholt, die kann ich an Postfix vorbeischleusen. Bleibt noch das Szenario, daß jemand von außerhalb mit einer Absenderadresse, die im access-file steht, Mail direkt zustellen will. Dafür bräuchte man dann einen doppelten Filter, also sowas wie (vereinfacht)

```
 wenn From=<eine.weitergeleitete.domain> && !mynetworks dann liefere gleich lokal aus.
```

Ich hab' Dokumentationen und Howto's gewälzt, aber bisher keine sinnvolle Lösung gefunden, wie man das anstellt.

~ Advo

p.s.: Ich weiß natürlich, daß ein eigener Mailserver zum Mailempfang bei Dial-Up's eigentlich Unsinn ist, von daher wäre das Beschränken auf lokale Clients die simpelste Lösung. Mich hat aber doch irgendwie der sportliche Ehrgeiz gepackt  :Cool: 

----------

## Advo

Sooo, einen weiteren Abend vorm Rechner gehockt, aber ich glaube, daß Problem ist für mein Setup zufriedenstellend gelöst  :Very Happy: 

Wen's interessiert:

1. In der master.cf habe ich folgende Zeilen eingefügt:

```

192.168.1.3:smtp inet  n       -       n       -       -       smtpd

  -o smtpd_recipient_restrictions=hash:/etc/postfix/access.client,permit_mynetworks,reject_unauth_destination

  -o smtpd_sender_restrictions=hash:/etc/postfix/access.sender,permit_mynetworks,reject

```

2. In der main.cf mußte dann noch inet_interfaces gesetzt werden:

```
inet_interfaces = $myhostname,localhost
```

Dabei darf $myhostname nicht die eigene (lokale) Domain enthalten.

Das bewirkt, das alle über das LAN-Interface (192.168.1.3) eingehenden Mails gefiltert werden:

Zuerst nach Empfänger in der Datei access.client, damit Mail externe Adressen von lokalen Benutzern nicht den Umweg über den Provider machen müssen. Damit das funktioniert, muß natürlich die virtual-Datei entsprechend angepaßt werden

Gibt es hier keinen Treffer (=Mail an externen Empfänger), wird nach der Absender in der access.sender geschaut und das entsprechende Relay zum Versand benutzt.

Das ist eigentlich schon alles. Wahrscheinlich nicht besonders elegant, aber läuft. Bis jetzt habe ich jdenfalls noch keine Probleme gehabt, aber ich behalte die Logs mal lieber im Auge.

~ Advo

----------

## kf

Hallo,

die oben von Advo beschriebene Lösung bekomme ich leider nicht funktionsfähig. Kann mir bitte mal jemand mitteilen was in meinen configs noch geändert werden muss?

Ich habe zwei Nutzer bei verschiedenen Providern

user1@t-online.de und user2@gmx.de

sie haben lokal einen Account us1 und us2

Postfix 2.0.19

$postconf -n

```

alias_database = hash:/etc/mail/aliases

alias_maps = hash:/etc/mail/aliases

command_directory = /usr/sbin

config_directory = /etc/postfix

daemon_directory = /usr/lib/postfix

debug_peer_level = 2

default_destination_concurrency_limit = 2

home_mailbox = .maildir/

inet_interfaces = sonne, localhost

local_destination_concurrency_limit = 2

mail_owner = postfix

mailq_path = /usr/bin/mailq

manpage_directory = /usr/share/man

mydestination = $myhostname, localhost.$mydomain $mydomain

mydomain = localnet

myhostname = sonne.localnet

mynetworks = 127.0.0.0/8, 192.168.0.0/24

mynetworks_style = subnet

myorigin = $myhostname

newaliases_path = /usr/bin/newaliases

queue_directory = /var/spool/postfix

readme_directory = /usr/share/doc/

sample_directory = /etc/postfix/sample

sendmail_path = /usr/sbin/sendmail

setgid_group = postdrop

unknown_local_recipient_reject_code = 450

virtual_alias_maps = hash:/etc/postfix/virtual

```

$cat /etc/postfix/virtual

```

user1@t-online.de    us1@localhost

user2@gmx.de     us2@localhost

```

$cat /etc/postfix/access.client

```

user1@t-online.de OK

user2@gmx.de OK

```

$cat /etc/postfix/access.sender

```

t-online.de   smtp:mailto.t-online.de

gmx.de   smtp:mail.gmx.de

```

Vielen Dank

kf

----------

## Advo

Ich sehe erstmal nichts problematisches. Poste doch bitte mal die master.cf und den Log-Eintrag beim versenden.

----------

## kf

Hi,

ok, hier nun die gewünschten Infos:

$cat /etc/postfix/master.conf

```

# ==========================================================================

# service type  private unpriv  chroot  wakeup  maxproc command + args

#               (yes)   (yes)   (yes)   (never) (100)

# ==========================================================================

#smtp      inet  n       -       n       -       -       smtpd

#smtps    inet  n       -       n       -       -       smtpd

#  -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes

#submission     inet    n       -       n       -       -       smtpd

#  -o smtpd_enforce_tls=yes -o smtpd_sasl_auth_enable=yes

#628      inet  n       -       n       -       -       qmqpd

pickup    fifo  n       -       n       60      1       pickup

cleanup   unix  n       -       n       -       0       cleanup

qmgr      fifo  n       -       n       300     1       qmgr

#qmgr     fifo  n       -       n       300     1       nqmgr

#tlsmgr   fifo  -       -       n       300     1       tlsmgr

rewrite   unix  -       -       n       -       -       trivial-rewrite

bounce    unix  -       -       n       -       0       bounce

defer     unix  -       -       n       -       0       bounce

flush     unix  n       -       n       1000?   0       flush

proxymap  unix  -       -       n       -       -       proxymap

smtp      unix  -       -       n       -       -       smtp

relay     unix  -       -       n       -       -       smtp

#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5

showq     unix  n       -       n       -       -       showq

error     unix  -       -       n       -       -       error

local     unix  -       n       n       -       -       local

virtual   unix  -       n       n       -       -       virtual

lmtp      unix  -       -       n       -       -       lmtp

#

maildrop  unix  -       n       n       -       -       pipe

  flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}

#

old-cyrus unix  -       n       n       -       -       pipe

  flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user}

# Cyrus 2.1.5 (Amos Gouaux)

cyrus     unix  -       n       n       -       -       pipe

  user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}

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=foo argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient

smtp       inet  n       -       n       -       -       smtpd

     -o smtpd_recipient_restrictions=hash:/etc/postfix/access.client,permit_mynetworks,reject_unauth_destina

     -o smtpd_sender_restrictions=hash:/etc/postfix/access.sender,permit_mynetworks,reject

```

$/etc/init.d/postfix restart

und versuchtes senden einer Mail an einen externen Empfänger.

Thunderbird meldet beim versenden nur einen falsch konfigurierten Server.

der relevante Log-Auszug:

```

Jul 31 14:02:11 [postfix/master] daemon started -- version 2.0.19

Jul 31 14:02:27 [postfix/smtpd] connect from sonne.localnet[192.168.0.97]

Jul 31 14:02:27 [postfix/smtpd] BAE9393FE6: client=sonne.localnet[192.168.0.97]

Jul 31 14:02:27 [postfix/smtpd] warning: SMTPD access map hash:/etc/postfix/access.sender has entry with lookup table: smtp:t-online.de

Jul 31 14:02:27 [postfix/smtpd] warning: do not specify lookup tables inside SMTPD access maps

Jul 31 14:02:27 [postfix/smtpd] warning: define a restriction class and specify its name instead.

Jul 31 14:02:27 [postfix/smtpd] BAE9393FE6: reject: RCPT from sonne.localnet[192.168.0.97]: 451 Server configuration error; from=<user1@t-online.de> to=<user@egal.de> proto=ESMTP helo=<[192.168.0.97]>

Jul 31 14:02:36 [postfix/smtpd] lost connection after RCPT from sonne.localnet[192.168.0.97]

Jul 31 14:02:36 [postfix/cleanup] 1543293FE9: message-id=<20040731120236.1543293FE9@sonne.localnet>

Jul 31 14:02:36 [postfix/qmgr] 1543293FE9: from=<double-bounce@sonne.localnet>, size=835, nrcpt=1 (queue active)

Jul 31 14:02:36 [postfix/smtpd] disconnect from sonne.localnet[192.168.0.97]

Jul 31 14:02:36 [postfix/local] 1543293FE9: to=<root@sonne.localnet>, orig_to=<postmaster>, relay=local, delay=0, status=sent (maildir)

```

Aber gerade die lookup tables bringen doch hier die gewünschte die Funktionalität, oder?

$/etc/init.d/postfix restart

und versuchtes senden einer Mail an einen internen Empfänger über seine externe Adresse: (auch hier sagt Thunderbird falsch konfigurierter Server)

```

Jul 31 14:28:52 [postfix/master] daemon started -- version 2.0.19

Jul 31 14:29:03 [postfix/smtpd] connect from sonne.localnet[192.168.0.97]

Jul 31 14:29:03 [postfix/smtpd] D4D5393FF0: client=sonne.localnet[192.168.0.97]

Jul 31 14:29:03 [postfix/smtpd] warning: SMTPD access map hash:/etc/postfix/access.sender has entry with lookup table: smtp:t-online.de

Jul 31 14:29:03 [postfix/smtpd] warning: do not specify lookup tables inside SMTPD access maps

Jul 31 14:29:03 [postfix/smtpd] warning: define a restriction class and specify its name instead.

Jul 31 14:29:03 [postfix/smtpd] D4D5393FF0: reject: RCPT from sonne.localnet[192.168.0.97]: 451 Server configuration error; from=<user1@t-online.de> to=<user2@gmx.de> proto=ESMTP helo=<[192.168.0.97]>

Jul 31 14:29:13 [postfix/smtpd] lost connection after RCPT from sonne.localnet[192.168.0.97]

Jul 31 14:29:13 [postfix/cleanup] 3CA5693FF1: message-id=<20040731122913.3CA5693FF1@sonne.localnet>

Jul 31 14:29:13 [postfix/qmgr] 3CA5693FF1: from=<double-bounce@sonne.localnet>, size=812, nrcpt=1 (queue active)

Jul 31 14:29:13 [postfix/smtpd] disconnect from sonne.localnet[192.168.0.97]

Jul 31 14:29:13 [postfix/local] 3CA5693FF1: to=<root@sonne.localnet>, orig_to=<postmaster>, relay=local, delay=0, status=sent (maildir)

```

$/etc/init.d/postfix restart

und schliesslich noch das erfolgreiche senden einer Mail an einen internen Empfänger über seine interne Adresse:

```

ul 31 14:17:49 [postfix/master] daemon started -- version 2.0.19

Jul 31 14:20:28 [postfix/pickup] 4635193FF0: uid=1006 from=<us1>

Jul 31 14:20:28 [postfix/cleanup] 4635193FF0: message-id=<20040731122028.GA3907@sonne.localnet>

Jul 31 14:20:28 [postfix/qmgr] 4635193FF0: from=<us1@sonne.localnet>, size=409, nrcpt=1 (queue active)

Jul 31 14:20:28 [postfix/local] 4635193FF0: to=<us2@sonne.localnet>, orig_to=<us2@sonne>, relay=local, delay=0, status=sent (maildir)

```

Vielen Dank

kf

----------

## kf

Hat denn niemand eine Idee wie das klappen könnte?

----------

## Advo

Der Witz an meinem Setup ist, das Postfix auf einem separaten Rechner läuft (interne IP ist 192.168.1.3), der die Rechner im LAN mit dem Internet verbindet. Die Idee ist daher, die Mails aus dem internen Netz anders zu behandeln als den Rest. Das funktioniert bei mir, indem Postfix an der Netzwerkkarte, die zum LAN "zeigt", quasi einen zweiten "Server" startet und die dort empfangenen Mails durch die entsprechenden Filter schleust. Das geschieht durch folgenden Eintrag in der master.cf:

```
192.168.1.3:smtp inet  n       -       n       -       -       smtpd

  -o header_checks=regexp:/etc/postfix/header_checks

  -o smtpd_recipient_restrictions=hash:/etc/postfix/access.client,permit_mynetworks,reject_unauth_destination

  -o smtpd_sender_restrictions=hash:/etc/postfix/access.sender,permit_mynetworks,reject
```

Dein Problem mit der access.sender liegt imho darin, daß du keine Aktion definiert hast, die ausgeführt werden soll. Mein entsprechender Eintrag sieht z.B. so aus:

```
user@gmx.net                 FILTER smtp:[mail.gmx.net]
```

.

Hoffe, das hilft Dir erstmal weiter.

Grüße, Advo

----------

## kf

Dankeschön Advo. 

Jetzt funktioniert das versenden der Mails abhängig vom Absender, 

allerdings geht nun das lokale zustellen (von lokalen Absendern) nicht.

Beim senden einer Mail an einen internen Empfänger über seine externe Adresse:

```

Aug  5 10:01:10 [postfix/smtpd] 7C00C93797: filter: RCPT from sonne.localnet[192.168.0.97]: <user1@t-online.de>: Sender address triggers FILTER smtp:[mailto.t-online.de]; from=<user1@t-online.de> to=<user2@gmx.de> proto=ESMTP helo=<[192.168.0.97]>

```

$mailq

```

7C00C93797*     546 Thu Aug  5 10:01:10  user1@t-online.de

                                         us2@sonne.localnet

```

user2@gmx.de wurde also schon korrekt in die lokale Adresse us2@sonne.localnet umgesetzt, 

es scheint sich um das von Dir bereits beschriebene Problem (3. Post) zu handeln:

Der Eintrag in der access.sender verhindert das lokale zustellen und versucht es über den Provider, 

dieser kann jedoch mit der lokalen Adresse nichts anfangen und schickt sie zurück.

Das Problem ist wohl die Reihenfolge der Abarbeitung der UCEs. 

Wahrscheinlich bearbeitet Postfix die smtpd_sender_restrictions VOR smtpd_recipient_restrictions, sonst würde die o.g. Mail doch ankommen und nicht über den Provider rausgehen? Postfix läuft bei mir nun aber nur auf einem Rechner im lokalen Netz hinter einem Router, der Trick mit dem filtern nach dem Interface klappt hier also nicht.

Ich habe nun erstmal die virtual und die access.client auskommentiert, wäre aber weiterhin an einer Lösung interessiert.

Wie kann man lokale Empfänger sofort zustellen, unabhängig vom Absender?

Dank & Gruss

kf

----------

## Advo

 *kf wrote:*   

> Dankeschön Advo. 
> 
> Jetzt funktioniert das versenden der Mails abhängig vom Absender

 Schön  :Smile:  *kf wrote:*   

> 
> 
> allerdings geht nun das lokale zustellen (von lokalen Absendern) nicht.

 Weniger schön  :Sad:  *kf wrote:*   

> 
> 
> user2@gmx.de wurde also schon korrekt in die lokale Adresse us2@sonne.localnet umgesetzt, 
> 
> es scheint sich um das von Dir bereits beschriebene Problem (3. Post) zu handeln:
> ...

 Sieht so aus. Die Lösung steht übrigens dann im 4. Post  :Wink: . Meine access.client sieht etwas anders aus als bei dir (ist mir beim ersten Lesen entgangen), da wird die Mail bei bestimmten Empfängern nämlich schon umgeleitet:

```

user@gmx.net                 FILTER local:
```

Und das dann für jede einzelne Adresse. Wie gesagt, beim kleinen Netzwerk ist das ein vertretbarer Aufwand.

Grüße, Advo

----------

## kf

DANKESCHÖN! 

Jetzt läuft wirklich alles wie gewünscht.

Mit dankbaren Grüßen

kf

----------

