Sendmail

Z Milan Kerslager
Přejít na: navigace, hledání

V lokální síti je výhodné zřídit SMTP server, který bude od uživatelů (resp. od programů, ve kterých poštu píšou) přebírat elektronické dopisy (maily) určené pro odeslání. Základní výhodou bude rychlost, protože v případě odesílání většího souboru nebude uživatel muset sledovat teploměr po celou dobu, kdy dlouhý soubor odchází (nebo se rozčilovat, když spojení spadne). SMTP server pak ve vhodném okamžiku poštu odešle.

Instalace a konfigurace

Asi nejznámějším programem je sendmail. Není to jediná možnost, ale protože je jeho konfigurace (přes různé zkazky) velmi triviální, budeme se jí zabývat. Pro úspěch akce budeme na serveru potřebovat nainstalované balíčky sendmail, sendmail-cf a m4.

yum -y install sendmail sendmail-cf m4

Nejprve zkontrolujte, zda máte správně nastaven síťový subsystém (viz Jméno počítače v první kapitole), tj. vyzkoušejte příkazy hostname, resp. uname -a.

První krokem, který je potřeba udělat, je dovolit programu sendmail, aby naslouchal na síťovém rozhraní. Standardně naslouchá jen na rozhraní loopback (127.0.0.1), takže je možné poštu z počítače odeslat, protože ho poštovní klienti mohou kontaktovat jen z toho samého počítače. Proto zakomentujte (zkratkou dnl) v konfiguračního souboru /etc/mail/sendmail.mc řádek, který to přikazuje (direktiva DAEMON_OPTIONS). Dále je nezbytné zakomentovat řádek, který povoluje přijímat poštu z počítačů, u kterých nefunguje zpětný překlad IP adresy na jméno (direktiva accept_unresolvable_domains) a řádek, kde se povoluje přeposílání mailů na základě MX záznamů (relay_based_on_MX). Všechny tři zakomentované řádky jsou uvedeny v následujícím výpisu:

dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
dnl FEATURE(`relay_based_on_MX')
dnl FEATURE(`accept_unresolvable_domains')

Přepisování domény odesílatele

Máte-li svoji doménu, je výhodné mít všechny mailové adresy ve tvaru jmeno.prijmeni@domena.cz místo jmeno.prijmeni@server.domena.cz. Tuto zpáteční adresu můžeme nastavit ve všech používaných programech, ale můžeme také nakonfigurovat sendmail tak, aby (třeba pro jistotu) přepisoval všechny odchozí adresy do správného tvaru. V takovém případě přidejte do definičního souboru tyto direktivy:

FEATURE(masquerade_entire_domain)
FEATURE(masquerade_envelope)
FEATURE(allmasquerade)
MASQUERADE_AS(`domena.cz')
MASQUERADE_DOMAIN(`domena.cz')
EXPOSED_USER(`')

Zmíněné volby zajistí přepis adres v obálce i v hlavičkách odchozích mailů z tvaru xxx@cokoliv.domena.cz na xxx@domena.cz. Tento přepis se bude týkat všech uživatelů včetně uživatele root (mají-li být někteří vynecháni, vyjmenujte je do makra EXPOSED_USER). Přesný popis všech možných direktiv i s příklady naleznete v dokumentaci sendmailu v souboru /usr/share/doc/sendmail-cf/README.

Generování sendmail.cf

Po úpravách makrosouboru /etc/mail/sendmail.mc z něj můžeme vygenerovat vlastní konfigurační soubor /etc/mail/sendmail.cf a restartovat sendmail (pro vygenerování konfiguračního souboru je potřeba v systému mít balíčky sendmail, sendmail-cf, m4):

$ make -C /etc/mail
$ /etc/init.d/sendmail restart

Pokud se po restartu sendmailu objeví chybové hlášení QueueDirectory (Q) option must be set, je potřeba smazat v adresáři /etc/mail soubor submit.cf (bude mít nulovou délku) a znovu v tomto adresáři spustit make.

Další nastavení

To, že sendmail naslouchá na vnějších síťových rozhraních můžete zkontrolovat buď pokusem o spojení na port 25 z jiného počítače nebo výpisem naslouchajících programů (druhý řádek demonstruje požadovaný výstup, požadovaný text je 0.0.0.0:25):

$ netstat -tulpn | grep sendmail
tcp  0  0  0.0.0.0:25  0.0.0.0:* LISTEN 0  2686  971/sendmail: accepting connections

Dalším krokem je vyjádření důvěry počítačům ve vnitřní síti, kterým dovolíte předávat sendmailu dopisy, které se mají doručit mimo naši síť. Kdybychom to dovolili i jiným počítačům (dokonce třeba neomezeně), riskovali bychom, že se přes náš poštovní uzel budou nekontrolovatelně šířit spamy (náš server by byl tzv. open-relay). Do souboru /etc/mail/access proto připíšeme řádek, který dovolí přeposílání pošty jakémukoliv počítači připojujícím se z adresy 10.0.0.x (chcete-li přidat další důvěryhodnou IP adresu, připište ji na další řádek s klíčovým slovem RELAY):

10.0.0  RELAY

Tento konfigurační soubor je potřeba převést do binární podoby, ve které bude sendmail rychleji vyhledávat požadované záznamy. Provedeme to takto:

$ cd /etc/mail
$ make

V posledním kroku zajistíme, aby náš systém přijímal poštu pro naši doménu. Kromě správného nastavení MX záznamů ve veřejné definici naší domény musíme sendmailu sdělit, že je pro tuto doménu konečným příjemcem pošty. Toho dosáhneme přidáním naší domény test.cz na zvláštní řádek do souboru /etc/mail/local-host-names a restartováním démona:

$ echo test.cz >> /etc/mail/local-host-names
$ /etc/init.d/sendmail restart

Kontrolu správného nastavení provedeme spuštěním sendmailu v ladícím režimu a zadáním nějaké místní poštovní adresy. Sendmail by měl odpovědět, že pošta bude doručena lokálně (na prvním řádku je spuštění sendmailu v interaktivním ladícím režimu, druhý řádek obsahuje text, který vložíme a pak následuje poslední žádoucí řádek, kterým sendmail oznamuje, že email na tuto adresu bude doručen lokálně):

$ sendmail -bt
3,0 huzva@test.cz
...
parse            returns: $# local $: huzva

Celý systém pro jistotu důkladně vyzkoušejte zasláním několika testovacích dopisů z vnitřní sítě i z Internetu.

Podpora STARTTLS

Nejeprve je potřeba vygenerovat selfsigned certifikát pomocí:

cd /etc/pki/tls/certs
make sendmail.pem

Pokud již takový soubor existuje, můžete ho dle vlastního uvážení smazat a vygenerovat znovu.

Dále je potřeba sendmailu sdělit, že má certifikát používat. V souboru /etc/mail/sendmail.mc odkomentujte řádky:

define(`confCACERT_PATH', `/etc/pki/tls/certs')dnl
define(`confCACERT', `/etc/pki/tls/certs/ca-bundle.crt')dnl
define(`confSERVER_CERT', `/etc/pki/tls/certs/sendmail.pem')dnl
define(`confSERVER_KEY', `/etc/pki/tls/certs/sendmail.pem')dnl

Dále je vhodné odkomentovat řádek, který povolí PLAIN autentizaci uživatele jen v případě, že je uživatel připojen přes šifrované spojení (protože standardně není SMTP protokol nijak zabezpečen). Autentizaci lze sice provádět bezpečně i přes nešifrované spojení, ale to zde neřešíme, protože těchto způsobů je několik. Odkometujte tedy řádek:

define(`confAUTH_OPTIONS', `A p')dnl

Poté přegenerujte /etc/mail/sendmail.cf a restartujte sendmail:

cd /etc/mail
make
service sendmail restart

Testování při použití TLS

Pokud SMTP server podporuje TLS, není pro jeho otestování možné použít klasický telnet, protože nebudeme schopni zakódovat/dekódovat komunikaci po odeslání příkazu STARTTLS. Stačí však použít program openssl, který umožní pracovat se šifrovaným spojením podobným způsobem, jako výše zmíněný telnet. V následujícím příkladu je testováno SMTP spojení s podporou TLS, který je spuštěn na stejném počítači (spojujeme se s IP adresou 127.0.0.1 a portem 25, tj. klasický port pro SMTP):

openssl s_client -ign_eof -starttls smtp -crlf -connect 127.0.0.1:25

Testování funkčnosti

TODO