Tartalomjegyzék

< E-mail szerver

Postfix

Bevezetés

A Postfix egy népszerű nyílt forráskódú levelezőszerver program. Wietse Zweitze Venema kezdte el fejleszteni, 1997-ben. Az első kiadás 1998-ban jelent meg.

Telepítés

apt install postfix

Ha valakinek a legújabb kell forrásból, akkor letöltheti a weboldaláról a forráskódot:

Ismerkedés a postfixel

Fut-e?

Telepítés után ellenőrizzük, hogy fut-e a postfix. Ehhez használjuk a ps ax parancsot:

ps ax

A kimenet ehhez hasonló lehet:

  PID TTY      STAT   TIME COMMAND
...
28400 ?        Ss     0:00 /usr/lib/postfix/master
28406 ?        S      0:00 pickup -l -t fifo -u -c
28407 ?        S      0:00 qmgr -l -t fifo -u
...

A kimenetben egyetlen postfix könyvtárból futó master nevű folyamat van, de a pickup és a qmgr is hozzátartozik.

A master, a pcikup és a qmgr folyamatok kapcsolatát jól szemléltei a ps parancs, ha használjuk az „f” parancsot is:

ps axf

Ekkor a kimenetben megjelennek a szülő-gyermek kapcsolatok:

  PID TTY      STAT   TIME COMMAND
...
4441 ?        Ss     0:00 /usr/lib/postfix/master
4447 ?        S      0:00  \_ pickup -l -t fifo -u -c
4448 ?        S      0:00  \_ qmgr -l -t fifo -u

Láthatjuk, hogy a master a fő folyamat, amely két gyermekfolyamatot futtat, a pickup és a gmgr.

A ps parancs mellett rendelkezésünkre áll a pstree nevű parancs, ami a folyamatokat fastruktúrában ábrázolja.

Használjuk például így:

pstree -u `cat /var/spool/postfix/pid/master.pid`

A lehetséges kimenet:

master─┬─pickup(postfix)
       └─qmgr(postfix)

Levél érkezése

Egy levél érkezésekor a master folyamat újabb gyermekeket indít. Ezek rendre:

Kapcsolódjunk a levelezőszerverünkhöz a teszteléshez:

telnet localhost 25

Egy másik terminálon nézzük meg a futó folyamatokat.

A „mail from:” parancs után újabb folyamat indul:

Az „rcpt to:” parancs után elindul a cleanup folyamat.

Ha címzett a helyi gépen van, a local nevű gyermekfolyamat indul el:

Tesztelés

Természetesen a telnet parancs is megfelel a teszteléshez, ahogyan már használtuk:

telnet localhost 25

Van persze erre a célra fejlesztett eszköz is, a swaks. Telepítés:

apt install swaks

Használat:

swaks -s localhost
To: kati@iskolazo.zold.and

Újrakonfigurálás

A postfix levelezőszerver telepítés után is újrakonfigurálható a dpkg-reconfigure parancsra, így nem kell belenyúlni a konfigurációs állományokba:

dpkg-renconfigure postfix

A postfix moduljai

A postfix működése

  1. A levelek alapvetően két módon érkezhetnek. Keletkezhetnek helyben, és jöhetnek a más gépekről .
  2. Helyben keletkezett levél sendmail parancs segítségével készül
    1. A sendmail az alapértelmezett bemenetről várja levelet.
  3. A helyben keletkezett levelek a maildrop queue-ba kerülnek, ha levelezőszerver nem megy.
  4. Ha levelezőszerver fut, akkor pickup folyamat kapja meg a levelet.
    1. A pickup megnézi, hogy formailag megfelel-e a levél, majd átadja a cleanup folyamatnak
  5. A cleanup folyamt teszi a levelet az incoming queueba
    1. Ha hiányzik a From, To, Id vagy Date mező, akkor beleírja
    2. A cleanup folyamat megnézi a canonical és virtual táblák alapján szükséges-e átírni a levelet.
    3. Szabványos formára hozza a címeket: felhsználó@teljes-tartomány-név
    4. Ha szükséges az átírás átadja a trivial-rewrite folyamatnak, amely visszaadja a cleanup számára
    5. A dupla fogadó címeket törli
  1. Az Internetről érkező leveleket az smtpd folyamat fogadja.
    1. Van egy QMQP protokoll, amelyet a QMAIL mellé fejlesztettek, a postfix ezen is képes fogadni
    2. QMPQ (Quick Message Queuing Protocol, 26/TCP)
    3. A postfix az érkező leveleket a qmqpd folyamaton keresztül fogadja
    4. QMPQ protokollon minden levél továbbítódik, de csak hitelesítés után (pl. klászterekhez)
  2. Az smtpd folyamat ellenőrzi (ha be van állítva), hogy nem szerepel-e RBL listán a feladó
  3. Ez után megnézi az access tábla alapján, hogy a levél fogadható-e
  4. A következő lépésként az smtpd folyamat is a cleanup folyamatnak adja át a levelet
  1. A cleanup folyamat eltárolja a levelet a incoming queueban.
    1. Értesíti a qmgr folyamatot erről
  2. A qmgr folyamat átteszi levelet az active queueba.
    1. megnézi mit kell vele tenni
    2. megpróbálja kézbesíteni
    3. ha átmenetileg nem lehet kézbesíteni, akkor a deferred queueba teszi
    4. a qmgr időnként megnézi a deferred queue tartalmát, tudja-e kézbesíteni
    5. ha gyanús a levél címzett, feladó stb. alapján (férgek), akkor hold queueba kerül
    6. ha egy levél olvashatatlan, akkor a corrupt queueba
  1. A relocated tábla tartalmazza a visszautasítandó levelek sorsát
    1. Ilyen üzenetek generálása: User has moved to

Alapbeállítás

A postfix alapértelmezett beállításai máris használhatók. Ha szeretnénk változtatni a beállításokon szerkesszük a /etc/postfix/main.cf állományt.

A main.cf változónév = érték párokból áll, köztük egyenlőségjellel:

változónév = érték

Ha egyszer beállítottunk egy változót, annak értékére később is hivatkozhatunk:

másikváltozónév = $eredetinév

A mintában szereplő $eredetinév változó viszont lehet a rávaló hivatkozás után is.

main.cf
# a @ mögé mit írjunk, ha nem töltötte ki a kliens. 
# Csak helyben feladott leveleknél működik, ahol semmi nincs a @ mögött!
# Esetleg szokás még: $mydomain változót megadni
myorigin = /etc/mailname
 
# Logó 
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
 
# Jelzés, hogy levél érkezett
biff = no
 
 
# Ha domain nincs teljesen kitöltve, akkor egy pont (.) után utánafűzi a mydomain értékét:
append_dot_mydomain = no
 
# Időegységek: s (seconds), m (minutes), h (hours), d (days), w (weeks). Alapértelmezett: h (hours).
# 0 korlátlan 
# A küldő kapjon üzenetet, hogy a levél még mindig a queue-ban várakozik ennyi idő után.
delay_warning_time = 4h
 
# Hol van leírva, hogy mit fordítottak bele a postfix-be:
readme_directory = no
 
# Hostnév:
myhostname = iskolazo.zold.and
 
 
# De ez nem kötelező, az előzőből (myhostname) kiderül.
mydomain = zold.and
 
# Hol vannak az aliasok:
# A hagyományos alias hol van:
alias_maps = hash:/etc/aliases
# Egyéb adatbázfájl hol van:
alias_database = hash:/etc/aliases
 
# Itt fel kell sorolni a hagyományost is, de ide fűzhetek másokat.
# Így összefűzhetők:
#alias_database = hash:/etc/aliases hash:/etc/mailman/aliases
# Az utóbbit persze az postmap paranccsal kell generálni.
 
# Milyen domainekre érkező leveleket fogadjunk el 
# Esetleg belehet helyettesíteni: $myhostname,$mydomain
mydestination = iskolazo, localhost, localhost.localdomain, iskolazo.zold.and, zold.and
 
# Ha tovább kell küldeni a levelet (nem neki szól), akkor ide küldje és ne máshova
relayhost =
 
# Honnan küldhetnek levelet, milyen klienseknek továbbítok
# Ide jöhet például szóköz után: 192.168.5.0/24
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
 
# Levél szoltírozó
mailbox_command = procmail -a "$EXTENSION"
 
# Postafiók mérete:
mailbox_size_limit = 0
 
# Szeparátor a név és kiterjesztés között (nem találkozunk vele általában)
recipient_delimiter = +
 
# Melyik hálókártyán szolgálok ki:
inet_interfaces = all

Ha egy érték később kap csak értéket, nem gond, akkor is tudok rá hivatkozni. A változók után lehet vessző vagy space is.

Szintaktikai elemzés

invoke-rc.d postfix check

vagy csak: postfix check

Beállítások után töltsük újra a beállításokat:

invoke-rc.d postfix reload

Beállítások

A kimenő levelekhez használt domain név

Alapértelmezetten ez a helyi gép neve, amit a $myhostname esetén beállítottunk.

Példa a beállításra:

/etc/postfix/main.cf:
      myorigin = $myhostname (alapértelmezett: A levél így lesz elküldve: "user@$myhostname")
      myorigin = $mydomain   (A levél így domaine így változik: "user@$mydomain")

Mely domainekről szeretnék levelet fogadni

A mydestination paraméter meghatározza mely domainekről fogadunk leveleket, amit továbbküldünk más gépekre. Alapértelmezetten ez a saját gépünk.

Vagy nem adsz meg semmit vagy több domain nevet is megadhatsz. Lehetnek /file/name„ minták vagy „típus:táblák (mint a btree:, nis:, vagy mysql:), szóközökkel és/vagy vesszővel tagolva.

Példa 1: alapértelmezett:

/etc/postfix/main.cf:
      mydestination = $myhostname localhost.$mydomain localhost

Példa 2: több domain

/etc/postfix/main.cf:
      mydestination = $myhostname localhost.$mydomain localhost $mydomain

Példa 3: host több DNS rekorddal

/etc/postfix/main.cf:
      mydestination = $myhostname localhost.$mydomain localhost 
          www.$mydomain ftp.$mydomain

Mely klienseknek továbbítjuk a leveleit

Alapértelmezetten a Postfix továbbít minden levelet amely a saját hálózatában van. Az saját hálózatot definiálhatjuk a mynetworks paraméterrel. Alapértelmezetten minden géptől elfogad levelet amely azonos alhálózatban van.

Példuául:

/etc/postfix/main.cf:
      mynetworks_style = subnet  (alapértelmezett: authorize subnetworks)
      mynetworks_style = host    (safe: authorize local machine only)
      mynetworks = 127.0.0.0/8   (safe: authorize local machine only)
      mynetworks = 127.0.0.0/8 168.100.189.2/32 (authorize local machine) 

Megadhatsz egy korlátozott hálózatot a main.cf, de a Postfix működik alapértelmezett beállításokkal is.

Példa:

  /etc/postfix/main.cf:
      mynetworks = 168.100.189.0/28, 127.0.0.0/8

Honnan küldhetnek levelet

Szerveren átmenő levelek:

mynetworks = 127.0.0.0/8  192.168.1.0/2

Rajtunk keresztül innen engedélyezett levélküldés

Álnevek

Álnevekkel megadhatok másodlagos nevek, amelyekre szintén szeretnénk levelet elfogadni. Ezt akkor szoktuk használni, ha nem szeretnénk a másodlagos névre újabb nevet felvenni, vagyis szeretnénk már egy meglévő e-mail címre irányítani. Erre az alias_maps változó ad lehetőséget:

alias_maps = hash:/etc/aliase
/etc/aliases
postmaster: jozsi
root: jozsi

Ha új értéket írunk az /etc/aliases fájlba, akkor futtatnunk kell követkekző parancsot:

newaliases

Ez létrehozza a aliases.db nevű állományt.

A fenti beállítások után a postmaster és a root felhasználóknak címzett levek is elfogadottak és a jozsi felhasználó kapja meg.

Szintén álnevek megadására való az alias_database:

alias_database = hash:/etc/aliases

Az alias_database annyival több, hogy megadhatunk más adatbázisokat is. Ilyen lehet NIS adatbázis:

alias_maps = hash:/etc/aliases, nis:mail.aliases

Értesítés új levélről

Ha a felhasználó belép login promptnál értesítést kap ha új levele érkezett. Ez csak konzolos felületen működik.

A linuxos biff csomag biff parancsa ugyanezt a feladatot látja el.

MAIL FROM kiegészítés

Ha a levelező (MUA) nem ír pont domaint a „mail from:” sorba és a mydomain változónak adtunk értéket, akkor a postfix hozzáfűzi a „mail from:” sor végéhez. Alapértelmezetten ki van kapcsolva:

append_dot_mydomain = no

Ha ezt mégis szeretnénk állítsuk be yes értéket, de ez az alapértelmezett is.

Procmail

mailbox_command = procmail -a "$EXTENSION"

A beállítás hatására az érkező leveleket a procmail is feldolgozza. Vagyis a postfix átadja számukra az üzenetet kézbesítés előtt. Alapértelmezetten nincs procmail beállítva, de minden felhasználó írhat magának .procmailrc fájlt.

A procmailhez több beállításért nézd meg a következő oldalon lévő rövid szösszenetet Procmail

A fenti értékadás hatására a postfix átadja az EXTENSION változó tartalmát a procmail számára:

$EXTENSION

Az EXTENSION változó után újabb változókat is megadhatunk.

A mailbox mérete

mailbox_size_limit = 0

Alapértelmezett: 51 200 00

A Debianban ez 0 értékre van állítva, vagyis korlátlan. Ne hagyjuk ezen a beállításon, ha mások számára is szolgáltatunk levelezést! A felhasználók manapság nagyon könnyen meg tudják tölteni. Az értéket byteban kell megadni.

Címzett elválasztó

Ha az e-mail címben a felhasználónév és az esetleges kiterjesztések közötti szeparátor.

recipient_delimiter = +

Például spamszűrésnél használjuk:

bela+ham@foo.hu
bela+spam@foo.hu

Hálózati eszközök

inet_interfaces = all

Melyik eszközön fogadjunk leveleket

Esetleg:

inet_interfaces = 192.168.1.2, 127.0.0.1

Hibák

Milyen hibákról menjen megjegyzés.

A notify-classes beállítással állíthatom be.

Példák:

notify-classes software,bounce
notify_classes = bounce, delay, policy, protocol, resource, software
notify_classes = 2bounce, resource, software

Lehetséges hibafajták:

Részletek: http://www.postfix.org/postconf.5.html#notify_classes

Queue kezelés

Parancsok

mailq  - a queue tartalma
sendmail -q
postsuper -d queue-id

Queue-k

Maildir

/etc/postfix/main.cf
...
home_mailbox = Maildir/

Indítsuk újra a szervert:

systemctl restart postfix

Ha szeretnénk procmail, akkor a következőt írjuk mailbox_command = után:

mailbox_command = procmail -a "$EXTENSION" DEFAULT=$HOME/Maildir/

Virtuális domain

Az ügyfelek tartománynevének nem állítunk be egy külön szervert. A saját gépünkön virtuális tartománynévként fog szerepelni.

Beállítások

Postfix

virtual_mailbox_domains = kek.and piros.and sarga.and feher.and
virtual_mailbox_base = /home/vmail
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_minimum_uid = 100
groupadd vmail -g 5000
useradd vmail -g vmail -u 5000 -d /home/vmail -m
/etc/postfix/vmailbox
info@zold.and    zold.and/info/
info@piros.and   piros.and/info
postmap /etc/postfix/vmailbox

Ekkor létrejön egy vmailbox.db fájl.

Analizis

virtual_mailbox_domains Milyen virtuális domaineknek szeretnénk szolgáltatni
virtual_mailbox_base Hova érkeznek a virtuális domainek levelei
virtual_mailbox_maps Hol tároljuk a virtuális domainekhez tartozó postafiókokat
virtual_uid_maps Milyen felhasználó nevében éri el a postfix a mailboxokat
Léteznie kell ennek a felhasználónak
virtual_gid_maps Milyen csoprot nevében éri el a postfix a mailboxokat
Léteznie kell ennek a csoportnak
virtual_minimum_uid Minimális uid, legyen kisebb mint virtual_uid_maps

A virtuális domainek között nem szerepelhet $myhostname változó értéke. A virtual_mailbox_base után megadott könyvtár után nem kell ”/” jelet tenni.

A /home/vmail könyvtárban a domainek könyvtárai és azokon belül a postafiókok könyvtárai automatikusan létrejönnek, amikor az adott mailboxba érkezik egy levél.

További beállítások

Virtuális térképek

Bizonyos címekre érkező levelek milyen másik címre érkezzenek.

virtual_alias_maps = hash:/etc/postfix/virtual
/etc/postfix/virtual
postmaster@piros.lan postmaster

A jobboldalon persze lehet egész e-mail cím is.

Az adatbázis-állományba átvezetjük:

postmap /etc/postfix/virtual

Majd jöhet az újraindítás:

systemctl restart postfix

Limit

virtual_mailbox_limit (alapértelmezett: 51200000)

A mailbox vagy a maildir fájl maximális mérete byteban, vagy 0 és akkor végtelen.

message_size_limit (alapértelmezett: 10240000)
message_size_limit = 104857600

Az üzenet maximális mérete.

A üzenetek méret limitje legyen kisebb mint a mailbox limitje!

Maildir MySQL-ben

Postfix tudjon MySQL-t használni

Telepítsük a postfix-mysql csomagot:

apt install postfix-mysql

Mailboxok útvonala

virtual_mailbox_maps = mysql:/etc/postfix/virtual/mailboxes.cf
/etc/postfix/virtual/mailboxes.cf
user = mail_admin
password = titok
dbname = mail
query = SELECT CONCAT( SUBSTRING_INDEX(email,'@',-1),'/', SUBSTRING_INDEX(email,'@',1),'/') FROM user WHERE email = '%s'
hosts = 127.0.0.1

Domainek helye

virtual_mailbox_maps = mysql:/etc/postfix/virtual/domains.cf
/etc/postfix/virtual/domaines.cf
user = mail_admin
password = titok
dbname = mail
query = SELECT  domain FROM domains WHERE domain = '%s'
hosts = 127.0.0.1

Emailek helye

virtual_mailbox_maps = mysql:/etc/postfix/virtual/emails.cf
/etc/postfix/virtual/emails.cf
user = mail_admin
password = titok
dbname = mail
query = SELECT  email FROM user WHERE email = '%s'
hosts = 127.0.0.1

Jelszavas fájlok

chmod o= /etc/postfix/virtual/*.cf
chgrp postfix /etc/postfix/virtual/*.cf

Mivel jelszavakat tartalmaznak virtual könyvtárban lévő fájlok, ezért másoktól minden jogot elveszünk.

MySQL telepítés

apt install mysql-server-5.1
mysql -u root -p
CREATE DATABASE mail;
USE mail;

Domain tábla létrehozása:

CREATE TABLE domains (
    DOMAIN VARCHAR(50) NOT NULL,
    PRIMARY KEY (DOMAIN)   
);

Users tábla létrehozása:

CREATE TABLE USER (
    email VARCHAR(80) NOT NULL,
    password(50) NOT NULL,
    PRIMARY KEY (email)
);

Domain felvétele:

INSERT INTO domains VALUES ( 'lila.hu');

Felhasználó felvétele:

INSERT INTO USER VALUES ('jozsi@lila.hu', ENCRYPT('titok'));

mail_admin felhasználó a MySQLben:

GRANT ALL PRIVILEGES ON mail.* 
   TO 'mail_admin'@'localhost'
    IDENTIFIED BY 'titok';
FLUSH PRIVILEGES;

Korlátozások

Helló ellenőrzés

A HELO vagy az EHLO parancs után megadott érték figyelése.

smtpd_helo_restrictions = 
              reject_unknown_helo_hostname
              reject_invalid_helo_hostname
              reject_non_fqdn_helo_hostname
reject_unknown_helo_hostname Ha nincs az EHLO vagy HELO üzenet után írt domainnek nincs A vagy MX rekordja
reject_invalid_helo_hostname A domainmegadás szintaxisa nem jó. Például !!$ karakter van benne
reject_non_fqdn_helo_hostname A domain nem FQDN

Persze az egész nem ér semmit ha nem mondom meg, hogy megkövetelem a EHLO vagy HELO parancsot:

smtpd_helo_required = yes

Fogadó ellenőrzés

smtpd_recipient_restrictions = 
                reject_invalid_hostname
                reject_unauth_destination
                reject_unknown_recipient_domain
                reject_rbl_client sbl.spamhaus.org
                permit
reject_invalid_hostname Szintaktikailag nem helyes
reject_unauth_destination Ismeretlen címzetteket eldobjuk, nem vagyunk „OpenRelay”
reject_unknown_recipient_domain Nincs A vagy MX rekord
reject_rbl_client sbl.spamhaus.org RBL listán van

Szerverként (levélküldéskor) a küldő korlátozásai

smtpd_sender_restrictions = reject_unverified_sender,
                            reject_non_fqdn_sender,
                            reject_unknown_sender_domain
reject_unverified_sender A feladó (MAIL FROM) címének ellenőrzése. A felhasználót is ellenőrzi (ha nincs visszadobja).
reject_non_fqdn_sender A feladó (MAIL FROM) címében a kukac után nem FQDN van akkor visszadobja.
reject_unknown_sender_domain Ha a feladó (MAIL FROM) címében a domain nem oldható fel, akkor visszadobjuk.
permit_mynetworks Saját hálózatról mehet, ezt meg szoktuk adni
smtpd_sender_restrictions = 
               permit_mynetworks
               reject_unverified_sender,
               reject_non_fqdn_sender,
               reject_unknown_sender_domain

Mit dobna el írja a naplóban, ha elé írom:

smtpd_sender_restrictions = 
                warn_if_reject reject_unverified_sender
                warn_if_reject reject_non_fqdn_sender
                warn_if_reject reject_unknown_sender_domain

A naplóban (/var/log/syslog /var/log/mail.log) ilyen sorokat kell keresni:

NOQUEUE: reject_warning:

A leveleket tehát így nem dobja el, de jelzi a naplóban, hogy megtenné.

Kliens ellenőrzése

Ha az IP cím nem oldható fel domain névvé, akkor nem fogadjuk el a levelet. /etc/postfix/main.cf

smtpd_client_restrictions = reject_unknown_client

Egyébként:

Elfogadjuk az SMTP kapcsolatokat:

smtpd_client_restrictions =
                permit_mynetworks,
                check_client_access hash:/etc/postfix/client_restrictions,
                reject_rbl_client sbl-xbl.spamhaus.org,
                reject_rbl_client cn.countries.nerd.dk,
                reject_rbl_client sa.countries.nerd.dk,
                reject_rbl_client kr.countries.nerd.dk,
                reject_rbl_client pl.countries.nerd.dk
client_restrictions
zold.and    OK
kek.and     REJECT Nem jöhet be

SMTP SSL

SSL tanúsítvány létrehozása

mkdir /etc/postfix/ssl
cd /etc/postfix/ssl
openssl req -new -nodes -keyout smtp.theos.in.key -out smtp.zold.and.csr
Generating a 1024 bit RSA private key
...........++++++
........................++++++
writing new private key to 'smtp.zold.and.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:HU
State or Province Name (full name) [Some-State]:Magyarorszag
Locality Name (eg, city) []:Budapest
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Pörgő Bt.
Organizational Unit Name (eg, section) []:Informatika
Common Name (eg, YOUR name) []:smtp.zold.and
Email Address []:ssladmin@staff.zold.and
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:titok
An optional company name []:Pörgő Bt.

Legenárltuk a CSR tanusítványt.

SSL beállítása

smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/ssl/smtp.zold.and.key
smtpd_tls_cert_file = /etc/postfix/ssl/smtp.zold.and.crt
smtpd_tls_CAfile = /etc/postfix/ssl/caroot.crt
smtpd_tls_loglevel = 1

Esetleg még:

smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

SASL

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain =
smtpd_sasl_security_options=noanonymous
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination, permit_mynetworks check_relay_domains
smtpd_delay_reject = yes
broken_sasl_auth_clients = yes
smtpd_delay_reject Várunk az RCPT TO parancsig az $smtpd_client_restrictions, $smtpd_helo_restrictions és $smtpd_sender_restrictions kiértékelésével.
broken_sasl_auth_clients Yes-re állítva a Postfix elfogad nem szabványos (megtört) sasl azonosítást is. Pl. MS termékek. (RFC 4954).

Teszt

telnet smpt.zold.and 25

Figyeljük a sorok között a STARTTLS szót:

Trying 1.2.3.4...
Connected to smtp.zold.and.
Escape character is '^]'.
220 smtp.zold.and ESMTP Postfix (Debian/GNU)
ehlo vagyok.and
250-smtp.zold.and
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
tail /var/log/mail.log

Esetleg:

Egyéb SMTP kommunikáció

VRFY joska Ellenőrzi a joska felhasználó van-e
RSET Megszakítja a kommunikációt
NOOP Üres utasítás. Arra használjuk, él-e a szerver
HELO Köszönés
EHLO Köszönés
QUIT Kilép

Kvóta használata

Kvóta alapból van a postfixben, de az nem használható virtuális domainekre. A következő összeállítás bemutatja, hogyan használjuk virtuális domainekre.

A postfix újrafordításához szükséges:

apt-get install build-essential debhelper libdb-dev \
 libldap2-dev libpcre3-dev libmysqlclient15-dev libssl-dev \
 libsasl2-dev libpq-dev libcdb-dev dpatch hardening-wrapper

Derítsük ki a postfix verziószámát:

postconf -d | grep mail_version

A http://vda.sourceforge.net oldalon nézzük meg hol lehet elérni az aktuális postfix verzióhoz patch-et.

A patch alkalmazása a postfix forráson:

cd /usr/src
apt-get source postfix
wget http://vda.sourceforge.net/VDA/postfix-vda-2.7.1.patch
cd postfix-2.7.1
patch -p1 < ../postfix-vda-2.7.1.patch

Új postfix telepítő csomag elkészítése:

dpkg-buildpackage
cd ..
dpkg -i postfix_2.7.1-1+squeeze1_i386.deb
dpkg -i postfix-mysql_2.7.1-1+squeeze1_i386.deb

Egyéb beállítások

Ha nincs DNS

disable_dns_lookups = yes
ignore_mx_lookup_error = yes
relayhost = 192.168.5.3
smtp_host_lookup = dns,nativ

Utószó

A felhasználókat és a tartományneveket tartsuk MySQL, PostgreSQL vagy LDAP adatbázisban, úgy elegánsabb. A leírás néhol csak példákat tartalmaz, kifejtés nélkül. Idővel bővítem, ha időm engedi.

Függelék

Virtualdomainek fájlban

main.cf
# ...
virtual_mailbox_domains = hash:/etc/postfix/vmaildomain
 
# ...
vmaildomain
piros.and    OK
sarga.and    OK

DNS lookup ne legyen

Így nem szükséges DNS szerver, max. host fájl.

main.cf
# ...
disable_dns_lookups = yes

Postfix filter

A Postfix nevű levél továbbító programhoz szeretnénk saját szűrőt írni shell programban.

Először létre kell hoznunk egy filter nevű felhasználót és egy csoportot is.

# groupadd filter
# mkdir /var/spool/filter
# useradd -d /var/spool/filter -g filter filter
# chown filter.filter /var/spool/filter

Filter létrehozása:

cat > /var/spool/filter/filter.sh
#!/bin/sh

# A levelet a MAILTEXT változóba tesszük
MAILTEXT=`cat`

# A fejléc részben elhelyezünk egy újabb sort:
MAILTEXT=`echo "$MAILTEXT" | formail -i "X-Custom-Header: Szurt level"`

# Ha készen van elküldjük
echo "$MAILTEXT" | /usr/sbin/sendmail -G -i "$@"

exit $?

Ez a szűrő beilleszt a fejrészbe egy sort ami X-Custom-Header: Szurt level szavakat fűzi egy levél fejrészéhez. A levélben bármilyen változtatást tehetünk ami a levé tartalmát nem változtatja.

A scriptet a filter felhasználónak és a filter csoportnak adjuk át:

# chown filter.filter /var/spool/filter/filter.sh
# chmod u+w /var/spool/filter/filter.sh

Ez után be kell állítani a postfixet, hogy használja a filterünket. Ehhez szükség van két új sorra/beállításra és egy már létező beállítás megváltoztatására:

Postfix master.cf végére:

filter    unix  -       n       n       -       10      pipe
  flags=Rq user=filter argv=/usr/local/filter/filter.sh -f ${sender} -- ${recipient}

Postfix master.cf-ben javítani smtp részt:

smtp      inet  n       -       n       -       -       smtpd 
  -o content_filter=user_filter:dummy

A végén a postfixet újratöltjük:

# /etc/init.d/postfix reload

Postfix SMPT azonosítás

Az alábbiakban beállításra kerül SASL azonosítás és TLS-en keresztüli azonosítás is.

Szerkesszük a Postfix main.cf állományát:

cd /etc/postfix
vi main.cf

Vegyük fel az azonosításhoz szükséges adatokat:

smtpd_tls_auth_only = no
smtp_use_tls = yes
smtpd_sasl_auth_enable =   yes
smtpd_sasl_type = cyrus
local_recipient_maps =
smtpd_use_tls = yes
smtp_tls_note_starttls_offer   = yes
smtpd_tls_key_file =   /etc/postfix/ssl/smtpd.key
smtpd_tls_cert_file =   /etc/postfix/ssl/smtpd.crt
smtpd_tls_CAfile =   /etc/postfix/ssl/cacert.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header   = yes
smtpd_tls_session_cache_timeout   = 3600s
tls_random_source =   dev:/dev/urandom

Állítsuk be a 465 portot postfix számára:

vi master.cf

A következő sorokat adjuk a master.cf fájlhoz:

smtps   inet n   -   n   - - smtpd
    -o smtpd_sasl_auth_enable=yes
    -o smtpd_reject_unlisted_sender=yes
    -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
    -o broken_sasl_auth_clients=yes
vi /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login

Készítsük el az SSL tanúsítványokat:

mkdir /etc/postfix/ssl
cd ssl/
openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024
chmod 600 smtpd.key
openssl req -new -key smtpd.key -out smtpd.csr
openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
openssl rsa -in smtpd.key -out smtpd.key.unencrypted
mv -f smtpd.key.unencrypted smtpd.key
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650

Készítsünk egy tanúsítványt, amit az Internet Exploler (az Outlook számára) / Thunderbird.

openssl pkcs12 -export -in smtpd.crt -inkey smtpd.key -out OutlookSMTP.p12

A postfix konfiguráció újratöltése:

/etc/init.d/postfix reload

Hogy kapcsolódni tudjanak gépünkhöz iptables szabály a levelezőszerver scriptjében:

$IPTABLES -A INPUT -i $EXTIF -p tcp -s $UNIVERSE -d $EXTIP --destination-port 465 -j ACCEPT

Ha tűzfal mögött van, akkor a tűzfalscriptbe (Feltételezzük, hogy a szerver IP címe 192.168.1.4):

$IPTABLES -A FORWARD -i   $EXTIF -p tcp --dport 465 -d 192.168.1.4 -o $INTIF -j ACCEPT
$IPTABLES -A FORWARD -o   $EXTIF -p tcp --sport 465 -s 192.168.1.4 -i $INTIF -j ACCEPT
$IPTABLES -t nat -A PREROUTING -i $EXTIF -p tcp -d $EXTIP2 --dport 465 -j DNAT --to 192.168.1.4:465

Ellenőrzés

netstat -ntpl | grep master
tcp     0    0     127.0.0.1:10025  0.0.0.0:*      LISTEN   8366/master
tcp     0    0     0.0.0.0:465      0.0.0.0:*      LISTEN   8366/master
tcp     0    0     0.0.0.0:25       0.0.0.0:*      LISTEN    8366/master
telnet localhost 465
[root@ls1 postfix]# telnet localhost 465
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 yourserver ESMTP Postfix
ehlo me
250-yourserver
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
^]
telnet> quit
Connection closed.
[root@ls1 postfix]#

Teszteléshez készítsünk egy felhasználónév, jelszó párost kódolva Base64 Mime kódolással, a következő scripttel:

encode_sasl_plain.pl
#!/usr/bin/perl
use strict;
use MIME::Base64;
if ( $#ARGV !=1) {
  die "Usage: encode_sasl_plain.pl <username> <password>\n";
}
print encode_base64("$ARGV[0]?$ARGV[0]?$ARGV[1]");
exit 0;
encode_sasl_plain.pl <username> <password>

Az eredmény valami ilyesmi: dmFsYWtpP3ZhbGFraT90aXRvaw==

telnet localhost 465
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 yourserver ESMTP Postfix
ehlo me
250-yourserver
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN dmFsYWtpP3ZhbGFraT90aXRvaw==
235 2.0.0 Authentication successful

Ha az azonosítás sikertelen akkor lehet, le kell cserélni a MATCH értéket a /etc/…

Újraindítás

/etc/init.d/saslauthd restart
telnet yourserver 465
user@gep:~$ telnet yourserver 465
Trying your-ip...
Connected to yourserver.
Escape character is '^]'.
220 yourserver ESMTP Postfix
ehlo me
250-yourserver
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN dmFsYWtpP3ZhbGFraT90aXRvaw==
235 2.0.0 Authentication successful

Az ellenőrzés másként

$ perl -MMIME::Base64 -e 'print encode_base64("\000valaki\@valahol.net\000titkos.jelszo")'

dmFsYWtpP3ZhbGFraT90aXRvaw==

$ telnet youserver 25
$ telnet 1.2.3.4 25
220 a.mx.valahol.net NO UCE ESMTP
ehlo testing
250-a.mx.valahol.net NO UCE
250-STARTTLS
250-PIPELINING
250 8BITMIME
quit
$ openssl s_client -starttls smtp -crlf -connect youserver:25

SSL szerver

$ openssl s_client -crlf -connect 1.2.3.4:465
AUTH PLAIN dmFsYWtpP3ZhbGFraT90aXRvaw==
235 ok, go ahead (#2.0.0) 

Sikertelen azonosítás esetén

AUTH PLAIN dmFsYWtpP3ZhbGFraT90aXRvaw==
535 authorization failed (#5.7.0) 

Levél küldése:

mail from: 
250 ok
rcpt to: 
250 ok
data
354 go ahead
From: Joe 
To: Nobody 
Subject: test01

Helló, itt a tesz!
.
250 ok 1113954693 qp 29052
quit
221 a.mx.valahol.net NO UCE 

Postfix HELO üzenete

Probléma

Egy szerver invalid HELO name üzenettel eldobja postfixünk leveleit

Lehetséges okok

Ha a szerverünk nem megfelelően szolgáltatja a HELO üzenetet, akkor lehetséges, hogy spam státuszt kaptunk egy SBL-XBL vagy CBL listán.

Általános okok, ami miatt nem felel meg a HELO üzenetünk:

Ellenőrzés

Ha meg akarod nézni a szervered milyen HELO üzenet küld írj egy e-mailt a következő címre:

helocheck@cbl.abuseat.org

Másik lehetőség a telnet parancs használata:

telnet sajatserver 25

Lehetséges válasz:

$ telnet holvan.hu 25
Trying 88.151.97.148...
Connected to holvan.hu (88.151.97.148).
Escape character is '^]'.
220 gepnev.holvan.hu ESMTP Postfix (Debian/GNU)

Az utolsó sorban látszik, hogy a szerverünk a gepnev.holvan.hu HELO üzenetet küldi. A „quit” paranccsal kiléphetünk.

Javítás

Hogyan javíthatjuk a problémát? Első körben ellenőrizzük, amit be akarunk állítani legyen feloldható a DNS szerverben. Aztán a postfixben:

myhostname = gepnev.holvan.hu

Másik lehetőség a postfixben:

smtp_helo_name = gepnev.holvan.hu

A gép neve helyett lehet mail-t is írni, ha ez elérhető:

smtp_helo_name = mail.holvan.hu

Segédprogramok

levelek a várakozási sorban:

mailq

vagy

sendmail -bp

vagy

postqueue -p

A várakozósorban lévő leveleket megpróbáljuk elküldeni:

sendmail -q

vagy

postqueue -f

Levelek törlése a várakozási sorból:

postsuper -d qued_ID

Az ID kisbetű-nagybetű érzékeny.

Nincs a hálózatban MX rekord beállítva a küldeni kívánt dominenen:

disable_dns_lookups=yes
ignore_mx_lookup_error=yes
relayhost=192.168.5.3
smtp_host_lookup=dns,native

Maildir

maxiumum 5 000 000 bájtos, maximum 1000 levelet tartalmazó üres maildir:
$ maildirmake -q 5000000S,1000C ./Maildir

Konfig dpkg rendszerből

dpkg-reconfigure --priority=low postfix

SASL ellenőrzés

mcedit /etc/default/saslauthd
START=yes
apt-get install sasl2-bin
testsaslauthd -u test -p test -f /var/spool/postfix/var/run/saslauthd/mux

Hibakövetés

Bőbeszédű üzemmód:

/etc/postfix/master.cf:
  smtp      inet  n       -       n       -       -       smtpd -v

Kézi nyomkövetés:

# strace -p process-id

Atomatikus nyomkövetés:

/etc/postfix/master.cf:
  smtp      inet  n       -       n       -       -       smtpd -D

Fejezethez tartozó külső hivatkozás:

Postfix beérkező levelekről másolat

Küldő alapján

Beállítjuk a postfixben, hogy kezelje az ilyen eseteket:

echo "recipient_bcc_maps = hash:/etc/postfix/recipient_bcc" >> /etc/postfix/main.cf

Létrehozom az adatbázis szöveges megfelelőjét:

echo "joska@server.hu    tibi@server.hu" > /etc/postfix/recipient_bcc

Létrehozom magát az adatbázist:

postmap /etc/postfix/recipient_bcc

Újraindítom a szervert:

/etc/init.d/postfix restart

Feladó alapján

Beállítjuk a postfixben, hogy kezelje az ilyen eseteket:

echo "sender_bcc_maps = hash:/etc/postfix/sender_bcc" >> /etc/postfix/main.cf

Létrehozom az adatbázis szöveges megfelelőjét:

echo "joska@server.hu    tibi@server.hu" > /etc/postfix/sender_bcc

Létrehozom magát az adatbázist:

postmap /etc/postfix/sender_bcc

Újraindítom a szervert:

/etc/init.d/postfix restart

Regex használata

sender_bcc_maps = regexp:/etc/postfix/sender_bcc
sender_bcc
!/^joe@valahol\.hu$/    joe@valahol.hu

Irodalom

Postfix képességek

Hasznos

smtpd_delay_reject

smtpd_delay_reject (alapértelmezett: yes)

A korlátozásokat csak a RCPT TO: után értékeli ki. Addig elfogad minden üzenetet

smtpd_client_restrictions

smtpd_client_restrictions = permit_mynetworks reject_unauth_pipelining

Érdemes

/etc/postfix/main.cf
    smtpd_client_restrictions = 
        permit_mynetworks
        sleep 1 
        reject_unauth_pipelining 
    smtpd_delay_reject = no
    smtpd_helo_required = yes
    smtpd_helo_restrictions =
        permit_mynetworks
        reject_non_fqdn_helo_hostname,
        reject_invalid_helo_hostname,
        permit
    smtpd_sender_restrictions =
        permit_mynetworks
        reject_non_fqdn_sender
        reject_unknown_sender_domain
        permit
    smtpd_recipient_restrictions =
        reject_unauth_pipelining,
       reject_non_fqdn_recipient,
       reject_unknown_recipient_domain,
       permit_mynetworks,
       reject_unauth_destination,
       check_sender_access hash:/etc/postfix/sender_access,
       reject_rbl_client zen.spamhaus.org,
       reject_rbl_client bl.spamcop.net,
       check_policy_service unix:postgrey/socket,
       permit
/etc/postfix/sender_access
# Black/Whitelist a küldök egyeztetésére 'MAIL FROM' mező tekintetében.
 
barat@zold.and          OK
szemet@spam.and         REJECT
marketing@              REJECT
fonok@                  OK
uzlet.marketing.and     REJECT
piros.and               OK
postmap /etc/postfix/sender_access

dpkg-reconfigure postfix

A következő kérdésekre kell válaszolnunk:

          No configuration
          Internet Site
          Internet with smarthost
          Satellite system
          Local only

      <Ok>           <Mégsem>
...
System mail name:

iskolazo
...
Root and postmaster mail recipient:

joska___________________________________________________________
iskolazo, localhost, zold.and
 ...
 Force synchronous updates on mail queue?
         <Igen>         <Nem>
 Local networks:

127.0.0.0/8 [::ffff:127.0.0.0]/104 [::]/128
 Use procmail for local delivery?

       <Igen>             <Nem>
...
Mailbox size limit (bytes):

0_________________________________________
        <Ok>             <Mégsem>
Local address extension character:

+_________________________________________
...
  all : use both IPv4 and IPv6 addresses;
  ipv6: listen only on IPv6 addresses;
  ipv4: lsiten only on IPv4 addresses;
  
 Internet protocols to use:

                              all
                              ipv6
                              ipv4
                              
              <Ok>                      <Mégsem>

Ellenőrzés

SMTP ellenőrzés:

telnet zold.and 465

SMTPS ellenőrzés:

stunnel -c -r zold.and:465

SMTP kommunikáció azonosítással:

telnet zold.and 25
Trying 192.168.5.1...
Connected to zold.and (192.168.5.1).
Escape character is '^]'.
220-iskolazo.zold.and ESMTP Postfix (Debian GNU/Linux)
220-We do not authorize the use of this system to transport unsolicited,
220 and/or bulk e-mail.
EHLO piros.and
250-iskolazo.zold.and Hello  [192.168.5.1]
250-SIZE 10240000
250-PIPELINING
250-AUTH PLAIN LOGIN
250-STARTTLS
250 HELP
AUTH LOGIN
334 VXasllasuslN
dkanANKksMaasAdK
334 GLlaiAsiLdSs
aillsLslWksWxL==
 
235 Authentication succeeded

A felhasználónevet és jelszót base64 kódolással kell megadni.

Irodalom

Linkek

Spamszűrés:

Komplett levelezőszerver beállítás:

Hasznos ide vonatkozó fórumtéma:

Fizetős, magyar spamszűrő helye:

Protokollok:

Forrás

A Postfix működéséről a kép az alábi oldalon található kép alapján készült: