SENDMAIL
MUAs, MTAs, and MDAs Cấu trúc của 1 Email Message SMTP và the Message Envelope Lịch sử sendmail The Mail Queue Aliases
Giới thiệu
Tại sao dùng Berkeley sendmail? Tải Source Code Cấu hình Build-Time Database Map Support Ví dụ site.config.m4 Biên dịch sendmail
Biên dịch sendmail và cài đặt
File cấu hình có thể làm gì ? So sánh .cf files với .mc files Cấu trúc của .mc File Biến cấu hình FEATURE() Macros Masquerading Relaying Database Maps Sinh ra .cf file từ .mc file
Cấu hình sendmail
Định nghĩa "spam" No Default Relaying Access Control Database Better Checking on Sender Information
Anti-Spam
Các tham số dòng lệnh Khởi động
Chạy sendmail:
MUAs, MTAs, and MDAs
Examples elm, pine, Outlook, Eudora
What It Does MUA là chương trình dùng để đọc và gửi mail. Có thể gọi là mail client.
Part Mail User Agent (MUA)
sendmail, qmail, exchange server
Mail Transfer Agent (MTA)
MTA làm nhiệm vụ như là "mail router". Nó nhận mail từ MUA lẫn MTA, căn cứ vào header của mail mà nó quyết định chuyển đi bằng cách nào
mail.local procmail
MDA chấp nhận các mail từ MTA và chuyển đi cụ thể đến user
Mail Delivery Agent (MDA)
MTA: phần quan trọng nhất. Nó chịu
trách nhiệm làm các công việc chuyển mail “thông minh".
Ví dụ
1.
jsmith's MUA (pine, outlook, … ) trên host1.uiuc.edu chuyển message đến MTA (sendmail) trên local host.
2. MTA (sendmail) chú ý message được đánh địa chỉ đến 1 user tại host2.uiuc.edu. Khi đó nó được cấu hình để biết rằng nó có thể đến host2.uiuc.edu thông qua SMTP, nó chuyển message sang SMTP MDA (thường SMTP MDA được build sẵn trong sendmail, nhưng các MDA khác có thể là 1 chương trình ngoài).
3. SMTP MDA kết nối vào MTA trên host2.uiuc.edu (sendmail)
và gửi nó 1 message.
4. MTA trên host2.uiuc.edu (sendmail) thông báo rằng message
được đánh địa chỉ đến 1 user trên localhost, do đó nó chuyển message vào local MDA.
5. Local MDA lưu message trong mailbox của johndoe . 6. Kế tiếp johndoe kết nối vào host2.uiuc.edu và chạy MUA,
message sẽ ở đó để anh ta đọc.
Quá trình gửi nhận mail
Email messages có 2 phần : Headers: dòng có dạng "field: value" chứa
thông tin về message, như là "To:", "From:", "Date:", and "Message-ID:" Body: nội dung của message
From root@alibaba.citd.edu.vn Tue Nov 30 09:54:29 2010
Return-Path:
by alibaba.citd.edu.vn (8.12.8/8.12.8) with ESMTP id
oAU2sNOR003125
for
+0700
Received: (from root@localhost)
by alibaba.citd.edu.vn (8.12.8/8.12.8/Submit) id oAU2sNKh003123 for natuan; Tue, 30 Nov 2010 09:54:23 +0700
Date: Tue, 30 Nov 2010 09:54:23 +0700
From: root
Structure of an Email Message
[root@alibaba mail]# telnet 172.16.10.1 25 Trying 172.16.10.1... Connected to 172.16.10.1. Escape character is '^]'. 220 pascal.citd.edu.vn ESMTP Sendmail
8.12.8/8.12.5; Sun, 30 Nov 2003 09:14:37 - 0500
helo pascal 250 pascal.citd.edu.vn Hello [192.168.1.13],
pleased to meet you
mail from: tuan@citd.edu.vn 250 2.1.0 tuan@citd.edu.vn... Sender ok
SMTP and the Message Envelope
Quá trình gửi mail
rcpt to:anhtuan98@yahoo.com 250 2.1.5 anhtuan98@yahoo.com...Recipient ok data 354 Enter mail, end with "." on a line by itself subject: Test mail from alibaba CITD This is the message body . 250 2.0.0 hAUEEb7S003989 Message accepted
for delivery
quit 221 2.0.0 pascal.citd.edu.vn closing connection Connection closed by foreign host.
The Past:
sendmail là một trong những MTA cổ nhất và dùng
nhiều nhất trên Internet
Bản gốc được viết trước khi Internet được chuẩn
hoá
Được thiết kế đủ linh hoạt để chuyển mail cho các mail systems khác nhau bất kể tính chất của nó
Today:
Internet được chuẩn hoá nhiều hơn Dùng SMTP (Simple Mail Transfer Protocol) Nhiều tính năng cũ của sendmail được bỏ qua Mặc dù dùng SMTP, MTA vẫn còn được dùng cho
việc dẫn đường mail!
Lịch sử sendmail
sendmail chạy background đợi new
messages. Khi có 1 kết nối đến, một child process được sinh ra để xử lý kết nối, trong khi parent process quay trở lại tiếp tục đợi new connections.
Khi một message được nhận, sendmail child process đặt chúng vào mail queue (/var/spool/mqueue) và theo định kỳ nó sẽ được chuyển đi. Sau khi mail được chuyển đi, nó sẽ bị xoá khỏi mqueue
Messages nằm trong mqueue sẽ ở đó cho
đến khi queue được xử lý. parent sendmail sẽ thường xuyên fork một child process để chuyển bất cứ mail nào còn nằm trong queue theo những quãng thời gian nhất định
The Mail Queue
Xử lý mqueue
Một alias cho phép sendmail chuyển hướng
(redirect) mail gửi đến một address. mail này có thể được redirected đến một email address khác
sendmail's alias database thường được lưu dạng flat-text trong file /etc/mail/aliases.
Ví dụ:
# Basic system aliases -- these MUST be present. MAILER-DAEMON: postmaster postmaster: tuanna root: tuanna tuan: tuanna@citd.edu.vn, natuan@citd.edu.vn
Tập tin /etc/mail/aliases
Mailling list k11: ltanh@fit.hcmuns.edu.vn,
an_npb@vol.vnn.vn , tdduan@fit.hcmuns.edu.vn , DungDang@psv.com.vn , mtdung@citd.edu.vn, nhdung@csc.quangtrungsoft.com.vn, vulq79@yahoo.com, nvdieu@yahoo.com , ngokhuondung@hotmail.com , nghuudong@vol.vnn.vn , dminhduc@vol.vnn.vn, hoaitang@yahoo.com, hungmn_vn@yahoo.com, DucKhoa@ctu.edu.vn, tranthelan@yahoo.com , dtl112@yahoo.com , nghiencuu1@yahoo.com, NguyenVinhNam@vol.vnn.vn , ptlonnet@yahoo.com, phuclx@yahoo.com, dqpmag@yahoo.com, nguyenkienquoc@yahoo.com, thang@citd.edu.vn
Tập tin /etc/mail/aliases
Sau khi đã hiệu chỉnh lập tin aliase ta
phải compile thành binary để sendmail hiểu.
Sử dụng lệnh newaliases. Tập tin
aliases.db sẽ được sinh ra
Tập tin /etc/mail/aliases
Security fixes: Các lỗi về security
được cập nhật và sửa thường xuyên
Features: Các tính năng của sendmail hỗ trợ rất nhiều
Standards: Sendmail là một mail
server hỗ trợ chuẩn SMTP và được chuẩn hoá trên Internet
Support: Sendmail được hỗ trợ
http://www.sendmail.org
Tại sao dùng Berkeley sendmail?
Có thể tải sendmail source code từ : ftp://ftp.sendmail.org/pub/sendmail
(home site)
ftp://uiarchive.uiuc.edu/pub/packag
es/mail/sendmail (local mirror)
Sendmail source code
Nhiệm vụ của tập tin
/etc/mail/sendmail.cf: chỉ cho sendmail biết các công việc phải xử lý khi nhận và gửi mail : General configuration options, such as queue
directory and timeout values
Definitions for each MDA, including pathnames
and options
Rulesets for header processing/rewriting, and the "routing table" which determines which MDAs get used for which messages
Các thông tin này thường là phức tạp đặc
biệt là ở các large mail hub.
Cấu hình sendmail
Tập tin .cf và tập tin .mc
"He who has never hacked sendmail.cf has no soul;
he who has hacked sendmail.cf more than once has no brain.“
Old Hacker Proverb
/etc/mail/sendmail.cf được thiết kế để
sendmail có thể parse nhanh, không phải để human-readable, và nó được xem là một trong những cái bí hiểm nhất mà Unix administrator cần phải đương đầu. Do đó, từ version 8, tập các macros cho m4 macro language được viết để làm nó dễ dàng hơn trong việc thêm xoá sửa và bảo trì cấu hình trong sendmail.cf. Tập tin chứa các macro này gọi là .mc file.
/etc/mail/sendmail.cf
Bảng so sánh .cf với .mc
.cf
.mc
Flexible
very
not totally, but covers 99% of situations
Understandable
no
yes
yes
no
Quickly machine- parsed
Cấu hình cơ bản của.mc là như sau: OSTYPE()
Ví dụ: OSTYPE(linux), m4 sẽ đọc
cf/ostype/linux.m4.
define() Có thể dùng 0 hay nhiều chỉ dẫn define() để thiết lập biến điều khiển thao tác của các cấu hình macro. Cú pháp : define(`variable', `value')
Thông thường, cả variable và value được
đặt trong dấu nháy.
Cấu trúc của .mc
FEATURE() define() Có thể 0 hay nhiều macro FEATURE() để chọn các tính năng đặc biệt nào mà bạn muốn dùng hay hỗ trợ
MAILER() Một hay nhiều MAILER() macros phải được dùng để định nghĩa MDAs nào được dùng bởi cấu hình này. Thường thì chỉ cần định nghĩa local MDA và SMTP MDA, như sau: MAILER(smtp) MAILER(local)
.mc
MASQUERADE_AS(`host.domain')
Masquerading là một phần rất quan trọng của client/server mail hub configuration. Bất kỳ máy nào cấu hình như thế sẽ viết lại SMTP From: header của tất cả outbound mail để cho giống như nó xuất phát từ 1 địa chỉ mà bạn đang muốn mạo danh.
Ex: MASQUERADE_AS(`alibaba.com')
FEATURE(allmasquerade)
macro này cũng quan trọng. Nó sẽ gây nên địa chỉ người nhận cũng như người gửi được mạo danh. Điều này thường hữu dụng trên các máy cluster mà mạo danh như là ở các mail server trung tâm khi bạn muốn tất cả các addresses trên cluster giống như là thế giới bên ngoài khi chúng đến từ mail server.
Masquerading
Bắt đầu từ version 8.9, sendmail sẽ không relay mail từ 1
external host đến 1 host khác nếu chúng không được cấu hình cụ thể. Điều này dùng để ngăn chặn spammers dùng các mail servers để chuyển mail cho chúng
Để cho phép host cụ thể được phép relay ta phải cấu hình lại
sendmail, thêm hostname vào tập tin /etc/mail/relay-domains. Thông thường, các đầu vào trong file này thể hiện toàn bộ các domain mà chúng được phép relay. Tuy nhiên, nếu chúng ta muốn liệt kê cụ thể host trong file, không phải domain, bạn có thể dùng FEATURE(relay_hosts_only).
Nếu vì một vài lý do nào đó bạn cần phải cấu hình sendmail để relay
tất cả các mail, FEATURE(promiscuous_relay) macro sẽ làm sendmail relay bất cứ mail nào đến . Tuy nhiên, dùng macro này là hoàn toàn không khuyến khích bởi vì nó sẽ cho luôn cả spam mail được relay thông qua mail server của ta.
Relaying
Một trong những tính năng hữu
dụng của sendmail là khả năng có thể dò tìm addresses dựa trên bản đồ bên ngoài. Nhiều kiểu maps được hỗ trợ, từ local DB hay DBM databases đến các network-based services như PH, LDAP, hay NIS. Nếu sendmail được biên dịch với - DNEWDB, kiểu default map là hash. Nếu không, kiểu default map là dbm.
Database Maps
FEATURE(virtusertable) map này cho phép ta hỗ trợ virtual domains trên một mail server. Ví dụ: info@foo.com foo-info info@bar.com bar-info joe@bar.com error:nouser No such user here jax@bar.com error:D.S.N:unavailable Address
invalid
@baz.org jane@example.net @foo.org %1@example.com old+*@foo.org new+%2@example.com
FEATURE() macros
Email gửi đến các địa chỉ bên trái sẽ được chuyển cho các địa chỉ tương ứng bên phải. Nếu địa chỉ bên phải bắt đầu là error:, mail sẽ bị dội lại với thông báo lỗi cụ thể. Nếu address bên trái không có 1 user name, tất cả users tại domain cụ thể sẽ được gửi đến địa chỉ bên phải và %1 token sẽ được thay thế bởi username từ original address. Nếu original address có dạng , nó sẽ match một entry cho user+* bên trái và token %2 sẽ được thay bởi original "detail" string.
Tập tin mặc định cho CSDL là
/etc/mail/virtusertable.
FEATURE() macros
Cho phép chọn viết lại các domain
names. Ví dụ, hàng ux4.cso.uiuc.edu students.uiuc.edu sẽ làm tất cả các email cho ux4.cso.uiuc.edu sẽ đựơc xử lý như là students.uiuc.edu.
Tập tin mặc định cho CSDL là
/etc/mail/domaintable.
FEATURE(domaintable)
mailertable là một CSDL ánh xạ cụ
thể các host hoặc domain vào một dạng mailer:host pair. Nó được dùng để chuyển hướng các địa chỉ mail từ cụ thể một host hay domain vào một nơi đến cụ thể dùng một mailer cụ thể (Ví dụ, dùng phquery).
Tập tin mặc định cho CSDL là
/etc/mail/mailertable.
FEATURE(mailertable)
Tính năng này thiết lập CSDL kiểm soát truy cập, nó sẽ cho phép admin có thể kiểm soát users và hosts nào được phép gửi mail vào local machine hay được phép relay mail thông qua local machine. Xem thêm phần Anti-Spam.
Tập tin mặc định cho CSDL là
/etc/mail/access.
FEATURE(access_db)
Mỗi macro tính năng chấp nhận một
tham số mà có thể override the default map type và tên CSDL. Ví dụ, default filename cho mailertable map là /etc/mail/mailertable. Để ép nó dùng dbm map dùng /etc/mailmap, ta phải làm như sau : FEATURE(mailertable, dbm -o /etc/mailmap) Chú ý dùng –o trước filename nói cho
sendmail biết map là optional, do đó nó sẽ không cho là có lỗi nếu không tồn tại map.
FEATURE(access_db)
Trên đây là nhưng thông tin ta viết
trong .mc giờ phải sinh ra sendmail.cf.
Lưu .mc trong thư mục cf/cf directory. Chạy lệnh sau : m4 ../m4/cf.m4 filename.mc > sendmail.cf Với quyền root, move sendmail.cf từ thư
mục cf/cf vào /etc/mail, chmod 644, và tạo symlink vào nó từ /etc.
Sinh ra sendmail.cf từ .mc File
Spam là 1 thành ngữ chỉ các mail thương mại không mong muốn, thường được gửi đến 1 lượng lớn địa chỉ 1 lần. Không ai thích Spam bởi vì: Hầu hết mọi người không thích nhận mail
quảng cáo lẫn với mail thường trong mailbox của mình.
Spammers thường relay một vài thông báo đến hàng nghìn người khác thông qua 1 mail server của ai đó. Việc này sẽ làm tăng tải của mail server, làm giảm băng thông của 1 mạng làm chậm máy tính.
Chương trình sendmail cung cấp 1 vài tính
năng để chặn spam
“Spam“ là gì?
Relaying
Kiểm soát hành vi relay
Directive
Explanation
RELAY_DOMAIN (domainname)
Nó sẽ thêm domainname vào danh sách các domains mà sendmail sẽ cho phép relay mail đến.
RELAY_DOMAIN_FILE (/full/path/to/file)
Nếu ta có 1 lượng lớn domains cần relay đến, bạn có thể dùng chỉ dẫn này đến một tập tin ngoại thay vì dùng nhiều lần RELAY_DOMAIN(). Mặc định tập tin này là /etc/mail/relay- domains, nó chỉ được đọc khi sendmail starts up.
Kiểm soát hành vi relay (2)
Directive
Explanation
FEATURE (relay_hosts_only)
Thông thường, đầu vào của danh sách relay là domains. Tùy chọn này cho sendmail biết phải xử lý nó như là hosts thay vì domains. Điều này cũng làm ảnh hưởng trong tập tin CSDL kiển soát truy cập.
FEATURE (promiscuous_relay)
Chỉ dẫn này làm cho sendmail trả về các hành vi truyền thống và relay bất cứ thứ gì có thể . Điều này là hoàn toàn không nên.
Bắt đầu với version 8.9, sendmail cung
cấp sẵn cơ chế kiểm soán linh hoạt. Tính năng này được chọn với macro the FEATURE(access_db).
Để thiết lập database, tạo text file
/etc/mail/access với các dòng có dạng sau: disposition user@ user@host disposition domainname disposition disposition ###.###
Access Control Database
Dạng đầu sẽ match dựa trên phần username của địa chỉ người gửi. Dạng 2 sẽ match dựa trên cụ thể user@host. Dạng 3 match dựa trên bất kỳ host nào thuộc domainname. Dạng 4 match bất kỳ host nào trong các số IP
Phần bên trái của mỗi đầu vào có thể là tùy
chọn là 1 trong các tiền tố sau To:, From:, or Connect:. Các đầu vào được đánh dấu kiểu này sẽ match với các envelope recipients, envelope senders, hay client host address. Các đầu vào không được đánh dấu với một trong các tags trên sẽ match messages trên bất kỳ envelope recipients, envelope sender, or client host address.
Access Control Database (2)
OK: Được phép chấp nhận mail từ host. RELAY: Cho phép matched được relay
thông qua SMTP server. Có nghĩa là OK.
REJECT: Reject sender/recipient. DISCARD: Bỏ message completely. ERROR:D.S.N:### bong message :
Reject message với dòng báo lỗi cụ thể, với D.S.N là một RFC 1893, ### là RFC 821 tương thích với SMTP response code, và bong message là 1 vài text đi sau nó.
disposition
From:ME_TOO@aol.com REJECT REJECT LUSER@ Connect:spam-king.com
ERROR:5.0.0:550 Tui không thích
Spam
Connect:goodhost.spam-king.com OK From:128.174 bad-domain.com
RELAY REJECT
Access Control Database Example
Nó sẽ reject mail từ ME_TOO@aol.com, nhưng cho phép mail được gửi đến ME_TOO@aol.com. Tất cả các messages với một envelope sender hay envelope recipient ai mà có username trùng với LUSER sẽ bị reject. KHông có hosts nào trong domain spam-king.com ngoại trừ goodhost.spam-king.com sẽ được phép kết nối. Tất cả các hosts trong địa chỉ 128.174.*.* sẽ được cho phép gửi mail ra ngoài, nhưng server này sẽ không relay outside mail ngược lại chúng. Và cuối cùng, tất cả các kết nối từ bad- domain.com sẽ bị từ chối, tất cả các messages với envelope sender hay envelope recipient address từ bad-domain.com sẽ bị rejected.
Giải thích ví dụ
Nhiều spam được gửi trên Internet ngày nay được nguỵ trang với các địa chỉ from không có thật. Để ngăn ngừa loại spam này, Tất cả các phiên bản mới của sendmail làm 2 điều sau với sender addresses. 1. sender address phải có phần username và phần domainname. Mail sẽ không được chấp nhận từ user tuan, nhưng sẽ được chấp nhận từ user tuan@citd.edu.vn . Để tắt tính năng này dùng FEATURE(accept_unqualified_senders). 2. Phần domainname của sender address phải
phân giải được bởi DNS. Để tắt tính năng này dùng FEATURE(accept_unresolvable_domains).
Kiểm tra thông tin Sender
Chạy sendmail
Flag
Description
-bd
-bi
-bp
"become daemon". Chạy sendmail background và sendmail lắng nghe các kết nối SMTP từ mạng. Để nói cho sendmail khởi động CSDL aliases. Tương đương với lệnh newaliases. In ra mail queue, tương tự lệnh mailq.
Chạy sendmail (2)
Flag
Description
-bs
-bv
Run an SMTP session on stdout and stdin, just as if you'd telnetted to port 25. Verify address mode. This flag should be followed with a list of addresses to verify
commonly useful sendmail flags
Flag
Description
-dX
Thiết lập giá trị debug X (không bàn trong bài này).
-F name_of_sen der
Thiết lập full name of sender thàng name_of_sender. Nhiều versions của sendmail sẽ gắn thêm 1 nhãn warning header vào outgoing message khi option này được dùng, bởi vì nó có thể dùng để giả mạo email.
commonly useful sendmail flags
Flag
Description
-qinterval Xử lý mail queue. Nếu không có
interval, queue sẽ được xử lý chỉ 1 lần (giống lệnh runq). Quãn interval là 1 con số với đơn vị (s:seconds, m:minutes, h:hours, d:days, w:weeks). Ví dụ: -q90m và -q1h30m sẽ nói sendmail xử lý queue sau 1 giờ rưỡi. Giá trị thông thường là từ 20 đến 30 minutes.
Chạy sendmail trong daemon mode
với queue interval, như sau: /usr/sbin/sendmail -bd -q20m Dùng ps để kiểm tra sendmail có đang chạy không. Sau đó thử gửi nhận 1 vài mail. Kiểm tra syslog để xem sendmail không báo lỗi gì
Nếu mọi việc trôi chảy. Bạn đã install
sendmail thành công mỹ mãn
Xin chúc mừng !
Starting sendmail
Thank you !