第一、Sendmail服務器的搭建
1、軟件包:
sendmail.i386 <---郵件服務器端 MTA
sendmail-cf.i386 <---郵件服務器的配置文件
sendmail-devel.i386 <---郵件服務器端的開發包
sendmail-doc.i386 <---幫助文檔
m4.i386 <---處理配置文件的工具
dovecot.i386 <---pop郵件服務器端 MDA
procmail.i386 <---負責把郵件分發到不同的用戶郵箱(用戶的郵件文件/var/mail/username)
2、配置Sendmail之前的準備
實驗的環境:
sendmail服務器: 10.1.1.92
DNS服務器:10.1.1.67
a、設定好主機名字
hostname slave.upl.com
vim /etc/hosts
10.1.1.92 salve.upl.com
b、設定郵件服務器的/etc/resolv.conf
vim /etc/resolv.conf
nameserver 10.1.1.67
c、給DNS服務器添加MX記錄
vim /var/named/chroot/var/named/data/master.upl.com.zone <---這是10.1.1.67 DNS服務器上的文件
IN MX 0 slave.upl.com.
slave IN A 10.1.1.92
service named reload
驗證是否生效:
[root@mail ~]# nslookup
> set type=mx
> upl.com
Server: 10.1.1.67
Address: 10.1.1.67#53
upl.com mail exchanger = 0 slave.upl.com. 《---成功了
d、同時時間,讓sendmail服務器時間正確
[root@slave ~]# while :
> do
> ntpdate 10.1.1.1 > /dev/null 2>/dev/null
> sleep 30
> done &
2、配置sendmail服務器
配置文件目錄:/etc/mail
access 《--訪問控制文件
access.db
local-host-names 《--給服務器綁定多個域名
sendmail.cf 《--sendmail運行時使用的主要配置文件
sendmail.mc 《--配置的主要文件
virtusertable 《--給服務器配置虛擬域名
virtusertable.db
/etc/aliases 《--給用戶郵件設定別名
/etc/aliases.db
例子1:運行最簡單的本地郵件服務器
service sendmail restart
[root@slave mail]# netstat -ntl | grep 25
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
使用:telnet 測試
[root@slave mail]# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 slave.upl.com ESMTP Sendmail 8.13.8/8.13.8; Fri, 6 Nov 2009 10:18:45 +0800
helo slave.upl.com
250 slave.upl.com Hello localhost.localdomain [127.0.0.1], pleased to meet you
mail from:[email protected]
250 2.1.0 [email protected]... Sender ok <---寄信人的地址,隨便寫
rcpt to:[email protected] <--收件人的地址
250 2.1.5 [email protected]... Recipient ok
data <---輸入郵件內容
354 Enter mail, end with "." on a line by itself
Good moning!
. <---結束內容輸入
250 2.0.0 nA62IjUS003044 Message accepted for delivery
quit
221 2.0.0 slave.upl.com closing connection
Connection closed by foreign host.
發送郵件的命令還有:
mail -s "Just for test" [email protected] < /etc/fstab
查看郵件是否發送tom用戶
cat /var/mail/tom
例子2:讓服務器監聽所有地址的25端口
1、修改配置文件
搜索Addr關鍵字,按照下面的修改設定:
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
轉換配置文件:
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
2、service sendmail restart
3、測試與驗證
# netstat -ntl | grep 25
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
# telnet 10.1.1.92 25
Trying 10.1.1.92...
Connected to slave.upl.com (10.1.1.92).
Escape character is '^]'.
220 slave.upl.com ESMTP Sendmail 8.13.8/8.13.8; Fri, 6 Nov 2009 10:33:31 +0800
例子3:實現支持短域名形式和綁定別的域名
1、
vim /etc/mail/local-host-names
upl.com
hot.com
2、重啓並驗證
service sendmail restart
telnet 10.1.1.92 25
......
rcpt to: [email protected]
250 2.1.5 [email protected]... Recipient ok
......
例子4:郵件別名,支持羣發,轉發
1、/etc/aliases
mygod: tom ---> 郵件發給 [email protected]都會轉發給 [email protected]
it: tom,bean,mary 郵件發給 [email protected] 都會羣發給 後面指定的用戶
生成aliases.db文件:
newaliases
2、重啓服務器驗證
service sendmail
cat /etc/fstab | sendmail -v [email protected] <---介紹另一種發送郵件的命令
cat /etc/fstab | sendmail -v [email protected]
例子5: 支持發送外部郵件,也就是把郵件發送到外部的地址
在配置前,使用另一臺機器測試驗證:
[root@mail ~]# telnet 10.1.1.92 25
Trying 10.1.1.92...
Connected to station92.cluster.com (10.1.1.92).
Escape character is '^]'.
220 slave.upl.com ESMTP Sendmail 8.13.8/8.13.8; Fri, 6 Nov 2009 11:41:25 +0800
helo slave.upl.com
250 slave.upl.com Hello station67.cluster.com [10.1.1.67], pleased to meet you
mail from:[email protected]
250 2.1.0 [email protected]... Sender ok
rcpt to:[email protected]
550 5.7.1 [email protected]... Relaying denied 《---中繼拒絕
什麼叫中繼?
中繼就是讓你的郵件服務器能夠把郵件發送到外面的網絡
默認情況下,是拒絕其他登錄過來的用戶發送外部郵件 ,在上面的例子中,我是從10.1.1.67 登錄到 10.1.1.92這臺smtp服務器,只允許從 10.1.1.92 登錄的用戶才能發送外部郵件,因爲從本地登錄他認爲是127.0.0.1登錄的,那麼到底哪個配置文件涉及到呢?---> /etc/mail/access
1、配置access
vim /etc/access
Connect:10.1.1 RELAY 《---允許這個網段的客戶發送外部郵件
Connect:10.1.1.20 REJECT 《---拒絕10.1.1.20
Connect:10.1.2 REJECT
Connect:10.1.2.20 OK
TO:126.com REJECT 《--不允許發郵件到126.com
FROM:qq.com REJECT <--發信人郵件地址不能是qq.com
10.1.1.99 REJECT
2、生成數據文件:
makemap hash /etc/mail/access.db < /etc/mail/access
service sendmail restart
3、測試:
使用10.1.1.67 再次測試
telnet 10.1.1.92 25
.....
mail from:[email protected]
250 2.1.0 [email protected]... Sender ok
rcpt to:[email protected]
250 2.1.5 [email protected]... Recipient ok <---可以了,原來是拒絕的
.....
例子6:實現SMTP驗證
只要提供的正確的帳號和密碼,就不再受到 /etc/mail/access.db規則影響
啓動pop服務器:
service dovecot restart
chkconfig --level 35 dovecot on
1、修改配置文件
搜索MD5關鍵字,把下面兩行註釋去掉:
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
搜索submission,把註釋去掉:
DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
2、安裝驗證支持軟件包
yum install cyrus-sasl* -y
3、重啓涉及的服務
service sendmail restart
service dovecot restart
service saslauthd restart
chkconfig --level 35 sendmail on
chkconfig --level 35 saslauthd on
chkconfig --level 35 dovecot on
4、驗證是否支持SMTP用戶驗證功能
a、方式一:
telnet 10.1.1.92 25
ehlo slave.upl.com
250-slave.upl.com Hello slave.upl.com [10.1.1.92], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN 《---出現這行關鍵字就說明支持SMTP驗證
250-DELIVERBY
250 HELP
b、方式二:使用foxmail等客戶端工具測試
@@@@@@測試發現,依舊不需要使用SMTP驗證都可以成功發送郵件
但也可以使用SMTP密碼驗證的形式發送郵件
問題出現在哪?
原因:由於stmp驗證默認只是在587端口監聽,而默認的25端口是不需要驗證的,而我們使用的foxmail等MUA客戶端工具發送郵件的時候都是使用25端口的,所以就避開了密碼驗證,爲了解決這個問題,應該這樣作:
1、修改配置文件:
把下面這行註釋掉:
dnl # DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
把下面這行打開,並且把submission修改成25或者smtp
DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl
修改爲:
DAEMON_OPTIONS(`Port=25, Name=MSA, M=Ea')dnl
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
service sendmail restart
2、驗證:
使用 telnet測試驗證功能:
[root@dns mail_client]# telnet 10.1.1.92 25
Trying 10.1.1.92...
Connected to station92.cluster.com (10.1.1.92).
Escape character is '^]'.
220 slave.upl.com ESMTP Sendmail 8.13.8/8.13.8; Fri, 6 Nov 2009 14:38:12 +0800
helo sss
250 slave.upl.com Hello station20.cluster.com [10.1.1.20], pleased to meet you
mail from:[email protected]
530 5.7.0 Authentication required
auth login
334 VXNlcm5hbWU6
dG9t
334 UGFzc3dvcmQ6
MTIz
235 2.0.0 OK Authenticated
mail from:[email protected]
250 2.1.0 [email protected]... Sender ok
rcpt to:[email protected]
250 2.1.5 [email protected]... Recipient ok
data
354 Enter mail, end with "." on a line by itself
sdfffffffffffffffffffffff
.
250 2.0.0 nA66cCGx006337 Message accepted for delivery
quit
另一種就是使用foxmail驗證
@@@@@@@@現在又有一個問題,就是telnet 127.0.0.1 25 進行發送郵件的時候也需要驗證了,這樣在寫監控腳本的時候需要發本地郵件到管理員的時候就會失敗,怎麼解決?
解決方法:
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
DAEMON_OPTIONS(`Port=25, Addr=10.1.1.92, Name=MSA, M=Ea')dnl
另外的工具查看接收的郵件:
mutt -f pop://[email protected]
例子7: 郵件的虛擬帳號
1、vim local-host-names
hot.com
upl.com
google.com
2、 vim /etc/mail/virtusertable
接收地址 轉發到
[email protected] bean
@google.com tom 《---左邊的接受地址出現的域名必須在local-host-names出現
[email protected] [email protected]
makemap hash virtusertable.db < virtusertable
3、測試
service sendmail restart
分別發送郵件到 [email protected] [email protected] [email protected] 看看郵件去哪了
別的一些用法
[email protected] error:nouser 550 No such user here
[email protected] error:5.7.0:550 Address invalid
=================================
第二、xinetd (擴展的網絡服務守護進程)
作用:增強訪問控制的功能,增強的日誌記錄功能
涉及的配置文件: /etc/xinetd.conf <---全局配置
例子1:把vsftp託管給xinetd
1、編輯配置文件
service ftp
{
socket_type = stream
protocol = tcp
wait = no <---no ,xinetd把接受到請求轉發給vsftp之後,時候還繼續監聽
user = root <---運行服務的時候,進程的身份
server = /usr/sbin/vsftpd <---服務器的進程路徑
disable = no <--- no ,啓用這個託管設定
}
2、修給vsftpd的本身的配置文件
vim /etc/vsftpd/vsftpd.conf
listen=NO
3、重啓服務並驗證
service xinetd restart
驗證
chkconfig --list
vsftp: 啓用
netstat -ntlp | grep 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 6828/xinetd
例子1:把sshd託管給xinetd
man xinetd.conf
1、
service ssh
{
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/sbin/sshd
server_args = -i
disable = no <---啓用這個託管配置
per_source = 1 <---每個IP 只能最多建立一個連接
cps = 100 2 <---每秒最多接受100請求,超過了就停止接受新請求2秒鐘
flags = IPv4 <---ipv4的標誌
only_from = 10.1.1.0/24 <---只允許這個網段訪問
no_access = 10.1.1.67 <---不允他訪問
instances = 3 <---最多打開的實例數量,一個實例對一個連接
access_times = 16:00-23:20 <---“營業時間”
}
2、把原來的服務sshd停止,並重新啓動xinetd
service sshd stop
service xinetd restart
=============================================
第三、Tcpwrapper <---tcp程序的保護外殼 client <--- Tcpwrapper ---[ xinetd ] ---> server
查詢哪些服務支持tcpwrapper
配置:
例子1:
/etc/hosts.allow
vsftpd: 10.1.1.0/255.255.255.0 EXCEPT 10.1.1.67
--> (理解成 :10.1.1.1~10.1.1.66 ,10.1.1.68~10.1.1.254)
/etc/hosts.deny
vsftpd:all
Tcpwrapper 首先讀取hosts.allow文件,如果找到匹配的話就應用規則,如果找不到就繼續找,最後找hosts.deny 如果都找不到的話,就默認允許連接
例子2:只禁止10.1.1.0/24網段的主機訪問vsftpd,但10.1.1.20可以
/etc/hosts.allow
/etc/hosts.deny
vsftpd:10.1.1.0/255.255.255.0 EXCEPT 10.1.1.20
例子3:允許所有人訪問,但不允許10.1.1.0/24訪問,但又允許10.1.1.20
/etc/hosts.allow
vsftpd:ALL EXCEPT 10.1.1.0/255.255.255.0 EXCEPT 10.1.1.20
etc/hosts.deny
vsftpd:ALL
思考: 到底哪些程序支持Tcpwrapper保護呢?
[root@slave ~]# which vsftpd
/usr/sbin/vsftpd
[root@slave ~]# ldd /usr/sbin/vsftpd | grep wrap
libwrap.so.0 => /lib/libwrap.so.0 (0x00cc9000) 《--找到才說明它能受到tcpwraper保護
[root@slave ~]# which sshd
/usr/sbin/sshd
[root@slave ~]# ldd /usr/sbin/sshd | grep wrap
libwrap.so.0 => /lib/libwrap.so.0 (0x007ff000)
例子4:
vim /etc/hosts.deny
sshd:10.1.1.67:spawn echo "`date`" %c %d >> /var/log/tcpwrapper.log
《---只要是10.1.1.67 登錄就會拒絕,並且記錄日誌