Chương 11 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
Bạn đang xem trước 20 trang tài liệu Chương 11 Sendmail, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
SENDMAIL
Giới thiệu
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
Biên dịch sendmail và cài đặt
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
Cấu hình sendmail
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
Anti-Spam
Định nghĩa "spam"
No Default Relaying
Access Control Database
Better Checking on Sender Information
Chạy sendmail:
Các tham số dòng lệnh
Khởi động
MUAs, MTAs, and MDAs
Part What It Does Examples
Mail User
Agent
(MUA)
MUA là chương trình dùng để
đọc và gửi mail. Có thể gọi là
mail client.
elm, pine,
Outlook,
Eudora
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
sendmail,
qmail,
exchange
server
Mail
Delivery
Agent
(MDA)
MDA chấp nhận các mail từ MTA
và chuyển đi cụ thể đến user
mail.local
procmail
Ví dụ
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".
Quá trình gửi nhận mail
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.
Structure of an Email Message
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:
Received: from alibaba.citd.edu.vn (alibaba [127.0.0.1])
by alibaba.citd.edu.vn (8.12.8/8.12.8) with ESMTP id
oAU2sNOR003125
for ; Tue, 30 Nov 2010 09:54:28
+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
Message-Id:
To: natuan@alibaba.citd.edu.vn
Subject: Test sendmail program
This is the message body.
SMTP and the Message Envelope
[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
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.
Lịch sử sendmail
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!
The Mail Queue
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
Xử lý mqueue
Tập tin /etc/mail/aliases
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ại sao dùng Berkeley sendmail?
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ợ
Sendmail source code
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)
Cấu hình sendmail
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.
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
/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.
Bảng so sánh .cf với .mc
.cf .mc
Flexible very not totally, but covers 99% of situations
Understandable no yes
Quickly machine-
parsed yes no
Cấu trúc của .mc
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.
.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)
Masquerading
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.
Relaying
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.
Database Maps
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.
FEATURE() macros
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(domaintable)
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(mailertable)
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(access_db)
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.
Sinh ra sendmail.cf từ .mc File
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.
“Spam“ là gì?
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
Relaying
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
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.
Kiểm soát hành vi relay (2)
Access Control Database
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:
user@ disposition
user@host disposition
domainname disposition
###.### disposition
Access Control Database (2)
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.
disposition
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ó.
Access Control Database Example
From:ME_TOO@aol.com REJECT
LUSER@ REJECT
Connect:spam-king.com
ERROR:5.0.0:550 Tui không thích
Spam
Connect:goodhost.spam-king.com OK
From:128.174 RELAY
bad-domain.com REJECT
Giải thích ví dụ
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.
Kiểm tra thông tin Sender
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).
Chạy sendmail
Flag Description
-bd "become daemon". Chạy sendmail
background và sendmail lắng nghe các
kết nối SMTP từ mạng.
-bi Để nói cho sendmail khởi động CSDL
aliases. Tương đương với lệnh
newaliases.
-bp In ra mail queue, tương tự lệnh mailq.
Chạy sendmail (2)
Flag Description
-bs Run an SMTP session on stdout and
stdin, just as if you'd telnetted to
port 25.
-bv 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.
Starting sendmail
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 !
Thank you !