Tartalomjegyzék
Postfix
- Szerző: Sallai András
- Copyright © Sallai András, 2011, 2013, 2014, 2016, 2017, 2018, 2020
- Licenc: GNU Free Documentation License 1.3
- Web: https://szit.hu
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:
- smtpd
- proxymap
- tlsmgr
- anvil
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:
- trivial-rewrite
Az „rcpt to:” parancs után elindul a cleanup folyamat.
- cleanup
Ha címzett a helyi gépen van, a local nevű gyermekfolyamat indul el:
- local
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
- pickup
- megnézi megfelel-e az érkező levél
- cleanup
- átírja a levelet ha kell, majd kézbesítésre átadja
- qmgr
- várakozási sorokat (queue) kezeli
- anvil
- számolja a kliensek kéréseit és kéréseik gyorsaságát
- védelmi célokat szolgál
- proxymap
- szintén védelmi célokat szolgál
- a kereső táblák ezen a folyamaton keresztül kérdezhetők le, csak olvasható módban
- tlsmgr
- A TLS munkamenetek kezelése
- trivial-rewrite
- cím átírása és feloldása
- local
- A helyi leveleket kezeli
- smtp
- levelek kézbesítése az más gépeknek
A postfix működése
- A levelek alapvetően két módon érkezhetnek. Keletkezhetnek helyben, és jöhetnek a más gépekről .
- Helyben keletkezett levél sendmail parancs segítségével készül
- A sendmail az alapértelmezett bemenetről várja levelet.
- A helyben keletkezett levelek a maildrop queue-ba kerülnek, ha levelezőszerver nem megy.
- Ha levelezőszerver fut, akkor pickup folyamat kapja meg a levelet.
- A pickup megnézi, hogy formailag megfelel-e a levél, majd átadja a cleanup folyamatnak
- A cleanup folyamt teszi a levelet az incoming queueba
- Ha hiányzik a From, To, Id vagy Date mező, akkor beleírja
- A cleanup folyamat megnézi a canonical és virtual táblák alapján szükséges-e átírni a levelet.
- Szabványos formára hozza a címeket: felhsználó@teljes-tartomány-név
- Ha szükséges az átírás átadja a trivial-rewrite folyamatnak, amely visszaadja a cleanup számára
- A dupla fogadó címeket törli
- Az Internetről érkező leveleket az smtpd folyamat fogadja.
- Van egy QMQP protokoll, amelyet a QMAIL mellé fejlesztettek, a postfix ezen is képes fogadni
- QMPQ (Quick Message Queuing Protocol, 26/TCP)
- A postfix az érkező leveleket a qmqpd folyamaton keresztül fogadja
- QMPQ protokollon minden levél továbbítódik, de csak hitelesítés után (pl. klászterekhez)
- Az smtpd folyamat ellenőrzi (ha be van állítva), hogy nem szerepel-e RBL listán a feladó
- Ez után megnézi az access tábla alapján, hogy a levél fogadható-e
- A következő lépésként az smtpd folyamat is a cleanup folyamatnak adja át a levelet
- A cleanup folyamat eltárolja a levelet a incoming queueban.
- Értesíti a qmgr folyamatot erről
- A qmgr folyamat átteszi levelet az active queueba.
- megnézi mit kell vele tenni
- megpróbálja kézbesíteni
- ha átmenetileg nem lehet kézbesíteni, akkor a deferred queueba teszi
- a qmgr időnként megnézi a deferred queue tartalmát, tudja-e kézbesíteni
- ha gyanús a levél címzett, feladó stb. alapján (férgek), akkor hold queueba kerül
- ha egy levél olvashatatlan, akkor a corrupt queueba
- A relocated tábla tartalmazza a visszautasítandó levelek sorsát
- 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.
- „mynetworks_style = host” amikor a Postfix csak a helyi gépről továbbít leveleket.
- „mynetworks_style = subnet” (alapértelmezett) amikor a Postfix leveleket továbbít olyan SMTP kliensektől amelyek ugyanabban az alhálózatban vannak mint helyigép. Linuxon ez csak azt a hálózati interfészt jelenti, amelyet az ifconfig parancs megad.
- „mynetworks_style = class” a Postfix elfogad olyan SMTP kliensektől leveleket, amelyek azonos IP osztályban A/B/C színtű hálózatban vannak.
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:
- bounce
- 2bounce
- delay
- policy
- protocol
- resource
- software
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
- fő
- incoming – bejövő levelek tárolója (a pickup démon által átadott levelek kerülnek ide)
- active – az éppen kézbesítés alatt lévő levelek helye (ideiglenes, mivel éppen feldolgozzuk)
- maildorp – helyi levél
- deferred – elsőre nem kézbesíthető levelek
- segéd queue
- defer, hold – rendszergazda által eltett levelek
- corrupt – olvashatatlan, hibás levelek
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:
- A szerverünk a localhost üzenetet küldi.
- A szerverünk az IP címünket küldi.
- A szerverünk olyan génevet küld ami nem oldható fel.
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
- PIPELINING - Válasz nélkül jöhet a következő üzenet
- SIZE 10240000 - Max. ekkora üzenet kézbeítek
- VRFY - A küldeni szándékozó ellenőrizheti, hogy létezik-e egy felhasználó
- ETRN - A kiszolgálón tárolt leveleket lekérjük
- STARTTLS - TLS kapcsolat indítása
- ENHANCEDSTATUSCODES - Státuszkódok (http://tools.ietf.org/html/rfc3463)
- Siker (2.x.x kezdetű kód a DSN-ben)
- Átmeneti hiba (4.x.x kezdetű kód a DSN-ben)
- Állandó hiba (5.x.x kezdetű kód a DSN-ben)
- 8BITMIME - 8 bites kódolatlan szöveg átvitele lehetséges
- DSN - Van levélkézbesítési státusz üzenet (Delivery Status Notification)
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
- http://qmail.jms1.net/test-auth.shtml (azonosítás)
- http://rackerhacker.com/2006/12/26/fixing-invalid-helos/ (Helló üzenet)
- http://vda.sourceforge.net (Az oldal alján a virtuális limithez még több változó)
- http://wiki.centos.org/HowTos/postfix_restrictions (Postfix korlátozások)
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: