Levelezőszerver telepítése - a Postfix beállítása

A sorozat eddigi részeiben összeállítottunk egy működőképes levelezőszervert és részletesebben megvizsgáltuk az egyes összetevők működését, feladatait és egymáshoz való kapcsolódásukat is. Eljött az ideje annak, hogy foglalkozzunk az összetevők konkrét beállításaival és azok magyarázatával. Ebben a részben a Postfix levelezőszervert fogjuk kivesézni.

A Postfix beállításait tartalmazó konfigurációs fájlok a /etc/postfix mappában találhatóak. A két legfontosabb fájl a master.cf és a main.cf, de természetesen a többire is sort fogunk keríteni.

main.cf, master.cf

A main.cf a Postfix fő konfigurációs fájlja. A fájlt megjegyzések segítségével több részre osztottam, és a tárgyalás során is ugyanezt a felosztást fogom követni:

  • Alapvető beállítások
  • TLS paraméterek
  • Postfix Admin konfigurációs paraméterek
  • SASLAUTH beállítások
  • SMTPD HELO korlátozások
  • SMTPD feladóra vonatkozó korlátozások
  • SMTPD relay korlátozások
  • SMTPD címzettre vonatkozó korlátozásai
  • SMTPD adatra vonatkozó korlátozásai
  • Tartalmoszűrő beállítások

Ugyanakkor elkerülhetetlen, hogy az egyes beállításokat tartalmazó, master.cf fájlba való kiegészítéseket is megvizsgáljuk, mégpedig ott, ahol arra éppen szükség van. Így időről-időre belenézünk ebbe a fájlba is.

Lássunk neki!

Alapvető beállítások

Ebben a szekcióban a Postfix működésének alapvető jellemzőit állítottam be. Emlékeztetőül, az itt szereplő paraméterek:

myorigin = /etc/mailname
myhostname = mailserver.comega7.local
mydomain = comega7.local
mydestination = mailserver.comega7.local, localhost
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.100.0/24
inet_interfaces = all
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
append_dot_mydomain = no
biff = no
readme_directory = /usr/share/doc/postfix
html_directory = /usr/share/doc/postfix/html
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
relayhost =
mailbox_size_limit = 0
recipient_delimiter = +
notify_classes = resource, software
message_size_limit = 31457280

Nézzük meg akkor egyesével, hogy melyik beállítás mire szolgál:

myorigin = /etc/mailname
A helyben feladott levelek címében a @ után megjelenő tartománynév, amely jelenleg a levelezőszerver FQDN neve (mailserver.comega7.local). Mivel a szerverünk számos tartomány számára biztosít levelező szolgáltatást, így ennek a beállításnak most nem lesz szemmel látható hatása.
 
myhostname = mailserver.comega7.local
A levelezőszerver internetes (FQDN) neve.
 
mydomain = comega7.local
A levelezőszerver internetes nevének tartományra utaló része.
 
mydestination = mailserver.comega7.local, localhost
A Postfix ezeknek a tartományoknak biztosít helyben postafiókot. A címzettnek történő kézbesítéshez végignézi a /etc/passwd és a /etc/aliases fájlokat. Azokat a tartományokat, amelyek számára a szerverünk levelező szolgáltatást biztosít, itt nem szabad és nem is kell feltüntetni: erre a célra MySQL táblákat használunk (lásd később).
 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.100.0/24
Az ezekben a hálózatokban feltüntetett SMTP kliensek küldhetnek levelet a Postfixen keresztül. Éles szerverek esetén a szerver IP címét (nem pedig az egész alhálózatot) kell a végére beírni:
 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.100.200/32
Egy másik megoldás erre a beállításra a mynetworks_style paraméter használata. Nézz utána bátran!
 
Azok a hálózati interfészek, amelyeken keresztül a Postfix leveleket fogad. A jelenlegi beállítás szerint mindegyiken.
 
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
Az SMTP üdvözlő üzenetben a 220-as státusz kód után megjelenő szöveg. Minden esetben a $myhostname paraméterrel KELL kezdeni.
 
Helyben feladott leveleknél, ha hiányzik a címből a .tartománynév információ, a Postfix hozzáfűzi azt. Nekünk erre most nem lesz szükségünk.
 
biff = no
Használjuk-e vagy sem a helyi biff szolgáltatást. Hát nem fogjuk.
 
readme_directory = /usr/share/doc/postfix
A Postfix README fájlok elérési útvonala.
 
html_directory = /usr/share/doc/postfix/html
Ugyanez HTML formátumban.
 
alias_maps = hash:/etc/aliases
A helyi kézbesítési szolgáltatás alias adatbázisa. A helyi kézbesítési szolgáltatás a Linux rendszerfelhasználói számára kézbesít leveleket. Ha ezeket a rendszerfelhasználókat más név alatt is el szeretnénk érni, az erre vonatkozó aliasokat ebbe a fájlba kell felvenni.
 
#/etc/aliases
mailer-daemon:postmaster
postmaster:root
nobody:root
hostmaster:root
usenet:root
news:root
webmaster:root
www:root
ftp:root
abuse:root
noc:root
security:root
root:admin@comega7.local
clamav: root
Vagyis az egyes szolgáltatások leveleit a root felhasználó kapja, de helyette mindezeket az admin@comega7.local email címre továbbítjuk.
 
alias_database = hash:/etc/aliases
Ha a fenti fájlban módosítunk valamit, adjuk ki a newaliases parancsot. Ez létrehozza a /etc/aliases.db fájlt, amely a /etc/aliases hash-elt változata. Így az aliasok kikeresésének sebessége sokkal gyorsabb lesz.
 
Ha a leveleinket egy másik levelezőszerveren keresztül tudjuk továbbítani az internet felé, itt adhatjuk meg ennek a szervernek a nevét vagy IP címét. Mi közvetlenül küldjük el leveleinket, így ez a paraméter üres marad.
 
A helyi kézbesítési szolgáltatás (local) által kezelt mailbox vagy maildir fájlok maximális mérete. A nulla jelentése: korlátlan méret. A postafiókjaink azonban nem helyi, hanem virtuális postafiókok, így ez a beállítás rájuk nem vonatkozik: a kvóta adatokat a Postfx Admin alkalmazásban adjuk meg.
 
Ha szeretném különböző módon megjelölni az e-mail címemet (mert például az anonimwebshop.com oldalon regisztráltam), akkor megadhatom azt ezen a módon is: bolemanyi.attila+anonimwebshop@comega7.local, ahol a „+” jel az a bizonyos delimiter karakter. Az erre a címre érkező leveleket továbbra is az eredeti, bolemanyi.attila@comega7.local címre kapom meg. Ha viszont erre a megjelölt email címre özönleni kezdenek a kéretlen reklámlevelek, egy sieve szűrő segítségével elküldhetem azokat a kukába, az anonimwebshop.com oldalt pedig bejelenthetem ismert spammerként.
 
notify_classes = resource, software
Azoknak a hibáknak a csoportja, amelyek a postmaster helyi felhasználó számára lesznek jelentve. A fenti egyébként az alapértelmezett beállítás, így ez a sor el is hagyható.
 
A Postfix által kézbesített üzenet maximális mérete (fejlécadatokkal együtt), bájtokban megadva.
 

TLS paraméterek

Ezek a paraméterek határozzák meg a Postfix szerver TLS kapcsolatának jellemzőit:

smtpd_tls_cert_file = /etc/postfix/ssl/certs/postfix.pem
smtpd_tls_key_file = /etc/postfix/ssl/private/postfix.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes

smtpd_tls_cert_file = /etc/postfix/ssl/certs/postfix.pem
A titkosított SMTP kapcsolathoz szükséges RSA tanúsítvány, PEM formátumban. A Postfix telepítésének leírásában megmutattam, hogyan készíthetünk saját magunk által aláírt tanúsítványt.

smtpd_tls_key_file = /etc/postfix/ssl/private/postfix.key
A titkosított SMTP kapcsolathoz szükséges RSA privát kulcs, PEM formátumban.
 
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
A Postfix SMTP szerver TLS munkameneteinek cache fájlja.
 
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
A Postfix SMTP kliens TLS munkameneteinek cache fájlja.
 
smtpd_tls_security_level = may
A Postfix bejelenti a STARTTLS támogatást a távoli SMTP kliensek számára, de nem követeli meg a titkosított kapcsolat felépítését. Publikus SMTP szerverek esetén tilos az encrypt paraméter használata (hiszen egy levelezőszerver sem kényszeríthető, hogy titkosított kapcsolaton keresztül küldje el felhasználóinknak a levelet. A levelezőkliensek persze más lapra tartoznak, de erről picit később).
 
smtpd_tls_auth_only = yes
Ha az SMTP kapcsolat során felhasználói hitelesítés történik, kötelező a titkosított – TLS – kapcsolat használata.
 

Postfixadmin beállítások

Ebben a szekcióban azok a beállítások találhatóak, amelyek biztosítják a Postfix Admin alkalmazás és a Postfix levelezőszerver együttműködését: például a MySQL táblákban rögzített levelezési tartományoknak, postafiókoknak és aliasoknak a Postfix szerver által történő használatát.

virtual_gid_maps = static:5000
virtual_uid_maps = static:5000

dovecot_destination_recipient_limit = 1
virtual_transport = dovecot
virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
virtual_alias_maps =
	proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
	proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
	proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
virtual_mailbox_maps =
	proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
	proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
virtual_gid_maps = static:5000
Annak a rendszerfelhasználó csoportjának azonosítója (a csoport neve jelen esetben vmail), amelynek tulajdonában a postafiókokat tartalmazó mappa van a szerver fájlrendszerében.
 
virtual_uid_maps = static:5000
Annak a rendszerfelhasználónak az azonosítója (a felhasználó neve jelen esetben vmail), amelynek tulajdonában a postafiókokat tartalmazó mappa van a szerver fájlrendszerében.
 
dovecot_destination_recipient_limit = 1
virtual_transport = dovecot
A két paraméter biztosítja azt, hogy a virtuális felhasználók postafiókjaiba a Dovecot szerver LDA-ja (Local Delivery Agent – helyi levéltovábbító ügynök) kézbesítse a levelet. Annak érdekében, hogy ez működjön, szükség van egy új szolgáltatás rögzítésére a master.cf fájlban is:
 
dovecot unix   - n n - - pipe
    flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop}
 
virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
A Postfix Admin MySQL táblákban rögzíti azokat a tartományokat, amelyekre nézve szerverünk levelező szolgáltatást biztosít. A paraméterben megadott fájlban található SQL kapcsolódási adatok és lekérdezés segít a Postfixnek kideríteni, hogy egy kérdéses tartomány részére biztosítja-e ezt a szolgáltatást. A proxy direktívával elérhetjük azt, hogy a Postfix nem nyit minden ilyen lekérdezéshez új MySQL kapcsolatot, hanem felhasználja a már meglévőt.
 
virtual_mailbox_maps =
proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
A postafiókok lekérdezésére szolgáló SQL paramétereket és lekérdezéseket tartalmazó fájlok elérési útvonalai.
 
virtual_alias_maps =
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
A postafiók aliasok lekérdezésére szolgáló SQL paramétereket és lekérdezéseket tartalmazó fájlok elérési útvonalai.
 

SASLAUTH beállítások

A levelezőszerver felhasználóinak lehetőségük van felhasználói hitelesítés után levelet küldeni a szerver segítségével. Ennek a hitelesítésnek a jellemzőit határozzuk meg az alábbiakban.

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
A felhasználók SMTP hitelesítését a Dovecot szerver végzi.

smtpd_sasl_auth_enable = yes
A felhasználói hitelesítés engedélyezése.

smtpd_sasl_local_domain = $myhostname
A Postfix SMTP szerver helyi SASL hitelesítési tartománya. A Postfix Admin alkalmazásban rögzített postafiókokra ennek a beállításnak semmilyen hatása nincsen.

smtpd_sasl_security_options = noanonymous
Az anonymous hitelesítési módszerek kizárása.

smtpd_sasl_authenticated_header = yes
A levél átvételekor rögzíti a hitelesített felhasználó felhasználói nevét is az üzenet fejlécében (hasznos, tehát kell).

broken_sasl_auth_clients = yes
Az AUTH parancs régi változatát használó SMTP kliens programok támogatása. Bár igazából nem érdemlik meg.

SMTP párbeszéd

A következő beállítások megértéséhez szükség van arra, hogy megnézzük, mi történik egy SMTP kapcsolat során. Így egy kis kitérővel vizsgáljuk meg két levelezőszerver párbeszédét, amint az egyik levelet küld a másiknak. Ehhez a TELNET parancsot hívom segítségül, és eljátszom egy levelet küldő szerver - jelen esetben az SMTP kliens - szerepét.

attila@Earth:~$telnet mailserver.comega7.local 25
Trying 192.168.0.200...
Connected to comega7.local.
Escape character is '^]'.
220 mailserver.comega7.local ESMTP Postfix (Debian/GNU)
HELO mail01.comega7.hu
250 mailserver.comega7.local
MAIL FROM:<bolemanyi.attila@comega7.hu>
250 2.1.0 Ok
RCPT TO:<bolemanyi.attila@comega7.local>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
To:<bolemanyi.attila@comega7.local>
From:<bolemanyi.attila@comega7.hu>
Subject:SMTP test
This is the test message...
.
250 2.0.0 Ok: queued as 9ECC3BF952
QUIT
221 2.0.0 Bye
Connection closed by foreign host.

A félkövérrel szedett sorok az SMTP kliens által küldött üzenetek. Az egyes sorok jelentését a következő oldalakon részletesen megvizsgáljuk.

Látható, hogy a párbeszéd szigorúan kötött elemeket tartalmaz, amelyekről egyébként több RFC is rendelkezik. A kéretlen reklámlevelek küldői gyakran próbálnak meg úgy időt spórolni (hogy minél több levelet juttassanak célba minél rövidebb idő alatt), hogy ezeket az RFC-kben lefektetett előírásokat szándékosan figyelmen kívül hagyják. A Postfix azonban megkérhető arra, hogy a legalaposabb szigorúsággal lépjen fel az ilyen szabályszegőkkel szemben, és utasítsa vissza az ilyen módon elküldeni kívánt (és ezért szinte biztosan kéretlen reklám) levelet. Ezek az ellenőrzések minimális erőforrások felhasználásával képesek kiszűrni a spamek nagy részét, így az erőforrásigényes tartalomszűrési feladatokat már jóval kevesebb levéllel kapcsolatban kell majd elvégezni.

smtpd_client_restrictions

Kezdjünk neki a kapcsolódásnak:

~$telnet mailserver.comega7.local 25
Trying 192.168.0.200...
Connected to comega7.local.
Escape character is '^]'.
220 mailserver.comega7.local ESMTP Postfix (Debian/GNU)

Eddig a pontig látszólag nem történt semmi, de ez tényleg csak a látszat. A teszt konfigurációban nem használtuk ki a Postfix szerver smtpd_client_restrictions adta lehetőségeit, amelynek segítségével az SMTP kliensekre nézve hozhatunk korlátozó szabályokat.

Ha vannak ilyen szabályok, de eljutottunk a 220-as kóddal kezdődő sorig, akkor a levelező kliens sikerrel vette ezt az első akadályt.

smtpd_helo_restrictions

A következő lépés a kölcsönös bemutatkozásé. A kapcsolódás során a fogadó szerver bemutatkozik a küldőnek:

220 mailserver.comega7.local ESMTP Postfix (Debian/GNU)

Természetesen a küldő szervernek is meg kell tennie ugyanezt:

HELO mail01.comega7.hu

Ha a fogadó szerver elfogadja ezt a bemutatkozást, akkor a 250-es kóddal válaszol (azaz jelen esetben elfogadja a megadott nevet):

250 mailserver.comega7.local

A Postfix szerver main.cf fájljában meghatároztunk erre a bemutatkozásra vonatkozó szabályokat, az alábbiak szerint:

smtpd_delay_reject = yes
smtpd_helo_required = yes
smtpd_helo_restrictions =
    permit_mynetworks,
    check_helo_access
        hash:/etc/postfix/helo_access,
    reject_non_fqdn_helo_hostname,
    reject_invalid_helo_hostname,
    permit

smtpd_delay_reject = yes
Arra kéri a Postfix szervert, hogy a kliens által küldött RCP TO parancsig ne értékelje ki az smtpd_client_restrictions, az smtpd_helo_restrictions és az smtpd_sender_restrictions szekciókban megadott szabályokat.

smtpd_helo_required = yes
Kényszeríti az SMTP klienst, hogy tisztességesen mutatkozzon be a HELO vagy az EHLO paranccsal, mielőtt elkezdene levelet küldeni.

smtpd_helo_restrictions =
Ebben a blokkban a HELO parancs után megadott név alapján hozhatunk döntéseket a klienssel kapcsolatban. Az ezután következő sorok szándékosan nem a sor elején kezdődnek. A permit_mynetworks a $mynetworks változóban szereplő számítógépekre úgy tekint, hogy azok eleget tettek a kérdéses követelményeknek. A /etc/postfix/helo_access fájl egy fehér- és feketelistát is tartalmazható fájl, amelynek a hash-elt változatát fogja a Postfix megvizsgálni. A fájl tartalma:

mailserver.comega7.local REJECT
comega7.local            REJECT
192.168.0.200            REJECT

Vagyis ha a kliens a fenti nevek vagy IP cím valamelyikén mutatkozik be, biztosan csalóról van szó, így bontjuk velel a kapcsolatot. A hash-elt változatot a postmap parancs segítségével készíthetjük el.

reject_non_fqdn_helo_hostname
A kliens elutasításra kerül, ha a HELO paranccsal megadott neve nem FQDN név.

reject_invalid_helo_hostname
A kliens elutasításra kerül, ha a HELO paranccsal megadott neve nem szabályos számítógépnév.

permit
A szolgáltatás (jelen esetben a bemutatkozás elfogadásának kérelme) engedélyezése. Ha az eddigi szabályokon a kliens átjutott, akkor a HELO követelményeket teljesítettnek tekintjük, jöhet a további szabályok vizsgálata.

smtpd_sender_restrictions

MAIL FROM:<bolemanyi.attila@comega7.hu>
250 2.1.0 Ok

A következő - smtpd_sender_restrictions - szekció a MAIL FROM parancs segítségével megadott feladó email címére nézve tartalmaz alkalmazandó szabályokat. Ha ezeknek a szabályoknak a kliens megfelel, a Postfix a 250-es kóddal válaszol.

smtpd_sender_restrictions =
    permit_sasl_authenticated,
    permit_mynetworks,
    reject_non_fqdn_sender,
    reject_unknown_sender_domain,
    permit
permit_sasl_authenticated
Ha a kliens az SMTP kapcsolat során hitelesíti magát felhasználói név és jelszó segítségével, akkor elfogadjuk.
 
permit_mynetworks
A $mynetworks változó értékeire illeszkedő számítógépeket is elfogadjuk.
 
reject_non_fqdn_sender
Ha a MAIL FROM parancs után megadott email cím nem teljesen minősített tartományformátumban van megadva, elutasítjuk.
 
reject_unknown_sender_domain
A klienst elutasítjuk, ha a MAIL FROM után megadott email cím tartományneve nem tartalmaz a DNS-ben MX és A rekordokat, vagy az MX rekord szabálytalan (például nulla hosszúságú) nevet tartalmaz.
 
permit
Ha az előző szabályoknak a kliens megfelelt, akkor továbbengedjük. Egészen a következő vizsgálatig. :-)
 

smtpd_relay_restrictions

RCPT TO:<bolemanyi.attila@comega7.local>
250 2.1.5 Ok

A következő párbeszéd-részlet a címzettre vonatkozóan tartalmaz információt: a kliens az RCPT TO parancs után megadja, hogy kinek szánja a kézbesítendő levelet. Erre nézve két szekció is tartalmazhat szabályokat, amelyekből az első az smtpd_relay_restrictions.

smtpd_relay_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    defer_unauth_destination,
    permit

A permit_mynetworks, a permit_sasl_authenticated és a permit szerepe ugyanaz, mint eddig.

defer_unauth_destination
Ez a sor kritikus fontossággal bír: ha a levél címzettjének postafiókja nem a mi szerverünkön található, akkor elutasítjuk. Enélkül Postfix szerverünk open relay kiszolgáló lenne, azaz bárki, ismétlem, bárki számára továbbítana leveleket az interneten!
 

smtpd_recipient_restrictions

Szintén az RPC TO parancs által megadott email címhez (a címzett) kapcsolódó szabályokat állíthatunk fel az smtpd_recipient_restrictions szekcióban.

smtpd_recipient_restrictions =
    permit_mynetworks,
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain,
    reject_rbl_client zen.spamhaus.org,
    reject_rbl_client bl.spamcop.net,
    permit

A permit_mynetworks és a permit szerepét már ismered.

reject_non_fqdn_recipient
Ha a címzett email címe nem teljesen minősített tartományformátumban van, nem engedjük tovább.
 
reject_unknown_recipient_domain
Ha a címzett tartománya nem létező vagy nem létezhet, akkor sem engedjük tovább.
 
reject_rbl_client zen.spamhaus.org
reject_rbl_client bl.spamcop.net
Mielőtt a költségesebb tartalomszűrésre kerülne a sor, igénybe vehetünk még néhány nyilvános feketelista szolgáltatást is a kliens IP címére alapozva. Sok ilyen szolgáltatás elérhető, én a leginkább ezt a kettőt használom, eddig beváltak.
 

smtpd_data_restrictions

DATA
354 End data with <CR><LF>.<CR><LF>
To:<bolemanyi.attila@comega7.local>
From:<bolemanyi.attila@comega7.hu>
Subject:SMTP test
This is the test message...
.
250 2.0.0 Ok: queued as 9ECC3BF952

Ha a kliens eddig eljutott, jöhet a levél is. De maradt még egy szabálygyűjteményt biztosító szekció - az smtpd_data_restrictions -, nézzük meg ezt is:

smtpd_data_restrictions =
    reject_unauth_pipelining
reject_unauth_pipelining
Ha a kliens feltűnően igyekszik minél több parancsot küldeni a válaszok megvárása nélkül, akkor biztosan rosszban sántikál. Zavarjuk el valahová máshová!
 
Amennyiben a kliens befejezi a levél továbbítását, az utolsó sorba csak egy pontot tesz. Ha eddig a pontig minden rendben lezajlott, a Postfix elhelyezi a levelet a várakozási sorba (queue). Ez pedig egy nagyon fontos állomás. Ha az összes eddigi korlátozó szabály ellenére mégis bejutott néhány spam a rendszerbe, azt már a tartalomszűrő rendszernek kell megtalálnia.
 

Tartalomszűrő beállítások

A main.cf fájlban szükség lesz erre a sorra:

content_filter = amavis:[127.0.0.1]:10024

Ez arra utasítja a Postfix szervert, hogy a levelet tartalomszűrésre adja át az amavis nevű szolgáltatásnak, amely a localhost interfész 10024-es portján várja az átvizsgálandó leveleket. Ehhez természetesen szükség lesz a master.cf fájlban is néhány új sor bejegyzésére:

amavis unix - - - - 2 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 - - - - smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -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_relay_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 receive_override_options=no_header_body_checks,no_unknown_recipient_checks

Az amavis bejegyzés meghatározza a Postfix számára az Amavis tartalomszűrő szolgáltatást.

A localhost 10025-ös portján keresztül egy újabb SMTP szervert indítunk, amelynek egyetlen feladata az, hogy az Amavis által átvizsgált levelet itt juttatjuk vissza a Postfix várakozási sorába, a queue-ba. A sok -o (options) sor lényege az, hogy mindazokat az ellenőrzéseket, amelyeket eddig a main.cf fájlban definiáltunk (helo, sender, recipient, relay és data restrictions blokkok), azokat itt mind kiiktatjuk. Teljesen felesleges ugyanezeket az ellenőrzéseket még egyszer elvégezni, és a helyi Amavis szolgáltatástól csak nem utasítunk el olyan levelet, amit maga a Postfix adott át neki ellenőrzésre úgy, hogy azt az eredeti küldőtől már egyszer elfogadta.

És végül az utolsó sor a main.cf fájlból:

receive_override_options = no_address_mappings

A beállítás megakadályozza az email címek manipulálását a tartalomszűrés elvégzése előtt, így a tartalomszűrő alkalmazás az eredeti email címeket látja a levél fejlécében.

Hitelesített levélküldés (submission)

Annak érdekében, hogy a felhasználóink képesek legyenek nem csak levelet fogadni, hanem küldeni is a Postfix segítségével, szükségünk van egy erre a célra szolgáló SMTP szolgáltatásra. Az internet felől érkező levelek fogadására szolgáló 25-ös port erre a célra nem megfelelő, így biztosítanunk kell egy úgynevezett submission szolgáltatást. Ez a szolgáltatás az 587-es porton várja a leveleket küldő felhasználókat, ahol - a kötelezően előírt titkosítás miatt - hitelesítés céljából felhasználói nevek és jelszavak is elküldésre kerülnek a Postfix számára.

A master.cf fájlban kell a szolgáltatást megvalósítani:

submission inet n - n - - smtpd
    -o smtpd_tls_security_level=encrypt
    -o smtpd_sasl_auth_enable=yes
    -o smtpd_sasl_type=dovecot
    -o smtpd_sasl_path=private/auth
    -o smtpd_sasl_security_options=noanonymous
    -o smtpd_sasl_local_domain=$myhostname
    -o smtpd_helo_restrictions=
    -o smtpd_relay_restrictions=permit_sasl_authenticated,defer_unauth_destination

(A félkövérrel kiemelt kiegészítést köszönöm Harasztia Rolandnak) Az options sorok már ismerősek kell legyenek a main.cf fájlban látottak alapján. Az egyetlen különbség az smtpd_tls_security_level, amelynek értéke itt nem may, hanem encrypt. Vagyis az 587-es porton kizárólag titkosított (TLS) kapcsolatokat fogadunk el.