Hlavní navigace

Pošta pro každého (2)

8. 7. 2002
Doba čtení: 9 minut

Sdílet

Zlí jazykové tvrdí, že konfigurační soubor Sendmailu je nejtemnějším souborem v celém unixovém světě a mají pravdu. Naštěstí si to uvědomují i tvůrci tohoto programu, a tak díky metakonfiguraci je jeho nastavení téměř triviální. V našem článku se podíváme na různé možnosti konfigurace a spouštění (i na možnosti vhodné pro vytáčené připojení).

Jak jsme si již řekli minule, k Sendmailu patří balík m4 maker sloužící pro snadnou konfiguraci. Vytvoříme jednoduchý konfigurační metasoubor a jeho zpracováním získáme vlastní konfigurační soubor. V něm už se nešťouráme. Je pravda, že takto nelze dosáhnout atypického nastavení, ale většiny toho, co běžně potřebujeme, ano.

Z praktických důvodů si konfigurační metasoubor uchovávám vždy spolu s používaným vygenerovaným souborem v adresáři /etc/mail se stejným jménem, ale příponou .mc. Vyhnu se tak problémům s jeho hledáním. Provedu-li změny, aktivuji je jeho zpracováním a odesláním signálu běžícímu Sendmailu (použití

../m4/cf.m4 záleží na tom, je-li ve vlastním konfiguračním metasouboru vloženo; umístění maker závisí na distribuci; odeslání signálu HUP démonu též a killall není čistým řešením).

cd /usr/share/sendmail/cf/m4
m4 ../m4/cf.m4 /etc/mail/sendmail.mc >/etc/mail/sendmail.cf
killall -HUP sendmail

Takto vypadá typický základ konfiguračního metasouboru /etc/mail/sen­dmail.mc pro GNU-Linux:

divert(-1)dnl
Toto je komentář. V konfiguraci se neobjeví.
divert(0)dnl
dnl Pokud nechcete tento soubor psát jako
dnl  argument m4, odkomentujte toto:
dnl include(`../m4/cf.m4')dnl
dnl takto si lze označit konfiguraci
VERSIONID(`toto se objeví v konfiguraci jako komentář')dnl
dnl typ operačního systému
OSTYPE(`linux')dnl
dnl typ domény (obecná)
dnl (Nastavení je určeno pro správce velkých systémů.)
DOMAIN(`generic')dnl
dnl místní poštu doručuje Procmail
FEATURE(`local_procmail')dnl
dnl připojit definice pro místní poštu
MAILER(`local')dnl
dnl připojit definice pro protokol SMTP
MAILER(`smtp')dnl
dnl připojit definice pro Procmail
MAILER(`procmail')dnl

Komentáře v m4 začínají dnl (Delete to New Line) nebo se uzavírají mezi divert().

Ostatní parametry, uváděné dále, jsou zařazovány v tomto pořadí:

VERSIONID
OSTYPE
DOMAIN
FEATURE
lokální definice maker
MAILER
LOCAL_CONFIG
LOCAL_RULE_*
LOCAL_RULESETS

Základ neprivilegovaného konfiguračního souboru submit.cf najdeme mezi m4 makry jako /usr/share/sen­dmail/cf/cf/sub­mit.mc (záleží na distribuci). V tomto článku je jen jediné nastavení vhodné do tohoto souboru.

Jak Sendmail spustit

Přesto, že to většinou řeší distribuce, není na škodu vědět více.

Novější Sendmail používá dvě konfigurace – /etc/mail/sen­dmail.cf, pokud je spouštěn jako superuživatel nebo je v příkazovém řádku -Am, a /etc/mail/sub­mit.cf, pokud není spouštěn jako superuživatel nebo je v příkazovém řádku -Ac.

Sendmail se tedy spouští pod superuživatelem jako dva démony, typicky těmito příkazy:

# Sendmail jako MTA
/usr/sbin/sendmail -L sm-mta -bd -q1h
# Sendmail pro kontrolu MSP fronty
/usr/sbin/sendmail -L sm-msp-queue -Ac -q30m

Argument -bd říká, že se spustí jako SMTP démon, -L slouží k identifikaci v systémových záznamech, a -qinterval říká, jak často se bude pokoušet odeslat poštu čekající ve frontě.

Pokud spustíme Sendmail s parametrem -q, Sendmail se nespustí jako démon, ale pouze projde frontu a pokusí se odeslat všechnu neodeslanou poštu. Toho lze využít na vytáčených linkách. Při přihlášení k Internetu spustíme příkaz na vyprázdnění fronty. Pokud používáme pppd, bývá typické umístění souboru /etc/ppp/ip-up, a i když pppd (které je suid) spustí neprivilegovaný uživatel, soubor se vykonává s právy superuživatele.

# vyprázdnit neprivilegovanou (MSP) frontu
/usr/sbin/sendmail -L sm-msp-queue -Ac -q &
# vyprázdnit MTA frontu
/usr/sbin/sendmail -L sm-mta -q &

Na stav front se lze zeptat jako superuživatel:

# dotázat se na fronty
mailq -Ac ; mailq

K příkazům lze přidat argument -v, který zapne upovídaný režim. Pak můžeme sledovat navazování komunikace mezi programy.

Konfigurace Sendmailu

Je několik možností, jak nakonfigurovat Sendmail:

Sendmail vůbec nespouštět.

Toto nastavení je možné na samostatném počítači a systému, který nepracuje jako SMTP server.

Problémem tohoto nastavení je fakt, že nedoručená zpráva zůstane ve frontě. Nevím, zda lze Sendmail nakonfigurovat, aby takovou poštu ihned vrátil. Na pevné lince proto tedy tento postup nelze doporučit.

Na vytáčené lince se fronta explicitně vyprázdní při připojení. Může se však stát, že pošta z nějakého důvodu při připojení neodejde. V tomto případě nedostaneme žádné varování, takže je nutné se explicitně dotázat na stav fronty.

V tomto nastavení se zřejmě uchýlíme ke staršímu, méně bezpečnému typu instalace (nepřepokládám, že bychom sami na sebe prováděli lokální útoky) a Sendmail nastavíme jako suid root. Konfigurace submit.cf bude jen symbolickým odkazem na sendmail.cf; /var/spool/cli­entmqueue pak můžeme zrušit. Ušetříme si tím komplikace a na stav fronty se bude moci příkazem mailq ptát i běžný uživatel.

Sendmail spustit pouze jako přijímající agent.

Pokud jsme odpojeni od sítě, nemá smysl, aby se Sendmail pokoušel zprávu doručit. K tomu slouží označení daného protokolu za „drahý“. Tím instruujeme Sendmail, aby zprávy neodesílal, není-li k tomu explicitně vyzván:

dnl přihlédnout k ceně protokolu
define(`confCON_EXPENSIVE',`True')dnl
dnl SMTP je drahý protokol
MODIFY_MAILER_FLAGS(`SMTP', `+e')dnl

Démony v takové konfiguraci spustíme bez argumentu -qinterval.

Nevýhody jsou zřejmé: Pokud rozesíláme po firmě poštu pomocí SMTP, neodejde. Po připojení k Internetu budeme muset vyměnit konfigurační soubor a zaslat démonům Sendmailu signál HUP. Pokud bychom si však dali s konfigurací více práce, lze tento systém rozchodit lépe (definicí nového MAILERu, který bude identický se SMTP, nebude označen jako „drahý“, a bude rozesílat poštu po firmě).

Výhody jsou jen dvě: Pokud budeme odpojeni od Internetu, nebude se démon prohrabovat na disku a pokoušet se doručit poštu. Pokud je systém nastaven na vytáčení na žádost, je možné touto konfigurací zajistit, že se počítač nepřipojí k Internetu kvůli každé zprávě zvlášť.

K tomu však potřebujeme ještě zablokovat Sendmailu žádosti na DNS. To lze pomocí /etc/mail/ser­vice.switch (jeho syntaxe je stejná jako /etc/nssswitch­.conf).

Sendmail spustit plně.

Je to asi nejjednodušší, a přitom univerzální nastavení. Lze jej použít i na vytáčených linkách, protože Sendmail nepovažuje dočasně nefunkční vyhledání příjemce pomocí DNS za důvod pro vrácení zprávy.

Užitečná nastavení

Sendmail používá stovky nastavovacích voleb. Nyní popíšu ty, které považuji za nejužitečnější. Musíte si z nich vybrat podle vlastních potřeb. Jsou zde uvedeny podle logických souvislostí a jejich pořadí v konfiguračním metasouboru určuje výše uvedené schema. Jsou určeny pro konfiguraci sendmail.mc.


Pokud chceme přeposílat poštu přes SMTP server providera jako Relay, využijeme následující nastavení:

define(`SMART_HOST', `esmtp:smtp.muj_provider.cz')dnl

Má to své výhody i nevýhody. Pošta poputuje o něco déle, avšak budeme se při tom připojovat k blízkému serveru, a proto rychleji odejde. Posíláme-li hromadnou zprávu, její hromadné odesílání pak připadne až dalšímu serveru. Toto nastavení je vhodné i z jiného důvodu: Některé antispamové filtry blokují poštu, která přichází ze SMTP serveru na vytáčených linkách.


Pokud se připojujeme k Internetu jen jednou denně, přijde vhod prodloužení času, za který dostaneme varování:

dnl varování, není-li zpráva odeslána za 2 dny
define(`confTO_QUEUEWARN',`3d')dnl
dnl vrátit neodeslanou zprávu za 32 dny
define(`confTO_QUEUERETURN', `32d')dnl
dnl varování, není-li naléhavá zpráva odeslána za 4 hodiny
define(`confTO_QUEUEWARN_URGENT',`4h')dnl

Toto nastavení je užitečné přidat do obou konfiguračních souborů (tedy i submit.mc).


Pokud Sendmail používáme na vytáčené lince nebo za firewallem i pro přijímání pošty, může se hodit, abychom přijali poštu i v době, kdy je DNS server odesílatele nedostupný. Vyhneme se tak nechtěnému vrácení pošty jako nedoručitelné:

dnl přijímat poštu z nedostupných domén
FEATURE(`accept_unresolvable_domains')dnl

Pokud provozujeme malou lokální síť, nedostupnou z Internetu, SMTP server, který sbírá poštu, může mít nastaveno:

dnl rozesílat poštu z místní domény
FEATURE(`relay_entire_domain')dnl

Obecnější nastavení pak umožňuje zadat výčet adres, ze kterých budeme poštu přijímat. Vyhněme se však následujícímu:

dnl rozesílat poštu z celé sítě
FEATURE(`promiscuous_relay')dnl

Jinak vás během několika dnů najdou spameři, aby s vaší nechtěnou pomocí mohli beztrestně rozesílat poštu na stamilióny adres. Několik dnů nato skončíte na černé listině a žádný seriózní provider od vás poštu nepřijme.


I Sendmail ovládá maškarádu. U vytáčených linek je to vlastnost velmi důležitá – bez ní bychom odpovědi dostávali na adresu, kterou nám při připojení k Internetu dočasně přidělil provider.

Moderní programy vše v jednom to sice umí také, ale takto to elegantně provedeme ve všech programech, navíc s možností výhrady lokální pošty po firmě, která tak nebude putovat přes providera.

Pokud má celá firma vlastní doménu, můžeme veškerou poštu vydávat za poštu z této domény:

dnl maskovat se jako moje_firma.cz
MASQUERADE_AS(`moje_firma.cz')dnl
dnl maskovat jména v doméně moje_firma.dialup.muj_provider.cz
MASQUERADE_DOMAIN(`moje_firma.dialup.muj_provider.cz')dnl

Tyto vlastnosti jsou pak volitelné:

dnl maskovat celou místní doménu
FEATURE(`masquerade_entire_domain')dnl
dnl maskovat i obálku zprávy
FEATURE(`masquerade_envelope')dnl
dnl maškaráda i pro lokální poštu
dnl (aby šla přes providera)
FEATURE(`allmasquerade')dnl

Standardní nastavení zakazuje maškarádu pro uživatele root. Doufám, že nikdo z vás nepoužívá konto superuživatele na vyřizování pošty.


Pokud chceme maskovat každého uživatele jinam, nepoužijeme maškarádu. Slouží k tomu generická tabulka. Aby byla použita, je třeba tuto schopnost aktivovat:

dnl použít generickou tabulku
FEATURE(`genericstable')dnl
dnl volitelně generickou tabulku pro celou místní doménu
FEATURE(`generics_entire_domain')dnl
dnl použít na jména v doméně moje_firma.dialup.muj_provider.cz
GENERICS_DOMAIN(`moje_firma.dialup.muj_provider.cz')dnl

Namísto jména moje_firma.di­alup.muj_provi­der.cz si zapíšeme jméno, které jsme svému stroji dali (zjistíme to příkazem hostname -f).

Vlastní tabulka se ukládá do souboru /etc/mail/gene­ricstable a může vypadat třeba takto:

bfu     franta.b.u@seznam.cz
lamer   big.brain@hotmail.com
hacker  pepa@sourceforge.net

Před použitím musí být zkompilovaná pomocí:

# zkompilovat generickou tabulku
makemap hash /etc/mail/genericstable

Pokud pak bfu pošle z libovolného programu z místního účtu poštu, v kolonce odesílatele se automaticky objeví franta.b.u@seznam.cz.


Tím jsme zdaleka nevyčerpali možnosti Sendmailu. Pro běžné nastavení malého serveru to stačí, a zbytek si dohledáte v README.

Doporučení: Než začnete experimentovat, ujistěte se, že ve frontách nejsou žádné důležité zprávy a ani žádné nepřijdou. Po nastavení si pošlete poštu na své účty a vyzvedněte si ji. Pošta musí odejít k providerovi a vrátit se. Nezapomeňte jí zkontrolovat hlavičky, zejména položku From! Musí tam být adresa vašeho konta na Internetu. Pošta se špatnou hlavičkou From se sice může v pořádku vrátit, ale o odpovědi na ní už to platit nebude.

UPDATE 10. 2. 2003:

Chcete-li používat dvoudémonový režim (MSP/MTA) v nejnovějším Sendmailu a zároveň maškarádu resp. generickou tabulku, musíte ještě přidat následující řádky:

MASQUERADE_DOMAIN_FILE(`/etc/mail/soubor')dnl

resp.

root_podpora

GENERICS_DOMAIN_FILE(`/etc/mail/soubor')dnl

Soubor, na který tabulky ukazují, musí obsahovat jména lokálních počítačů, kterých se převod jmen odesílatelů týká. Používáte-li soubor /etc/mail/local-host-names, může jít o odkaz na něj. Důvodem této změny je fakt, že podle RFC musí provést kvalifikaci jména již MSP, nikoliv až MTA, jak to dělaly předchozí verze.

UPDATE 21. 9. 2003:

Aby MSP mohl tuto kvalifikaci provést, musíte ze souboru sendmail.mc do souboru submit.cf zkopírovat všechny konfigurační volby k tomu potřebné (tedy především údaje o generické tabulce a maškarádě). Pokud to neprovedete, odchozí mail se nejdříve uloží jako nedoručený (s nekvalifikovaným odesílatelem) do fronty, a teprve při dalším pokusu (tedy za půl hodiny až za hodinu) je opraven a poslán.

Byl pro vás článek přínosný?

Autor článku