################################################ ### Ruleset 96 -- bottom half of ruleset 3 ### ################################################ SCanonify2=96 # handle special cases for local names R$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all R$* < @ localhost . $m > $* $: $1 < @ $j . > $2 local domain R$* < @ localhost . UUCP > $* $: $1 < @ $j . > $2 .UUCP domain # check for IPv4/IPv6 domain literal R$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [addr] R$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal R$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr # if really UUCP, handle it immediately # try UUCP traffic as a local address R$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 R$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3 # hostnames ending in class P are always canonical R$* < @ $* $=P > $* $: $1 < @ $2 $3 . > $4 R$* < @ $* $~P > $* $: $&{daemon_flags} $| $1 < @ $2 $3 > $4 R$* CC $* $| $* < @ $+.$+ > $* $: $3 < @ $4.$5 . > $6 R$* CC $* $| $* $: $3 # pass to name server to make hostname canonical R$* $| $* < @ $* > $* $: $2 < @ $[ $3 $] > $4 R$* $| $* $: $2 # local host aliases and pseudo-domains are always canonical R$* < @ $=w > $* $: $1 < @ $2 . > $3 R$* < @ $=M > $* $: $1 < @ $2 . > $3 R$* < @ $* . . > $* $1 < @ $2 . > $3
Takovéhle spamboty píšou malé děti a nepouští je z počítačů z [virt]labu, odkud je občas potřeba poslat něco důležitého. A lidi mají nastavený forwarding.
$ echo "potazmo" | mail -f from@hea.der -s "Subject 1" test@enve.lope $ uuencode priloha.bin | mail -f from@head.er -s predmet test@enve.lope ### v Linuxu program base64
Někdy s uživatelem komunikuje MSP a provádí část rozhodování/pre-processingu sám, čímž méně zatěžuje MTA a zároveň klade menší nároky na jeho konfiguraci.
Aneb jak "zmodulárnit" monolitický design Sendmailu...
Zkuste si pomocí programu telnet poslat mail. Těmhle adresám se říká envelope, nebo "z obálky".
HELO odesilateluv_stroj MAIL FROM:<odesilatel@obalka.domena> RCPT TO:<prijemce.obal.ka> DATA . QUIT
doména.cz IN MX
doména.cz IN MX 10 mail.doména.cz doména.cz IN MX 20 motýla.mámalý.tom ADDITIONAL: mail.doména.cz IN CNAME kobyla.mámalý.bok
Protože na záznam @ IN A 192.0.2.259 občas lidi zapomenou. http://kolej.mff.cuni.cz/ vs. http://www.kolej.mff.cuni.cz/
Serverem nebo klientem? Chicken-egg problem.
# pkg_add -iv mutt postfix
# yum install mutt postfix
# emerge -av mutt postfix
The mailx utility is compliant with the IEEE Std 1003.1-2008 (``POSIX.1'') specification.
You have mail. # mail Mail version 8.1.2 01/15/2001. Type ? for help. "/var/mail/root": 1 message 1 new >N 1 deraadt@do-not-re Tue Nov 1 07:47 87/4556 Welcome to OpenBSD 5.0! & q Held 1 message in /var/mail/root # ############################################################################# # mail Mail version 8.1.2 01/15/2001. Type ? for help. "/var/mail/root": 1 message 1 unread >U 1 deraadt@do-not-re Tue Nov 1 07:47 87/4556 Welcome to OpenBSD 5.0! & p (výstup z $PAGER) Message 1: From deraadt@do-not-reply.openbsd.org Tue Nov 1 07:47:47 MST 2011 ... & h > 1 deraadt@do-not-re Tue Nov 1 07:47 87/4556 Welcome to OpenBSD 5.0! & d No applicable messages & q #
Z historických důvodů každý používá /usr/sbin/sendmail co se chová různě s různými argv[0].
Např. newaliases má v sendmailu ekvivalent sendmail -bi.
[blocks B ] mail-mta/ssmtp[mta] ("mail-mta/ssmtp[mta]" is blocking mail-mta/opensmtpd-5.3.3.201310281424_p1) [blocks B ] mail-mta/postfix ("mail-mta/postfix" is blocking mail-mta/netqmail-1.06-r2, mail-mta/exim-4.82, mail-mta/sendmail-8.14.7-r1, mail-mta/opensmtpd-5.3.3.201310281424_p1) [blocks B ] mail-mta/exim ("mail-mta/exim" is blocking mail-mta/netqmail-1.06-r2, mail-mta/opensmtpd-5.3.3.201310281424_p1, mail-mta/sendmail-8.14.7-r1, mail-mta/postfix-2.10.2) [blocks B ] mail-mta/netqmail ("mail-mta/netqmail" is blocking mail-mta/exim-4.82, mail-mta/sendmail-8.14.7-r1, mail-mta/postfix-2.10.2, mail-mta/opensmtpd-5.3.3.201310281424_p1) [blocks B ] >=mail-mta/ssmtp-2.64-r2[mta] (">=mail-mta/ssmtp-2.64-r2[mta]" is blocking mail-mta/netqmail-1.06-r2, mail-mta/exim-4.82, mail-mta/sendmail-8.14.7-r1, mail-mta/postfix-2.10.2) [blocks B ] mail-mta/opensmtpd ("mail-mta/opensmtpd" is blocking mail-mta/exim-4.82, mail-mta/sendmail-8.14.7-r1, mail-mta/postfix-2.10.2) [blocks B ] mail-mta/exim ("mail-mta/exim" is blocking mail-mta/ssmtp-2.64-r2) [blocks B ] mail-mta/netqmail ("mail-mta/netqmail" is blocking mail-mta/ssmtp-2.64-r2) [blocks B ] mail-mta/sendmail ("mail-mta/sendmail" is blocking mail-mta/netqmail-1.06-r2, mail-mta/exim-4.82, mail-mta/postfix-2.10.2, mail-mta/opensmtpd-5.3.3.201310281424_p1) [blocks B ] mail-mta/postfix ("mail-mta/postfix" is blocking mail-mta/ssmtp-2.64-r2) [blocks B ] mail-mta/opensmtpd ("mail-mta/opensmtpd" is blocking mail-mta/ssmtp-2.64-r2) [blocks B ] mail-mta/sendmail ("mail-mta/sendmail" is blocking mail-mta/ssmtp-2.64-r2)
"All mail clients suck. This one just sucks less."
(Filip Matzner napsal tohle, diky!) Myslim, ze Muttu staci, aby $MAIL byl adresar a ne soubor a jiz sam pochopi, ze ma cist Maildir format. Tato zmena je pro ty, jez pouzivaji PAM treba na Debianu mnohem jednodussi, nebot staci zmenit prislusny radek v souborech /etc/pam.d/login a /etc/pam.d/sshd na: session optional pam_mail.so dir=~/Maildir standard a nemuseji vsem existujicim uzivatelum menit .profile
Neznamená to "musím to copypastnout"
set from = "username@gmail.com" set realname = "Vaše Jméno" set imap_user = "username@gmail.com" set imap_pass = "hesloheslo" set folder = "imaps://imap.gmail.com:993" set spoolfile = "+INBOX" set postponed = "+[Gmail]/Drafts" set header_cache =~/.mutt/cache/headers set message_cachedir =~/.mutt/cache/bodies set certificate_file =~/.mutt/certificates set smtp_url = "smtp://username@smtp.gmail.com:587/" set smtp_pass = "hesloheslo" macro index gi "<change-folder>=INBOX<enter>" "Go to inbox" macro index ga "<change-folder>=[Gmail]/All Mail<enter>" "Go to all mail" macro index gs "<change-folder>=[Gmail]/Sent Mail<enter>" "Go to Sent Mail" macro index gd "<change-folder>=[Gmail]/Drafts<enter>" "Go to drafts" # My Editor set editor='vim + -c "set textwidth=72" -c "set wrap" -c "set nocp" set move = no #Stop asking to "move read messages to mbox"! set imap_keepalive = 900 set sort=threads bind index \Cr imap-fetch-mail
listen on lo0 listen on pppoe0 tls auth table aliases db:/etc/mail/aliases.db table secrets { smtp.gmail.com => uzivatel:heslo } accept for local deliver to mbox accept from any for domain example.org deliver to mda "procmail -f -" accept from any for any relay via tls+auth://smtp.gmail.com auth "secrets"
int main(int argc, char *argv[]) { setuid(getuid()); if (chdir("/") != 0) err(1, "chdir"); if (strcmp(argv[1], "-c") == 0 && strcmp(argv[2], "/usr/bin/sendmail") == 0) { execle("/usr/bin/sendmail", "sendmail", "-t", (char *)NULL, env); err(1, "execle: sendmail"); } errx(1, "invalid usage\n"); }
# pkg_add -iv postfix # /usr/local/sbin/postfix-enable # vi /etc/rc.conf.local sendmail_flags=NO syslogd_flags="${syslogd_flags} -a /var/spool/postfix/dev/log" pkg_scripts="postfix" # crontab -e zakomentovat #*/30 ... clientmqueuerunner
# pkill sendmail # postfix start
Na klientských počítačích nebo routerech často stačí využít už existující server jen s drobnou modifikací: všechnu poštu předávej na jedno místo, odkud půjde do internetu.
# cd /usr/share/sendmail/cf # vi openbsd-localhost.mc define(`LOCALHOST_ONLY')dnl define(`SMART_HOST', `centrální.smtp.server.swi')dnl include(_CF_DIR_`cf/openbsd-proto.mc')dnl # make openbsd-localhost.cf # mv openbsd-localhost.cf /etc/mail/localhost.cf # pkill -HUP sendmail
Seznamy můžou být řetězce, absolutní cesta k souboru, nebo backend_type:table. Můžete používat např. Berkeley DB jako v Sendmailu, nebo třeba MySQL.
Aktuální konfiguraci vypíše postconf, včetně výchozích hodnot.
echo "unset MAIL" >> ~/.profile echo "export MAILDIR=~/Maildir/" >> ~/.profile logout
I když se jedná o podobnou databázi jako BDB, nemůžete použít makemap(8), kvůli :include:, pipe a dalším možnostem.
$ echo "moje.emailová@adre.sa" >> ~/.forward
moje.doména relay:[primární.mx](ujistěte se, že máte transport_maps = hash:/etc/postfix/transport)
# vi /etc/postfix/main.cf body_checks = regexp:/etc/postfix/body_checks # vi /etc/postfix/body_checks /naše-firemní-tajemství/ HOLD
# vi /etc/postfix/main.cf header_checks = regexp:/etc/postfix/header_checks # vi /etc/postfix/header_checks /^Received: / HOLD
# vi /etc/postfix/master.cf
# service type private unpriv chroot wakeup maxproc command+args
amavisfeed unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
# lidsky: když někdo zavolá "amavisfeed", spusť mu SMTP klienta (ale ne víc než dva)
# vi /etc/postfix/master.cf # service type private unpriv chroot wakeup maxproc command+args 127.0.0.1:10025 inet n - n - 2 smtpd -o mynetworks=127.0.0.0/8 -o content_filter= -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters -o ... opšny odsud, aby to jako v pohodě odešlo ... # lidsky: poslouchej na lokálním portu 10025 a dávej ty věci SMTP serveru; # a hlavně už na to znovu neaplikuj žádné checky ani filtry
# vi /etc/postfix/main.cf
# na tomhle portu musí čekat služba amavisd
# ta spouští SpamAssassin, antiviry atd.
# její nastavení je v amavisd.conf
content_filter = amavisfeed:[127.0.0.1]:10024
# lidsky: tím "amavisfeed"em nahoře se připoj na port 10024 a nech to tam
# vi /etc/postfix/main.cf header_checks = regexp:/etc/postfix/header_checks # vi /etc/postfix/header_checks /^Subject: \[?NSWI106/ FILTER amavisfeed:[127.0.0.1]:10024
The plug-in API is described in cyrus_server.c and cyrus_client.c. It was unavoidably contaminated^h^h^h^h^h^h^h^h^h^h^h^hinfluenced by Cyrus SASL and may need revision as other implementations are added.
# saslauthd -d -a getpwent
# saslauthd -d -a [pam|shadow]
$ testsaslauthd -s smtp -u <uživatel> -p <heslo>
# vi /etc/sasl2/smtpd.conf
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
klient | server |
---|---|
(je na houbách) | (0) Načte konfiguraci ze <servicename>.conf |
(1) Otevře spojení na SMTP server:
⇒EHLO klient |
(2) Nové spojení accept(2)ne sasl_server_new("<servicename>") → se nějak musí dostat k saslauthd(8) socketu → proto s Cyrus SASL nemůžu jen tak použít chroot → Dovecot umí AF_INET sockety, ale jiní neumí Dovecot sasl_listmech(3) ⇐250-AUTH PLAIN LOGIN |
(3) sasl_client_new(3) Stáhnu si seznam mechanismů: sasl_client_start(3) a vyberu si, který umím: ⇒AUTH PLAIN (base64-encoded-data) |
(4) Začnu se přihlašovat, jak řekl: sasl_server_start(mech_od_klienta) Odešlu další krok přihlašování: sasl_server_step(3) cyklím, dokud mi vrací SASL_CONTINUE ⇐334 (more-base64-encoded-crap) |
(5) Tak dlouho volám
sasl_client_step(3), dokud mi vrací SASL_INTERACT ⇒(even-more-base64-encoded-data) |
(6) Podle průběhu vrátím SASL_OK nebo SASL_CONTINUE |
sasl_dispose(3) MAIL FROM: RCPT TO:nebo taky QUIT |
# vi /etc/postfix/main.cf
smtpd_sasl_auth_enable = yes
# chcete-li psát do hlavičky, kdo se přihlásil:
smtpd_sasl_authenticated_header = yes
$ chmod 600 ~/.muttrc $ vi ~/.muttrc set smtp_url = "smtp://uživatel@smtp.server.swi/" set smtp_pass = "heslonekleslo" # set smtp_authenticators = "plain" # není většinou potřeba
# vi /etc/postfix/main.cf
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
$ openssl s_client -starttls smtp -host <server> -port 25
It is strictly discouraged to use this mode from main.cf. If you want to support this service, enable a special port in master.cf and specify "-o smtpd_tls_wrappermode=yes"
$ openssl s_client -host <server> -port 465
# openssl genpkey -genparam -algorithm EC -pkeyopt ec_paramgen_curve:secp521r1 -out /etc/ssl/ecparam.pem
(u-mě)# openssl req -x509 -days 142 -newkey ec:/etc/ssl/ecparam.pem -keyout private/virtlab-ca.key -out virtlab-ca.crt
# cd /etc/ssl/ # openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out private/postfix.key
# openssl req -new -key /etc/ssl/private/postfix.key -out /etc/ssl/private/postfix-<vaše-doména>.csr # sftp certifikaty@172.16.77.7 ## heslo c put /etc/ssl/private/postfix-<vaše-doména>.csr
(u-mě)# openssl x509 -req -days 142 -in postfix-<vaše-doména>.csr -CA virtlab-ca.crt -CAkey private/virtlab-ca.key -CAcreateserial -out postfix-<vaše-doména>.crt
# mkdir -p /etc/ssl/certs
# cd /etc/pki/tls/certs; mv virtlab-ca.crt /etc/pki/tls/certs
# mv virtlab-ca.crt /etc/ssl/certs; cd /etc/ssl/certs # ln -s virtlab-ca.crt `openssl x509 -noout -hash -in virtlab-ca.crt`.0
# openssl verify postfix-<vaše-doména>.crt
# cat postfix.crt ca.crt > chain.crt # vi /etc/postfix/main.cf smtpd_tls_cert_file = /etc/postfix/chain.crt smtpd_tls_key_file = /etc/ssl/private/postfix.key # /etc/pki/tls/? smtpd_tls_security_level = may smtpd_tls_auth_only = yes
# vi /etc/mail/smtpd.conf pki mail.firma.cz certificate "/etc/ssl/mail.firma.cz.crt" pki mail.firma.cz key "/etc/ssl/private/mail.firma.cz.key" pki mail.firma.cz ca "/etc/ssl/superbezpecna-ca.crt" listen on vic0 tls pki mail.firma.cz auth # /etc/rc.d/smtpd restart
Více v smtpd.conf(5) u direktivy listen on.
Tučné příkazy jsou standardní a fungují všude. Ostatní jen někde.
věc | Postfix | Sendmail | OpenSMTPD |
---|---|---|---|
vypsat fronty | postqueue -p, qshape | mailq | smtpctl show queue |
popostrčit fronty | postqueue -f | sendmail -q [-v] | smtpctl schedule all |
restartovat | postfix reload | /etc/rc.d/${service} restart | |
přegenerovat mapy | postmap | makemap | |
přegenerovat aliasy | postalias | sendmail -bi | newaliases |
vypsat konfiguraci | postconf [-n] | less + kýbl | less |
sledovat, co se děje | tail -f /var/log/maillog | smtpctl monitor |
věc | Postfix | Sendmail |
---|---|---|
domény, pro které se doručuje lokálně | mydestination | class $=w /etc/mail/local-host-names |
IP adresy, které mají povolený open relaying | mynetworks, mynetworks_style | mapa access /etc/mail/access[.db] |
jméno naší domény (používané dále) | mydomain | makro $j define(`confDOMAIN_NAME', `doména.swi') |
do kterých domén bude povolen relaying všem | relay_domains | class $=R /etc/mail/relay-domains[.db] |
na co se přepisují maily z lokálních domén | myorigin | makro M/class $=M MASQUERADE_AS(`doména.cz') MASQUERADE_DOMAIN(`další.doména') |
kam se tupě forwarduje všechna pošta | relayhost | makro S define(`SMART_HOST', `mail.provajdr.cz') |
cd /usr/share/sendmail/cf vi <vas-konfig>.mc make <vas-konfig>.cf cp <vas-konfig>.cf /etc/mail/sendmail.cf
# For normal use: "-L sm-mta -bd -q30m", and note there is a cron job sendmail_flags="-L sm-mta -C/etc/mail/localhost.cf -bd -q30m"
co vás zmate: | sendmail cf | m4 |
---|---|---|
zpracování souboru | po řádcích | jako stream |
začátek komentáře | # | dnl |
názvy definic | jednopísmenné (historicky), nebo {takovéto} | k nerozeznání od zbytku, ``úvozovkami proti expanzi'' |
příkaz "verze" | příkaz V = verze syntaxe makro {Z} = verze konfigurace | makro VERSIONID() = jen komentář proměnná confCF_VERSION = $Z |
pojem "mailer" | příkaz M: Mjabber, P=/bin/jabb, F=lsDFMe, S=10 | makro MAILER() includující /usr/share/sendmail/mailer/název.m4 Může používat dříve definované proměnné! |
autoři se asi inspirovali Nocí v Roxbury ;-)
Ty uvnitř oddělují dvě makra od sebe
root:/root:50# m4 - define(mojemakro, `blemc') define(druhe, mojemakro `blemc') druhe blemc blemc druhe blemc blemc define(treti, mojemakro`potazmo') treti blemcpotazmo define(ctvrte, ``mojemakro'mojemakro'mojemakro)ctvrte mojemakromojemakroblemc define(pate, `mojemakro`'mojemakro')pate blemcblemc define(seste, ``mojemakro''`mojemakro')seste mojemakroblemc define(sedme, `seste')sedme mojemakroblemc define(sedme, ``seste'')sedme seste
První je ta mezi dvěma define(), druhá je mezi druhým define() a jeho voláním. Nádherný jazyk, že? Obzvlášť vhodný pro generování souborů, kde na každé mezeře záleží...
scanf() line bufferring
Djobsah makra # makro $j je "obsah makra" D{sendmailMTACluster}$m # makro ${sendmailMTACluster} je aktuální $m
Cwlocalhost mail.firma.edu # class {w} (neboli $=w) obsahuje řetězce "localhost" a "mail.firma.edu" C{TrustAuthMech}PLAIN LOGIN # definice $={TrustAuthMech}
Fw/etc/mail/local-host-names # do class {w} se načtou data ze souboru Fw-o /etc/mail/local-host-names # soubor nemusí existovat F{myClass}|/bin/myProgram # z roury
Knázev typ argumenty # POZOR! "typ" se anglicky řekne "class" # mapa "generics" může být (-o) v Berkeley db(4) hash-table v souboru Kgenerics hash -o /etc/mail/genericstable # tohle mapuje uzivatelska jmena → maily, jak je najde v LDAP base DN -b na stroji -h KmapaLidi ldapx -k"uid=%s" -v"mail" -hldap.firma.edu -b"ou=Uzivatele,o=firma" # mapa uidNumber → loginName z /etc/passwd KmapaUidu text -z: -k2 -v0 /etc/passwd
makra | classy | ||
---|---|---|---|
$j | FQDN m4: confDOMAIN_NAME | $=t | trusted users |
$w | short hostname | $=w | naše jména, co s tím přijde, je lokální |
$m | lokální doména | $=m | naše domény; Nepoužívá se v m4! máte "domaintable" TODO a co relay_entire_domain?? |
$S | smart host, kam se vše relayuje | $=O | oddělovače uživatel/síť nebo doména |
makra | classy | ||
---|---|---|---|
$Z | verze konfigurace | $=P | jména, která končí tímhle, jsou kanonická (TODO kanonizovaná?) |
$M | MASQUERADE_AS na co se maškaráduje | $=M | MASQUERADE_DOMAIN[_FILE] jaké adresy se maškarádují |
$R | Nepoužívá se! a to ani LOCAL-RELAY | $=R | stroje mající povolený relay /etc/mail/relay-domains |
$L | Nepoužívá se? a to ani LUSER_RELAY | $=L | lokální uživatelé LOCAL_USER[_FILE] |
Fronty: makro QUEUE_DIR, což je standardně /var/spool/mqueue/.
Konfigurace je v adresáři MAIL_SETTINGS_DIR, což je standardně /etc/mail/.
# nutne napr. pri pouziti dnsbl (fakt?) Connect:127.0.0.1 RELAY From:misc@ REJECT To:chocholousek@med.cuni.cz ERROR:"550 Tvarnice nebrat"
TODO nezapomenout: přegenerují se pomocí newaliases(8), které na rozdíl od makemap(8) dělá ještě něco (co?)
- uzitecna makra: SMTP_MAILER_MAX, SMTP_MAILER_MAXMSGS, SMTP_MAILER_MAXRCPTS [LOCAL_*], [PROCMAIL_*], [CYRUS_*], [QPAGE_*], - MODIFY_MAILER_FLAGS(`LOCAL'. `+e') craziness - uzitecne FEATUREs: always_add_domain pro spolecna uloziste, *_entire_domain, use_client_ptr [stickyhost] mailertable - routovani domen, ktere nejsou local (class {w}) rozdil mezi mailertable a domaintable? (ruleset 5 vs ruleset 3) http://plug-and-pray.blogspot.com/2008/02/sendmail-maildir-format.html - class {R}, RELAY_DOMAIN() nebo RELAY_DOMAIN_FILE() nebo access db cela sekce "ochrana proti spamu" - aspon SPF (dkim se bral v seminari) Spam Permitted From? - FEATURE(`dnsbl') - vizte http://mail-abuse.org/ nebo RBL LOCAL_RELAY nam umoznuje relayovat vsechnu postu na 1 misto (centralni server) bez individualniho nastavovani .forward nebo procmailu LOCAL_USER a.k.a. $=L jsou uzivatele, ktere z toho chci vynechat upravit a vymyslet vtipnou bounce msg (misto vychoziho otrepaneho mailure failure) SRV zaznamy pro autokonfiguraci veci jako Thunderbird... http://tools.ietf.org/html/rfc6186