hmailserver阿旭笔记

结果发现,自己做企业邮局可能性不大,因为他们所为的静态IP并不是买个服务器的哪种静态IP。这种IP一般买不到,在电信系统里面是固定的,数来数据,能用的企业邮局也就几个。自己做,只能通过国内邮箱系统接受,到国外是不接受的。。。比如gmail和hotmail。我去万网问,结果他们也弄不下来,说怕被封,看来国家在这方面监管比较严格。如果你和我一样在天真的想着做个自己的企业邮局,好好考虑下吧。如果有了这些条件,可以读下现面的文章,很有用的!

 

开源的东东,我最烦怕了,因为资料挺少的。好多还是英文。。。以后难免忘掉,还是做个笔记吧!

我选择了hmailserver,因为他足以应服自己网站的应用了。

然后安装上以后,将MX指向mail.cxt8.com,然后将mail.cxt8.com指向我的服务器IP.就做好初步的DNS配置。

然后安装hmailserver,添加域名和smtp协议,简略说过,详细可以阅读网上的文章《hmailserver的完整配置》,人肉搜索,不怕会没掉。

这时dns生效后,你的帐户就能收发邮件了。但厄运才刚刚开始。。。。

gmail、hotmail将会把你发出去的邮件为垃圾邮件,上火了吧!后面还要玩openssl和一些我没玩过的工具。。

下载安装openssl到你本地,然后安装:

 

1. 第一你的伺服器需要一組非對稱式金鑰: $ openssl genrsa -out yours.key 2048 2048 是金鑰的 bit 長度,yours.key 是金鑰檔案的名稱

2. 第二你用剛剛產生出來的金鑰,去產生一個數位憑證(certificate): $ openssl req -new -x509 -days 3650 -key yours.key -out yours.crt 3650 是此數位憑證的有效期限日數,yours.crt 是數位憑證的檔案名稱

大概會問你一些問題,如下:

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [AU]:TW

State or Province Name (full name) [Some-State]:Taiwan

Locality Name (eg, city) []:Penghu

Organization Name (eg, company) [Internet Widgits Pty Ltd]:Error

Organizational Unit Name (eg, section) []:error

Common Name (eg, YOUR name) []:error.example.org

Email Address []:[email protected]

上面斜體字的部份改成你的資料,第一個是國家code,第二個是州或者是省份,第三是地區名,第四是組織公司名,第五是組織單位名稱,第六是網域名稱,第七最後是網站管理者的Email,第六很重要,如果你是認真的產生這個憑證,第六一定要填你的網域名稱,它不是單純只是"Common Name"而已。

yours.key是你的非對稱式金鑰,公開和私密的都在裡面,yours.crt是你的數位憑證,關於非對稱式金鑰和加解密演算法,就不贅述了,如果你不清楚大概也沒關係。

如果你要將公開金鑰匯出的話,可以執行以下指令: $ openssl rsa -in yours.key -out public.key -pubout -outform PEM

public.key就是你的公開金鑰。

http://dirk.liveforchrist.tw/?p=376

 

這裡設定的目的只有一個,就是讓你寄出去的信比較不容易被當作垃圾信件,Google 有一篇官方文章主題為大量寄件者指南,當中有提到建議寄信伺服器能夠設定這些東西,Yahoo 也有相關的官方文章,因此如果你常常寄信被當作垃圾信,不妨按照這裡的建議協助你做設定。

這裡的前提是你理解並且可以控制你自己網域的 DNS,如果沒有自己的網域或者不知道怎麼設定 DNS,就不需要這些了。

首先我們來設定 SPF。SPF 可不是買防曬乳液的那個 Sun Protection Factor,這裡的 SPF 是指 Sender Policy Framework,一言以蔽之就是防止寄件者被偽造的一種開放協定,如果你認為偽造寄件者很困難的話,你可能想錯了。

OpenSPF 官方網站查詢 SPF 的語法,一個範例如下:

v=spf1 mx a:mail.example2.org mx:example3.org ~all

上面這個字串是要放在 DNS 設定裡面的。比如說,你的網域是 example.org,你就必須在 example.org 的 DNS 設定中,加上一個 TXT 紀錄,其內容等於上面那個字串,當有人收到從 example.org 寄的信的時候,例如收到寄件者為 [email protected] 的信的時候,對方就會去查尋 example.org 的 DNS 紀錄,查詢所有 TXT 紀錄中,是否有 SPF 的相關紀錄,如果有,就會被對方來使用驗證這封電子郵件的來源。

假設 example.org 有 DNS 設定如下:

TXT "v=spf1 mx a:mail.example2.org mx:example3.org ~all"

A mail.example.org 1.1.1.1

A www.example.org 1.1.1.2

A example.org 1.1.1.2

假設有一使用者 [email protected] 寄了一封信給 [email protected](舉例使用,如有雷同,純屬巧合),[email protected] 的收信主機是 Google 的主機,Google 在收到這封信之後,會去檢查對方的 DNS,也就是 example.org 的 DNS 設定,發現其中有一筆 TXT 指定了 SPF,於是乎 Google 會以這筆 SPF 紀錄來驗證這封電子郵件,驗證的邏輯就是去查 DNS 的紀錄對應 IP 位址,以上面 SPF 的語法來說明: v=spf1 代表版本。 mx 代表所有 example.org 的 DNS 的 MX 紀錄上的主機,它們的 IP 都被認定可為 example.org 寄信。 a:mail.example2.org 代表 mail.example2.org 的 A 紀錄上的 IP 被認定可為 example.org 寄信。 mx:example3.org 代表 example3.org 的 MX 紀錄上的 IP 被認定可為 example.org 寄信。 ~all 代表其他沒有被 SPF 紀錄指定的寄信 IP 都是有問題的,前方的 ~ 符號代表的意思可以這麼看:「保留一個空間讓某些機制去作確認,如果不是上方指定的寄信 IP,也許不一定是有問題的,雖然它們通常是有問題的。」

下方是我這個網域的 SPF 紀錄,給你參考:

v=spf1 mx a:mail.liveforchrist.tw mx:liveforchrist.tw ~all

至於我的其他 DNS 設定,有興趣的自己查看看吧,它們都是公開的資訊。

 

接著我們來設定 DomainKeys,DomainKeys 是 Yahoo 在使用的,因為 Yahoo 是大宗的郵件主機之一,所以設定這個對寄信給 Yahoo 的收件者有幫助。

在 Ubuntu 上安裝 DomainKeys 套件,執行指令如下: $ sudo apt-get install dk-filter

安裝完之後,我們需要預備非對稱式金鑰,如果你不知道如何產生金鑰,可以參考這篇文章,假設你已經產生出來,並且金鑰放在路徑 /etc/postfix/mail.key,公開金鑰放在 /etc/postfix/public.key。

再來作一些設定檔的更動,編輯檔案 /etc/default/dk-filter,註解所有東西,新增下面三行:

DAEMON_OPTS="-l"

DAEMON_OPTS="$DAEMON_OPTS -d example.org -s /etc/postfix/mail.key -S maildk"

SOCKET="inet:8892@localhost"

上面第二行的 example.org 換成你自己的網域名,如果你希望寄出來的信件地址是 [email protected],那網域名就是 example.org,後面 -s 後接的字串是你的金鑰位置,然後 -S 後面接的是"Selector",等會設定 DNS 會用到,可以填一個你想要的字串,不要太複雜,這裡的範例填 maildk,等一下就會以這個例子去說明 DNS 的設定。

然後我們要設定 Postfix,寄信出去的 Postfix 會使用 DomainKeys 功能將郵件加上認證資訊,這就是 DomainKeys 的功能,如果不理解的可以參考 Yahoo 的說明,編輯 /etc/postfix/main.cf,加上下面這四行:

milter_default_action = accept

milter_protocol = 2

smtpd_milters = inet:localhost:8892

non_smtpd_milters = inet:localhost:8892

設定完重新啟動 postfix 以及 dk-filter,執行命令如下: $ sudo /etc/init.d/dk-filter restart $ sudo /etc/init.d/postfix restart

接著我們要設定 DNS 了,在你的網域上加上兩筆子網域的 TXT 紀錄,一個子網域是 maildk._domainkey,其內容是你的公開金鑰的內容,假設你的公開金鑰路徑是 /etc/postfix/public.key,執行下面命令印出來看看: $ cat /etc/postfix/public.key

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD2HH7GQNz5XXcmaPDlA4iUgkx5

sPqLv7glf/468NjtvjxXkdAxHXSFetjvAFrUBue1Y8HfiGfE2R/iTmm9cYL0gidZ

VmOVHg+/7fPCbQHZPblHQ4EjdBy2IuI8bV9rQ0j7UubcrP3xcbGdpjseyebRCqZX

G5bMYsov8xuJ5zzcLwIDAQAB

-----END PUBLIC KEY-----

把中間那個亂碼字串貼成一行,所以 DNS 上的 TXT 紀錄是(記得子網域(subdomain)是 maildk._domainkey,還有公開金鑰內容要改成你自己的):

"k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD2HH7GQNz5XXcmaPDlA4iUgkx5sPqLv7glf/468NjtvjxXkdAxHXSFetjvAFrUBue1Y8HfiGfE2R/iTmm9cYL0gidZVmOVHg+/7fPCbQHZPblHQ4EjdBy2IuI8bV9rQ0j7UubcrP3xcbGdpjseyebRCqZXG5bMYsov8xuJ5zzcLwIDAQAB"

只要把 p= 後面的字串改成你自己的公開金鑰內容即可,子網域 maildk._domainkey 前面的 maildk 是剛剛說到的 Selector,所以你剛剛的 Selector 是什麼,這裡就是什麼。

另外一筆 DNS 紀錄是設定子網域 _domainkey 的 TXT 紀錄,其內容如下(記得子網域(subdomain)是 _domainkey):

"t=y; o=~"

設定完,等一段時間 DNS 生效之後,透過 Postfix 去寄信給 Yahoo 的收件者,應該就會看到 DomainKeys 認證的效果了,查看郵件的原始碼可以看到 DomainKeys 的結果是 pass,如下:

Authentication-Results: mta1023.mail.tp2.yahoo.com  from=example.org; domainkeys=pass (ok);

刪除線劃掉的是你的網域名稱。

最後,我們來設定 DKIM,設定方式和 DomainKeys 差不多,先安裝 Ubuntu 套件,執行命令如下: $ sudo apt-get install opendkim

安裝完之後,編輯檔案 /etc/opendkim.conf,找到類似下面這三行:

#Domain         example.com

#KeyFile        /etc/mail/dkim.key

#Selector       2007

把前面的註解都拿掉,Domain 那一行換成你自己的 Domain,KeyFile 那一行換成你的非對稱式金鑰路徑,例如 /etc/postfix/mail.key,後面的 Selector 類似 DomainKeys 的 Selector 的概念,設定 DNS 會用到,它其實是在 DNS 上你可以彈性設定不同的 Selector 使用不同的金鑰,對不同的子網域作認證,不過這裡如果你剛剛設定過 DomainKeys 了,因為我們的 DomainKeys 的 Selector 範例是 maildk,這裡我們要區隔開來,不可以一樣,所以我們這裡 Selector 就用 mail 這個字串,所以假設網域名是 example.org,修改那三行之後如下:

Domain         example.org

KeyFile        /etc/postfix/mail.key

Selector       mail

存檔離開。

再來編輯 Postfix 的 main.cf 檔案,讓 Postfix 寄信的時候都會使用 DKIM 將信件認證的資訊加在郵件表頭裡面,編輯 /etc/postfix/main.cf,加上四行如下:

milter_default_action = accept

milter_protocol = 2

smtpd_milters = inet:localhost:8891

non_smtpd_milters = inet:localhost:8891

如果你早先已經設定了 DomainKeys,你可以將 DomainKeys 在 Postfix 的設定和 DKIM 的設定結合,變成下面四行:

milter_default_action = accept

milter_protocol = 2

smtpd_milters = inet:localhost:8891,inet:localhost:8892

non_smtpd_milters = inet:localhost:8891,inet:localhost:8892

設定完重新啟動 Postfix,也重新啟動 opendkim,執行命令如下: $ sudo /etc/init.d/opendkim restart $ sudo /etc/init.d/postfix restart

最後我們設定 DNS 紀錄,新增一筆子網域的 TXT 紀錄,子網域是 mail._domainkey,前面的 mail 是上面 DKIM 的 Selector,因為我們這個範例用 mail 字串,所以這裡是 mail,紀錄的內容是你的公開金鑰內容,剛剛 DomainKeys 已經講過如何把公開金鑰傾印出來,所以 DNS 紀錄內容大概長得像如下:

"v=DKIM1; g=*; k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD2HH7GQNz5XXcmaPDlA4iUgkx5sPqLv7glf/468NjtvjxXkdAxHXSFetjvAFrUBue1Y8HfiGfE2R/iTmm9cYL0gidZVmOVHg+/7fPCbQHZPblHQ4EjdBy2IuI8bV9rQ0j7UubcrP3xcbGdpjseyebRCqZXG5bMYsov8xuJ5zzcLwIDAQAB"

把 p= 後面接的字串換成你自己的公開金鑰,儲存等一段時間,待 DNS 生效之後,透過 Postfix 寄信出去,就會加上 DKIM 的數位簽章了。

 

對於在 Ubuntu 上安裝 Postfix,有興趣者可以參考這篇文章

http://dirk.liveforchrist.tw/?p=423

 

 

 

 

 

你可能感兴趣的:(server)