[[oktatas:linux:E-mail szerver|< E-mail szerver]] ====== Postfix ====== * **Szerző:** Sallai András * Copyright (c) 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: * http://www.postfix.org/download.html ===== 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 ===== {{:oktatas:linux:e-mail_szerver:postfixs.png}} - 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. # 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 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 [[oktatas:linux:e-mail_szerver: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 ===== ... 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. {{:oktatas:linux:e-mail_szerver:virtualis_tartomanyok.png|}} ==== 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 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 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 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 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 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 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: * http://www.logix.cz/michal/devel/smtp-cli/ ===== 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 ==== # ... virtual_mailbox_domains = hash:/etc/postfix/vmaildomain # ... piros.and OK sarga.and OK ==== DNS lookup ne legyen ==== Így nem szükséges DNS szerver, max. host fájl. # ... 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 \n"; } print encode_base64("$ARGV[0]?$ARGV[0]?$ARGV[1]"); exit 0; encode_sasl_plain.pl 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: * http://www.postfix.org/DEBUG_README.html ==== 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 !/^joe@valahol\.hu$/ joe@valahol.hu === Irodalom === * http://www.postfix.org/postconf.5.html ==== 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 === 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 # 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 ... System mail name: iskolazo ... Root and postmaster mail recipient: joska___________________________________________________________ iskolazo, localhost, zold.and ... Force synchronous updates on mail queue? Local networks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::]/128 Use procmail for local delivery? ... Mailbox size limit (bytes): 0_________________________________________ 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 ==== 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://www.howtoforge.com/postfix-smtp-authentication-on-the-secure-port-only (azonosítás) * http://qmail.jms1.net/test-auth.shtml (azonosítás) * http://rackerhacker.com/2006/12/26/fixing-invalid-helos/ (Helló üzenet) * http://www.postfix.org/VIRTUAL_README.html * http://www.postfix.org/OVERVIEW.html * http://www.postfixvirtual.net * http://www.cyberciti.biz/tips/postfix-smtp-ssl-certificate-csr-installation-guide.html * http://www.cyberciti.biz/faq/unix-dovecot-ssl-tls-server-configuration/ * http://www.howtoforge.com/virtual_postfix_mysql_quota_courier_p2 * http://wiki.hup.hu/index.php/Postfix_es_virtualis_domainek * https://help.ubuntu.com/community/PostfixVirtualMailBoxClamSmtpHowto * http://sugo.ubuntu.hu/10.10/html/serverguide/hu/dovecot-server.html * http://www.tuxwiki.hu/doku.php?id=suse:postfix * http://parszab.hu/sysadmin/levkorny/levkorny2.html * http://calum.org/posts/postfix-antispam * http://vda.sourceforge.net (Az oldal alján a virtuális limithez még több változó) * http://www.xnote.com/howto/postfix_mysql_courier.html * http://hogyan.org/postfix-courier-virtualis-felhasznalokkal * http://www.howtoforge.com/virtual-users-domains-postfix-courier-mysql-squirrelmail-debian-lenny * http://www.postfix.org/mysql_table.5.html * http://www.postfix.org/MYSQL_README.html * http://www.postfix-tutorial.com * http://www.postfix.org/ETRN_README.html * http://wiki.centos.org/HowTos/postfix_restrictions (Postfix korlátozások) Spamszűrés: * http://wiki.hup.hu/index.php/Clapf * http://clapf.acts.hu * http://parszab.hu/sysadmin/levkorny/levkorny5.html Komplett levelezőszerver beállítás: * http://howtoforge.org/virtual-users-domains-postfix-courier-mysql-squirrelmail-debian-lenny * https://www.szszi.hu/wiki/Levelez%C5%91_szolg%C3%A1ltat%C3%A1s_Linux_alatt Hasznos ide vonatkozó fórumtéma: * http://hup.hu/node/40046 Fizetős, magyar spamszűrő helye: * http://mx.spamtelenul.hu Protokollok: * http://en.wikipedia.org/wiki/On-Demand_Mail_Relay * http://hu.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol * http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol * http://en.wikipedia.org/wiki/8BITMIME * http://hu.wikipedia.org/wiki/MIME * http://en.wikipedia.org/wiki/MIME * http://en.wikipedia.org/wiki/ESMTP * http://en.wikipedia.org/wiki/Local_Mail_Transfer_Protocol ===== 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: * http://www.porcupine.org/postfix/doc/big-picture.html