UFSの備忘録 % Home / Categories

FreeBSD下配置sendmail收外部郵件

Created 2018-07-27 / Updated 2022-05-17

先為你的域名添加一條A記錄,指向你的郵件服務器。然後添加一條MX記錄,指向前面的A記錄,優先度設為10。最後再添加一條TXT記錄。全部如下:

Name  Type Content          Priority
mail  A    服务器ip地址
@     MX   mail.example.com 10
@     TXT  v=spf1 -all

(TXT記錄的內容表示,該域名只用來收郵件,不發郵件)

要想讓FreeBSD的sendmail支持收取外部郵件,需要在/etc/rc.conf裏啟用sendmail的全部功能,順便把hostname設置成你的域名:

# vi /etc/rc.conf
sendmail_enable="YES"
hostname="example.com"

讓hostname即時生效:

# hostname example.com

然後開放服務器的25端口(只允許in):

# ipfw -q add 編號 allow tcp from any to me 25 in setup limit src-addr 2

重啟sendmail:

# service sendmail restart

用外部郵箱給root@example.com發一封郵件,看root能不能收到。

郵件如果能順利收到的話,可以先關閉25端口,再為sendmail做一些安全配置:

# ipfw delete 編號

啟用STARTTLS

# cd /etc/mail
# make

這時會在該目錄下生成<hostname>.mc和<hostname>.submit.mc兩個文件。這裏主要修改<hostname>.mc這個文件,該文件每經修改,都要運行一次make install-cf以覆蓋舊有的sendmail.cf。然後再運行service sendmail restart重啟sendmail。

# vi <hostname>.mc
dnl Enable STARTTLS for receiving email.
define(`CERT_DIR', `/usr/local/etc/letsencrypt/live/example.com')dnl
define(`confSERVER_CERT', `CERT_DIR/cert.pem')dnl
define(`confSERVER_KEY', `CERT_DIR/privkey.pem')dnl
define(`confCLIENT_CERT', `CERT_DIR/cert.pem')dnl
define(`confCLIENT_KEY', `CERT_DIR/privkey.pem')dnl
define(`confCACERT', `CERT_DIR/chain.pem')dnl
define(`confCACERT_PATH', `/usr/local/etc/mail/certs/ROOT')dnl
define(`confDH_PARAMETERS', `/usr/local/etc/mail/certs/dh.param')dnl

(使用服務器上的Let’s Encrypt證書,把example.com替換成你自己的)

# mkdir -p /usr/local/etc/mail/certs/ROOT
# vi ~/split.sh
### 內容開始 ###
#!/bin/sh

RCert=/usr/local/etc/ssl/cert.pem
DESTDIR=/usr/local/etc/mail/certs/ROOT

cd $DESTDIR
rm -f *

cat $RCert | sed -E '/^(Certificate:|SHA1 Fingerprint|#| |$)/d' | split -p '-----BEGIN CERTIFICATE-----'

for a in `ls $DESTDIR`
do
    mv $a `openssl x509 -hash -noout < $a`.0
done
### 內容結束 ###

執行:

# sh ~/split.sh

(上面的腳本運行後,收外部郵件時log裏就不會出現「unable to get local issuer certificate」這種情況了)

生成DH parameters:

# openssl dhparam -out /usr/local/etc/mail/certs/dh.param 2048

如果sendmail啟動時log裏提示:

file …/privkey.pem unsafe: Group readable file

在<hostname>.mc裏加上一句:

define(`confDONT_BLAME_SENDMAIL', `groupreadablekeyfile')dnl

然後:

# chmod 640 /usr/local/etc/letsencrypt/archive/example.com/privkey1.pem

即可解決。

測試STARTTLS是否生效:

# telnet localhost 25
EHLO localhost <-輸入這一行

如果能看到「STARTTLS」一行,則說明STARTTLS已經生效了。(按Ctrl+]再輸入q回車退出)

其它一些個人配置

define(`confMAX_MESSAGE_SIZE', `1024000')dnl
define(`confSMTP_LOGIN_MSG', `unknown')dnl
define(`confPRIVACY_FLAGS', `goaway')dnl
Dwlocalhost
Dmmy.domain
define(`confDOMAIN_NAME', `$w.$m')dnl

參考:

Categories: [FreeBSD] [mail]