Linux中國

權威指南:構建個人私有雲,拿回你的數據隱私的控制權!

(題圖來自 ttgtmedia.com)

但是事實並不是一定必須這樣的。你可以生活在21世紀,拿著智能手機,每天都用電子郵件和GPS,卻仍然可以保留自己的隱私。你所需要的就是拿回自己個人數據的控制權:郵件、日程、聯繫人、文件,等等。Prism-Break.org網站上列出了一些能幫你掌握個人數據命運的軟體。除此以外,控制自己個人數據的最安全和最有效的方式是架設自己的伺服器並搭建自己的雲。不過你也許只是沒有時間或精力去研究具體該怎麼做以及如何讓它能流暢工作。

這也是這篇文章的意義所在。僅僅5個小時內,我們將配置出一台伺服器來支撐你的郵件、聯繫人、日程表和各種文件,為你、你的朋友和你的家人。這個伺服器將設計成一個個人數據中心或雲,所以你能時刻保留它的完整控制。數據將自動在你的台式機/筆記本、手機和平板之間同步。從根本上來說,我們將建立一個系統來代替Gmail、Google文件/Dropbox、Google聯繫人、Google日曆和Picasa

為自己做這件事情已經是邁出很大一步了。但是,你個人信息的很大一部分將仍然泄漏出去並保存到矽谷的一些主機上,只是因為和你日常來往的太多人在用Gmail和使用智能手機,所以最好是帶上你一些比較親近的人加入這次探險。

我們將構建的系統能夠:

  • 支持任意數目的域名和用戶。這樣就能輕易地和你的家人朋友共享這台伺服器,所以他們也能掌控自己的個人數據,並且還能和你一起分攤服務費用。和你一起共享伺服器的人可以使用他們自己的域名或者共享你的。
  • 允許你從任意網路發送和接收電子郵件,需要成功登錄伺服器之後。這樣,你可以通過任意的郵件地址、任意設備(台式機、手機、平板)、任意網路(家裡、公司、公共網路、...)來發送電子郵件。
  • 在發送和接收郵件的時候加密網路數據,這樣,你不信任的人不能釣出你的密碼,也不能看到你的私人郵件。
  • 提供最先進的反垃圾郵件技術,結合了已知垃圾郵件黑名單、自動灰名單、和自適應垃圾郵件過濾。如果郵件被誤判了只需要簡單地把它拖入或拖出垃圾目錄就可以重新調校垃圾郵件過濾器。而且,伺服器還會為基於社區的反垃圾郵件努力做出貢獻。
  • 一段時間裡只需要幾分鐘的維護,基本上只是安裝安全更新和簡單地檢查一下伺服器日誌。添加一個新的郵件地址只需要在資料庫中插入一條記錄。除此之外,你可以忘記它的存在過自己的生活。我在14個月之前搭建了本文描述的這個系統,從那以後就一直順利運行。所以我完全把它給忘了,直到我最近覺得隨便按下手機上的『檢查郵件』會導致電子信號一路跑到冰島(我放置伺服器的地方)再回來的想法有點好笑才想起來。

要完成這篇文章里的工作,你需要一點基本的技術能力。如果你知道SMTP和IMAP的區別,什麼是DNS,以及對TCP/IP有基本了解的話,就夠了。你還將需要一點基本的Unix知識(在命令行下和文件一起工作,基本的系統管理)。然後你需要花總共5小時時間來搭建。

下面是我們將要做的事情的概述。

  • 申請一個虛擬私人伺服器,一個域名,並把它們配置好
  • 設置postfix和dovecot來收發電子郵件
  • 阻止垃圾郵件進入你的收件箱
  • 確保你發出的郵件能通過垃圾郵件過濾器
  • 使用Owncloud提供日曆,聯繫人,文件服務並配置webmail
  • 在雲上同步你的設備

這篇文章是受之前工作的啟發並以之為基礎

本文很大程度參考了兩篇文章,由Xavier ClaudeDrew Crawford寫的關於架設私有郵件服務器的介紹。

本文覆蓋了Xavier和Drew的文章里所描述的所有功能,除了3個地方Drew有而我沒有:郵件推送支持(我喜歡由我主動檢查郵件,而其他時候都不會被打擾),郵件全文檢索(我一直都沒用過),以及使用加密方式存儲郵件(我的郵件和數據還沒那麼重要到要把它們加密後再存到本地伺服器上)。如果你需要這些功能,只需要按照Drew的文章里相應部分的說明做就好了,和本文的內容兼容。

和Xavier和Drew的成果比起來,本文有下面幾個主要改進:

  • 根據我自己按Drew文章操作的經驗以及原文的大量回復,修改了一些問題和文字錯誤。我也把本文所介紹的內容仔細檢查了幾遍,從頭開始設定了幾次伺服器做重複驗證以確保能正常工作。
  • 低維護:和Xavier的方式比起來,本文增加了在伺服器上支持多個郵件域名。這樣做是為了儘可能地減少伺服器維護工作:基本上,要添加一個域名或用戶,只需要往mysql資料庫表裡增加一行就好了(不需要增加過濾腳本,等等)。
  • 我增加了webmail。
  • 我增加了設定雲伺服器的部分,不僅能收發郵件還能管理文件,地址本/聯繫人(郵件地址,電話號碼,生日,等等等),日程表和圖片,供所有設備訪問使用。

申請一個虛擬私人伺服器,一個域名,並把它們配置好

讓我們從設置基礎設施開始:我們的虛擬私人主機和我們的域名。

我用過1984.isLinode提供的虛擬私人主機(VPS),體驗非常好。在本文中,我們將使用Debian Wheezy,這個在1984和Linode都提供了已經做好的映像文件可以直接布置到你的VPS上。我喜歡1984是因為它的伺服器在冰島,也是唯一使用可再生能源(地熱和水力發電)的地方,目前還沒有影響過氣候變化,不像大多數美國數據中心目前大多數依賴於燒煤的火力發電站。而且,他們注重民權,透明,自由以及免費軟體

最好是在伺服器上創建一個文件用來保存後面要用到的各種密碼(用戶賬號、郵件賬號、雲帳號、資料庫帳號)。當然最好是加密一下(可以用GnuPG),這樣就算用來設定伺服器的電腦被偷了或被入侵了,你的伺服器就不會那麼容易被攻擊。

關於註冊域名,我已經使用grandi的服務超過10年了,也很滿意。在本文中,我們將開闢一個叫jhausse.net的域名。然後在上面增加一個叫cloud.jhausse.net的二級域名,並綁定MX紀錄。在完成之後,設置比較短的紀錄生存時間(TTL)比如300秒,這樣你在設置伺服器的時候,可以修改你的域並很快測試到結果。

最後,設置PTR紀錄(反向DNS),這樣IP地址可以反向映射回它的域名。如果你不理解前面這句話,看下這篇文章來獲得相關背景知識。如果你使用Linode的服務,你可以在遠程訪問這一欄的控制面板里設置PTR紀錄。如果是1984,聯繫一下技術支持來幫你搞定。

在伺服器上,我們從添加一個普通用戶開始,這樣我們不用從頭到尾一直用root賬號。另外,用root登陸也需要額外多一層安全措施。

adduser roudy

然後,在文件/etc/ssh/sshd_config中設置:

PermitRootLogin no

然後重啟ssh服務:

service ssh reload

然後,我們要修改伺服器的主機名。編輯文件/etc/hostname,只有一行就是自己的主機名,我們這個例子中是:

cloud

然後,編輯ssh服務的公鑰文件/etc/ssh/ssh_host_rsa_key.pub, /etc/ssh/ssh_host_dsa_key.pub, /etc/ssh/ssh_host_ecdsa_key.pub,這樣文件末尾可以反映你的主機名,比如root@cloud。然後重啟系統保證主機名在系統的每個需要它的角落都生效了。

reboot

我們將更新系統並移除不必要的服務以降低遠程攻擊的風險。

apt-get update
apt-get dist-upgrade
service exim4 stop
apt-get remove exim4 rpcbind
apt-get autoremove
apt-get install vim

我喜歡使用vim遠程編輯配置文件。打開vim 的自動語法高亮會很有幫助。添加下面這一行到~/.vimrc文件中。

syn on

設置postfix和dovecot來收發電子郵件

postfix

apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-mysql mysql-server dovecot-lmtpd postgrey

Postfix的配置菜單里,選擇Internet Site,設置這個系統的郵件名稱為jhausse.net

現在開始添加一個資料庫用於保存主機上管理的域名列表,和每個域名下的用戶列表(同時也包括他們各自的密碼),以及郵件別名列表(用於從一個地址往另一個地址轉發郵件)。

mysqladmin -p create mailserver
mysql -p mailserver
mysql> GRANT SELECT ON mailserver.* TO 'mailuser'@'localhost' IDENTIFIED BY 'mailuserpass';
mysql> FLUSH PRIVILEGES;
mysql> CREATE TABLE `virtual_domains` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> CREATE TABLE `virtual_users` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `password` varchar(106) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> CREATE TABLE `virtual_aliases` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `source` varchar(100) NOT NULL,
  `destination` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

這裡我們為jhausse.net域名提供郵件服務。如果還需要加入其他域名,也沒問題。我們也會為每個域名設置一個郵件管理地址(postmaster),轉寄給roudy@jhausse.net

mysql> INSERT INTO virtual_domains (`name`) VALUES ('jhausse.net');
mysql> INSERT INTO virtual_domains (`name`) VALUES ('otherdomain.net');
mysql> INSERT INTO virtual_aliases (`domain_id`, `source`, `destination`) VALUES ('1', 'postmaster', 'roudy@jhausse.net');
mysql> INSERT INTO virtual_aliases (`domain_id`, `source`, `destination`) VALUES ('2', 'postmaster', 'roudy@jhausse.net');

現在已經添加了一個本地郵件賬號roudy@jhausse.net。首先,為它生成一個密碼的哈希串:

doveadm pw -s SHA512-CRYPT

然後把哈希值加入到資料庫中:

mysql> INSERT INTO `mailserver`.`virtual_users` (`domain_id`, `password`, `email`) VALUES ('1', '$6$YOURPASSWORDHASH', 'roudy@jhausse.net');

現在我們的域名、別名和用戶列表都設置好了,然後開始設置postfix(這是一個SMTP伺服器,用來發送郵件)。把文件/etc/postfix/main.cf替換為下面的內容:

myhostname = cloud.jhausse.net
myorigin = /etc/mailname
mydestination = localhost.localdomain, localhost
mynetworks_style = host

# We disable relaying in the general case
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
# Requirements on servers that contact us: we verify the client is not a
# known spammer (reject_rbl_client) and use a graylist mechanism
# (postgrey) to help reducing spam (check_policy_service)
smtpd_client_restrictions = permit_mynetworks, reject_rbl_client zen.spamhaus.org, check_policy_service inet:127.0.0.1:10023
disable_vrfy_command = yes
inet_interfaces = all
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/cloud.crt
smtpd_tls_key_file=/etc/ssl/private/cloud.key
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtp_tls_security_level=may
smtp_tls_loglevel = 1
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# Delivery
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
message_size_limit = 50000000
recipient_delimiter = +

# The next lines are useful to set up a backup MX for myfriendsdomain.org
# relay_domains = myfriendsdomain.org
# relay_recipient_maps =

# Virtual domains
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
local_recipient_maps = $virtual_mailbox_maps

現在我們要讓postfix知道如何從我們設定的資料庫里找出需要接收郵件的域名。建立一個新文件/etc/postfix/mysql-virtual-mailbox-domains.cf並添加以下內容:

user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'

我們可以讓postfix判斷給定的電子郵件賬號是否存在,創建文件/etc/postfix/mysql-virtual-mailbox-maps.cf並寫入以下內容:

user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'

最後,postfix會根據文件/etc/postfix/mysql-virtual-alias-maps.cf的內容來查找郵件別名

user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT virtual_aliases.destination as destination FROM virtual_aliases, virtual_domains WHERE virtual_aliases.source='%u' AND virtual_aliases.domain_id = virtual_domains.id AND virtual_domains.name='%d'

在配置好這些後,現在要測試一下postfix是否能正常查詢資料庫。我們可以用postmap命令測試:

postmap -q jhausse.net mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
postmap -q roudy@jhausse.net mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
postmap -q postmaster@jhausse.net mysql:/etc/postfix/mysql-virtual-alias-maps.cf
postmap -q bob@jhausse.net mysql:/etc/postfix/mysql-virtual-alias-maps.cf

如果一切都正常配置了的話,頭兩個查詢應該輸出1,第3個查詢應該輸出roudy@jhausse.net,而最後一個應該什麼都不輸出。

dovecot

現在,讓我們設置一下dovecot(一個IMAP服務程序,用來在我們的設備上從伺服器獲取收到的郵件)。編輯文件/etc/dovecot/dovecot.conf設置以下參數:

# Enable installed protocol
# !include_try /usr/share/dovecot/protocols.d/*.protocol 
protocols = imap lmtp

這樣將只打開imap(讓我們可以獲取郵件)和lmtp(postfix用來將收件箱里的郵件轉給dovecot)。編輯/etc/dovecot/conf.d/10-mail.conf並設置以下參數:

mail_location = maildir:/var/mail/%d/%n
[...]
mail_privileged_group = mail
[...]
first_valid_uid = 0

這樣郵件將被保存到目錄 /var/mail/domainname/username 下。注意下這幾個選項散布在配置文件的不同位置,有時已經在那裡寫好了:我們只需要取消注釋即可。文件里的其他設定選項,可以維持原樣。在本文後面還有很多文件需要用同樣的方式更新設置。在文件/etc/dovecot/conf.d/10-auth.conf里,設置以下參數:

disable_plaintext_auth = yes
auth_mechanisms = plain
#!include auth-system.conf.ext
!include auth-sql.conf.ext

在文件/etc/dovecot/conf.d/auth-sql.conf.ext里,設置以下參數:

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static
  args = uid=mail gid=mail home=/var/mail/%d/%n
}

這是告訴dovecot用戶的郵件保存在目錄/var/mail/domainname/username下,以及如何從我們剛建立的資料庫里查找密碼。現在我們還需要告訴dovecot具體如何使用資料庫。這樣需要把下面的內容加入/etc/dovecot/dovecot-sql.conf.ext文件:

driver = mysql
connect = host=localhost dbname=mailserver user=mailuser password=mailuserpass
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

我們現在修改一下配置文件的許可權

chown -R mail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot

基本差不多了!只是還需要再多編輯幾個文件。在文件/etc/dovecot/conf.d/10-master.conf里,設置以下參數:

service imap-login {
  inet_listener imap {
    #port = 143
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

service pop3-login {
 inet_listener pop3 {
    #port = 110
    port = 0
  }
  inet_listener pop3s {
    #port = 995
    #ssl = yes
    port = 0
  }
}

service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0666
    group = postfix
    user = postfix
  }
  user = mail
}

service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = mail
    #group = 
  }

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }

  # Auth process is run as this user.
  #user = $default_internal_user
  user = dovecot
}

service auth-worker {
  user = mail
}

注意下我們把除了imaps之外所有服務的埠都設置成了0,這樣可以有效地禁止這些服務。然後,在文件/etc/dovecot/conf.d/15-lda.conf里,指定一個郵箱管理地址:

postmaster_address = postmaster@jhausse.net

最後但很重要的一點,我們為伺服器需要生成一對公鑰和私鑰,可以同時用於dovecot和postfix:

openssl req -new -newkey rsa:4096 -x509 -days 365 -nodes -out "/etc/ssl/certs/cloud.crt" -keyout "/etc/ssl/private/cloud.key"

請確保你指定了伺服器的完全限定域名(FQDN),在本文的例子里:

Common Name (e.g. server FQDN or YOUR name) []:cloud.jhausse.net

如果沒有的話,我們的客戶端會抱怨在SSL證書里的伺服器名字和所連接的伺服器名字不一致。我們將通過修改配置文件/etc/dovecot/conf.d/10-ssl.conf里的如下選項來告訴dovecot使用剛生成的密鑰:

ssl = required
ssl_cert = </etc/ssl/certs/cloud.crt
ssl_key = </etc/ssl/private/cloud.key

測試

就這些了!現在開始測試postfix和dovecot服務!

service dovecot restart
service postfix restart

在伺服器上,嘗試發送郵件給本地用戶:

telnet localhost 25

EHLO cloud.jhausse.net
MAIL FROM:youremail@domain.com
RCPT TO:roudy@jhausse.net
data
Subject: Hallo!

This is a test, to check if cloud.jhausse.net is ready to be an MX!

Cheers, Roudy
.
QUIT

伺服器應該接受我們的郵件並返回類似消息:

250 2.0.0 Ok: queued as 58D54101DB

如果一切正常的話,檢查一下/var/log/mail.log里的日誌。應該有類似下面的一行:

Nov 14 07:57:06 cloud dovecot: lmtp(4375, roudy@jhausse.net): ... saved mail to INBOX

到這裡一切都正常嗎?不錯。現在,讓我嘗試從不同的機器發郵件,比如說我們用來設定伺服器的電腦。這次我們使用加密方式(TLS)和伺服器對話:

openssl s_client -connect cloud.jhausse.net:25 -starttls smtp
EHLO cloud.jhausse.net
MAIL FROM:roudy@jhausse.net
rcpt to:bob@gmail.com

伺服器應該有這樣的響應:

554 5.7.1 <bob@gmail.com>: Relay access denied

這個沒問題:如果伺服器能接受這封郵件而不是返回如上的拒絕消息,那意味著我們架設的postfix是一個對全世界所有垃圾郵件都開放的中繼,這將完全沒法使用。除了'Relay access denied'消息,你也可能會收到這樣的響應:

554 5.7.1 Service unavailable; Client host [87.68.61.119] blocked using zen.spamhaus.org; http://www.spamhaus.org/query/bl?ip=87.68.61.119

意思是你正嘗試從一個被標記成垃圾郵件發送者的IP地址連接伺服器。我在通過普通的網際網路服務提供商(ISP)連接伺服器時曾收到過這樣的消息。要解決這個問題,可以試著從另一個主機發起連接,比如另外一個你可以SSH登錄的主機。另外一種方式是,你可以修改postfix的main.cf配置文件,不要使用Spamhous的RBL,重啟postfix服務,然後再檢查上面的測試是否正常。不管用哪種方式,最重要的是你要確定一個能工作的,因為我們後面馬上要測試其他功能。如果你選擇了重新配置postfix不使用RBL,別忘了在完成本文後重新開啟RBL並重啟postfix,以避免收到一些不必要的垃圾郵件。(LCTT 譯者註:在國內可以使用 CASA 的 RBL:cblplus.anti-spam.org.cn,參見:http://www.anti-spam.org.cn/ 。)

現在,我們試一下往SMTP埠25發送一封有效的郵件,這是一般正常的郵件服務器用來彼此對話的方式:

openssl s_client -connect cloud.jhausse.net:25 -starttls smtp
EHLO cloud.jhausse.net
MAIL FROM:youremail@domain.com
RCPT TO:roudy@jhausse.net

伺服器應該有這樣的響應:

Client host rejected: Greylisted, see http://postgrey.schweikert.ch/help/jhausse.net.html

這意味著postgrey工作正常。postgrey做的是用臨時錯誤拒絕未知發送者的郵件。郵件的技術規則是要求郵件伺服器嘗試重新發送郵件。在5分鐘後,postgrey就會接收這封郵件。一般世界範圍內遵守規則的郵件伺服器都會嘗試為我們重複投遞郵件,但大多數垃圾郵件發送者不會這樣做。所以,等上5分鐘,再次通過上面的命令發送一次,然後檢查postfix應該正常接收了郵件。

之後,我們檢查一下我們可以通過IMAP和dovecot對話獲取剛才發送的兩封郵件。

openssl s_client -crlf -connect cloud.jhausse.net:993
1 login roudy@jhausse.net "mypassword"
2 LIST "" "*"
3 SELECT INBOX
4 UID fetch 1:1 (UID RFC822.SIZE FLAGS BODY.PEEK[])
5 LOGOUT

這裡,你應該把mypassword替換為你自己為這個郵件賬號設定的密碼。如果能正常工作,基本上我們已經擁有一個能接收郵件的郵件伺服器了,通過它我們可以在各種設備(PC/筆記本、平板、手機...)上收取郵件了。

外發(中繼)郵件

但是我們不能把郵件給它發送出去,除非我們自己從伺服器發送。現在我們將讓postfix為我們轉發郵件,但是這個只有成功登錄才可以,這是為了保證郵件是由伺服器上的某個有效帳號發出來的。要做到這個,我們要打開一個特殊的,全程SSL連接的,SASL鑒權的郵件提交服務。在文件/etc/postfix/master.cf里設置下面的參數:

submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject_non_fqdn_recipient,reject_unauth_destination

然後重啟postfix服務:

service postfix reload

現在,讓我們試試從一台不同的機器連接這個服務,確定一下postfix現在能夠正常中繼我們自己的而不是其他任何人的郵件:

openssl s_client -connect cloud.jhausse.net:587 -starttls smtp
EHLO cloud.jhausse.net

注意一下伺服器建議的'250-AUTH PLAIN'功能,在從埠25連接的時候不會出現。

MAIL FROM:asdf@jkl.net
rcpt to:bob@gmail.com
554 5.7.1 <bob@gmail.com>: Relay access denied
QUIT

這個沒問題,postfix在不認識我們的時候是不會中繼郵件的。所以,首先讓我們先鑒定一下自己的身份。要這樣做,我們首先需要生成一個鑒權字元串:

echo -ne &apos;00roudy@jhausse.net00mypassword&apos;|base64

然後讓我們嘗試再次通過伺服器發送郵件:

openssl s_client -connect cloud.jhausse.net:587 -starttls smtp
EHLO cloud.jhausse.net
AUTH PLAIN DGplYW5AMTk4NGNsb3VQLm5ldAA4bmFmNGNvNG5jOA==
MAIL FROM:asdf@jkl.net
rcpt to:bob@gmail.com

現在postfix應該能正常接收。最後完成這個測試,來檢查一下我們的虛擬別名能正常工作,給postmaster@jhausse.net發送一封郵件然後確認一下它會被送到roudy@jhausse.net

telnet cloud.jhausse.net 25
EHLO cloud.jhausse.net
MAIL FROM:youremail@domain.com
rcpt to:postmaster@jhausse.net
data
Subject: Virtual alias test

Dear postmaster,
Long time no hear! I hope your MX is working smoothly and securely.
Yours sincerely, Roudy
.
QUIT

讓我們檢查一下郵件是否被正常送到正確的收件箱了:

openssl s_client -crlf -connect cloud.jhausse.net:993
1 login roudy@jhausse.net "mypassword"
2 LIST "" "*"
3 SELECT INBOX
* 2 EXISTS
* 2 RECENT
4 LOGOUT

到這裡,我們已經擁有一個能正常工作的郵箱伺服器了,能收發郵件。我們可以配置自己的設備來使用它。

PS:不要忘記再次試試通過埠25往自己架設的伺服器上的帳號發送郵件,來驗證你已經沒有被postgrey阻擋了。

阻止垃圾郵件進入你的收件箱

為了過濾垃圾郵件,我們已經使用了實時黑名單(RBL)和灰名單(postgrey)。現在我們將增加自適應垃圾郵件過濾來讓我們的垃圾郵件過濾能力提高一個等級。這意味著我們將為我們的郵件伺服器增加人工智慧,這樣它就能從經驗中學習哪些郵件是垃圾哪些不是。我們將使用來實現這個功能。

apt-get install dspam dovecot-antispam postfix-pcre dovecot-sieve

dovecot-antispam是一個安裝包,可以在我們發現有郵件被dspam誤分類了之後讓dovecot重新更新垃圾郵件過濾器。基本上,我們所需要做的就只是把郵件放進或拿出垃圾箱。dovecot-antispam將負責調用dspam來更新過濾器。至於postfix-pcre和dovecot-sieve,我們將分別用它們來把接收的郵件傳遞給垃圾郵件過濾器以及自動把垃圾郵件放入用戶的垃圾箱。

在配置文件/etc/dspam/dspam.conf里,為以下參數設置相應的值:

TrustedDeliveryAgent "/usr/sbin/sendmail"
UntrustedDeliveryAgent "/usr/lib/dovecot/deliver -d %u"
Tokenizer osb
IgnoreHeader X-Spam-Status
IgnoreHeader X-Spam-Scanned
IgnoreHeader X-Virus-Scanner-Result
IgnoreHeader X-Virus-Scanned
IgnoreHeader X-DKIM
IgnoreHeader DKIM-Signature
IgnoreHeader DomainKey-Signature
IgnoreHeader X-Google-Dkim-Signature
ParseToHeaders on
ChangeModeOnParse off
ChangeUserOnParse full
ServerPID               /var/run/dspam/dspam.pid
ServerDomainSocketPath  "/var/run/dspam/dspam.sock"
ClientHost      /var/run/dspam/dspam.sock

然後,在配置文件/etc/dspam/default.prefs里,把以下參數改為:

spamAction=deliver         # { quarantine | tag | deliver } -> default:quarantine
signatureLocation=headers  # { message | headers } -> default:message
showFactors=on

現在我們需要把dspam連接到postfix和dovecot上,在配置文件/etc/postfix/master.cf最後添加這樣兩行:

dspam     unix  -       n       n       -       10      pipe
  flags=Ru user=dspam argv=/usr/bin/dspam --deliver=innocent,spam --user $recipient -i -f $sender -- $recipient
dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=mail:mail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}

現在我們將告訴postfix通過dspam來過濾所有提交給伺服器埠25(一般的SMTP通信)的新郵件,除非該郵件是從伺服器本身發出(permitmynetworks)。注意下我們通過SASL鑒權提交給postfix的郵件不會通過dspam過濾,因為我們在前面部分里為這種方式設定了獨立的提交服務。編輯文件/etc/postfix/main.cf將選項***smtpd*client_restrictions**改為如下內容:

smtpd_client_restrictions = permit_mynetworks, reject_rbl_client zen.spamhaus.org, check_policy_service inet:127.0.0.1:10023, check_client_access pcre:/etc/postfix/dspam_filter_access

在文件末尾,還需要增加:

# For DSPAM, only scan one mail at a time
dspam_destination_recipient_limit = 1

現在我們需要指定我們定義的過濾器。基本上,我們將告訴postfix把所有郵件(如下用 /./ 代表)通過unix套接字發給dspam。創建一個新文件/etc/postfix/dspam_filter_access並把下面一行寫進去:

/./   FILTER dspam:unix:/run/dspam/dspam.sock

這是postfix部分的配置。現在讓我們為dovecot設置垃圾過濾。在文件/etc/dovecot/conf.d/20-imap.conf里,修改imap mail_plugin插件參數為下面的方式:

mail_plugins = $mail_plugins antispam

並為lmtp增加一個部分:

protocol lmtp {
# Space separated list of plugins to load (default is global mail_plugins).
  mail_plugins = $mail_plugins sieve
}

我們現在設置dovecot-antispam插件。編輯文件/etc/dovecot/conf.d/90-plugin.conf並把以下內容添加到插件部分:

plugin {
  ...
  # Antispam (DSPAM)
  antispam_backend = dspam
  antispam_allow_append_to_spam = YES
  antispam_spam = Junk;Spam
  antispam_trash = Trash;trash
  antispam_signature = X-DSPAM-Signature
  antispam_signature_missing = error
  antispam_dspam_binary = /usr/bin/dspam
  antispam_dspam_args = --user;%u;--deliver=;--source=error
  antispam_dspam_spam = --class=spam
  antispam_dspam_notspam = --class=innocent
  antispam_dspam_result_header = X-DSPAM-Result
}

然後在文件/etc/dovecot/conf.d/90-sieve.conf里指定默認的sieve腳本,這個將對伺服器上所有用戶有效:

sieve_default = /etc/dovecot/default.sieve

什麼是sieve以及為什麼我們需要為所有用戶設置一個默認腳本?sieve可以在IMAP伺服器上為我們自動處理任務。在我們的例子里,我們想讓所有被確定為垃圾的郵件移到垃圾箱而不是收件箱里。我們希望這是伺服器上所有用戶的默認行為;這是為什麼我們把這個腳本設為默認腳本。現在讓我們來創建這個腳本,建立一個新文件/etc/dovecot/default.sieve並寫入以下內容:

require ["regex", "fileinto", "imap4flags"];
# Catch mail tagged as Spam, except Spam retrained and delivered to the mailbox
if allof (header :regex "X-DSPAM-Result" "^(Spam|Virus|Bl[ao]cklisted)$",
          not header :contains "X-DSPAM-Reclassified" "Innocent") {
  # Mark as read
  # setflag "\Seen";
  # Move into the Junk folder
  fileinto "Junk";
  # Stop processing here
  stop;
}

現在我們需要編譯這個腳本好讓dovecot能運行它。我們也需要給它合適的許可權。

cd /etc/dovecot
sievec .
chown mail.dovecot default.siev*
chmod 0640 default.sieve
chmod 0750 default.svbin

最後,我們需要修改dspam需要讀取的兩個postfix配置文件的許可權:

chmod 0644 /etc/postfix/dynamicmaps.cf /etc/postfix/main.cf

就這些!讓我們重啟dovecot和postfix服務:

service dovecot restart
service postfix restart

測試

然後通過從遠程主機(比如我們用來設定伺服器的電腦)連接伺服器來測試一下反垃圾郵件:

openssl s_client -connect cloud.jhausse.net:25 -starttls smtp
EHLO cloud.jhausse.net
MAIL FROM:youremail@domain.com
rcpt to:roudy@jhausse.net
DATA
Subject: DSPAM test

Hi Roudy, how&apos;d you like to eat some ham tonight? Yours, J
.
QUIT

讓我們檢查一下郵件是否已經送到:

openssl s_client -crlf -connect cloud.jhausse.net:993
1 login roudy@jhausse.net "mypassword"
2 LIST "" "*"
3 SELECT INBOX
4 UID fetch 3:3 (UID RFC822.SIZE FLAGS BODY.PEEK[])

這個應該返回SPAM為郵件增加了一組標記的數據,看上去像這樣:

X-DSPAM-Result: Innocent
X-DSPAM-Processed: Sun Oct  5 16:25:48 2014
X-DSPAM-Confidence: 1.0000
X-DSPAM-Probability: 0.0023
X-DSPAM-Signature: 5431710c178911166011737
X-DSPAM-Factors: 27,
    Received*Postfix+with, 0.40000,
    Received*with+#+id, 0.40000,
    like+#+#+#+ham, 0.40000,
    some+#+tonight, 0.40000,
    Received*certificate+requested, 0.40000,
    Received*client+certificate, 0.40000,
    Received*for+roudy, 0.40000,
    Received*Sun+#+#+#+16, 0.40000,
    Received*Sun+#+Oct, 0.40000,
    Received*roudy+#+#+#+Oct, 0.40000,
    eat+some, 0.40000,
    Received*5+#+#+16, 0.40000,
    Received*cloud.jhausse.net+#+#+#+id, 0.40000,
    Roudy+#+#+#+to, 0.40000,
    Received*Oct+#+16, 0.40000,
    to+#+#+ham, 0.40000,
    Received*No+#+#+requested, 0.40000,
    Received*jhausse.net+#+#+Oct, 0.40000,
    Received*256+256, 0.40000,
    like+#+#+some, 0.40000,
    Received*ESMTPS+id, 0.40000,
    how&apos;d+#+#+to, 0.40000,
    tonight+Yours, 0.40000,
    Received*with+cipher, 0.40000
5 LOGOUT

很好!你現在已經為你伺服器上的用戶配置好自適應垃圾郵件過濾。當然,每個用戶將需要在開始的幾周里培訓過濾器。要標記一則信息為垃圾,只需要在你的任意設備(電腦,平板,手機)上將它移動到叫「垃圾箱」或「廢紙簍」的目錄里。否則它將被標記為有用。

確保你發出的郵件能通過垃圾郵件過濾器

這個部分我們的目標是讓我們的郵件伺服器能盡量乾淨地出現在世界上,並讓垃圾郵件發送者們更難以我們的名義發郵件。作為附加效果,這也有助於讓我們的郵件能通過其他郵件伺服器的垃圾郵件過濾器。

發送者策略框架(SPF)

發送者策略框架(SPF)是你添加到自己伺服器區域里的一份記錄,聲明了整個網際網路上哪些郵件伺服器能以你的域名發郵件。設置非常簡單,使用microsoft.com上的SPF嚮導來生成你的SPF記錄,然後作為一個TXT記錄添加到自己的伺服器區域里。看上去像這樣:

jhausse.net.    300 IN  TXT v=spf1 mx mx:cloud.jhausse.net -all

反向PTR

我們之前在本文里討論過這個問題,建議你為自己的伺服器正確地設置反向DNS,這樣對伺服器IP地址的反向查詢能返回你伺服器的實際名字。

OpenDKIM

當我們激活OpenDKIM後,postfix會用密鑰為每封發出去的郵件簽名。然後我們將把這個密鑰存儲在DNS域中。這樣的話,世界上任意一個郵件伺服器都能夠檢驗郵件是否真的是我們發出的,或是由垃圾郵件發送者偽造的。讓我們先安裝opendkim:

apt-get install opendkim opendkim-tools

然後按如下方式編輯/etc/opendkim.conf文件的配置:

##
## opendkim.conf -- configuration file for OpenDKIM filter
##
Canonicalization        relaxed/relaxed
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
LogWhy                  Yes
MinimumKeyBits          1024
Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SigningTable            refile:/etc/opendkim/SigningTable
Socket                  inet:8891@localhost
Syslog                  Yes
SyslogSuccess           Yes
TemporaryDirectory      /var/tmp
UMask                   022
UserID                  opendkim:opendkim

我們還需要幾個額外的文件,需保存在目錄/etc/opendkim里:

mkdir -pv /etc/opendkim/
cd /etc/opendkim/

讓我們建立新文件/etc/opendkim/TrustedHosts並寫入以下內容:

127.0.0.1

建立新文件/etc/opendkim/KeyTable並寫入以下內容:

cloudkey jhausse.net:mail:/etc/opendkim/mail.private

這會告訴OpenDKIM我們希望使用一個名叫'cloudkey'的加密密鑰,它的內容在文件/etc/opendkim/mail.private里。我們建立另一個名叫/etc/opendkim/SigningTable的文件然後寫入下面這一行:

*@jhausse.net cloudkey

這會告訴OpenDKIM每封從jhausse.net域發出的郵件都應該用'cloudkey'密鑰簽名。如果我們還有其他域希望也能簽名,我們也可以在這裡添加。

下一步是生成密鑰並修改OpenDKIM配置文件的許可權。

opendkim-genkey -r -s mail [-t]
chown -Rv opendkim:opendkim /etc/opendkim
chmod 0600 /etc/opendkim/*
chmod 0700 /etc/opendkim

一開始,最好使用-t開關,這樣會通知其他郵件伺服器你只是在測試模式下,這樣他們就不會丟棄基於你的OpenDKIM簽名的郵件(目前來說)。你可以從mail.txt文件里看到OpenDKIM密鑰:

cat mail.txt

然後把它作為一個TXT記錄添加到區域文件里,應該是類似這樣的:

mail._domainkey.cloud1984.net.  300 IN TXT  v=DKIM1; k=rsa; p=MIGfMA0GCSqG...

最後,我們需要告訴postfix來為發出的郵件簽名。在文件/etc/postfix/main.cf末尾,添加:

# Now for OpenDKIM: we&apos;ll sign all outgoing emails
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

然後重啟相關服務:

service postfix reload
service opendkim restart

測試

現在讓我們測試一下是否能找到我們的OpenDKIM公鑰並和私鑰匹配:

opendkim-testkey -d jhausse.net -s mail -k mail.private -vvv

這個應該返回:

opendkim-testkey: key OK

這個你可能需要等一會直到域名伺服器重新載入該區域(對於Linode,每15分鐘會更新一次)。你可以用dig來檢查區域是否已經重新載入。

如果這個沒問題,讓我們測試一下其他伺服器能驗證我們的OpenDKIM簽名和SPF記錄。要做這個,我們可以用Brandon Checkett的郵件測試系統。發送一封郵件到Brandon的網頁上提供的測試地址,我們可以在伺服器上運行下面的命令

mail -s CloudCheck ihAdmTBmUH@www.brandonchecketts.com

在Brandon的網頁上,我們應該可以在'DKIM Signature'部分里看到result = pass的文字,以及在'SPF Information'部分看到Result: pass的文字。如果我們的郵件通過這個測試,只要不加-t開關重新生成OpenDKIM密鑰,上傳新的密鑰到區域文件里,然後重新測試檢查是否仍然可以通過這些測試。如果可以的話,恭喜!你已經在你的伺服器上成功配置好OpenDKIM和SPF了!

使用Owncloud提供日曆,聯繫人,文件服務並通過Roundcube配置網頁郵件

既然我們已經擁有了一流的郵件伺服器,讓我們再為它增加在雲上保存通訊錄,日程表和文件的能力。這些是Owncloud所提供的非常贊的服務。在這個弄好後,我們還會設置一個網頁郵件,這樣就算你沒帶任何電子設備出去旅行時,或者說在你的手機或筆記本沒電的情況下,也可以通過網吧來檢查郵件。

安裝Owncloud非常直觀,而且在這裡有非常好的介紹。在Debian系統里,歸根結底就是把owncloud的倉庫添加到apt源里,下載Owncloud的發行密鑰並安裝到apt鑰匙鏈中,然後通過apt-get安裝Owncloud:

echo &apos;deb http://download.opensuse.org/repositories/isv:/ownCloud:/community/Debian_7.0/ /&apos; >> /etc/apt/sources.list.d/owncloud.list
wget http://download.opensuse.org/repositories/isv:ownCloud:community/Debian_6.0/Release.key
apt-key add - < Release.key 
apt-get update
apt-get install apache2 owncloud roundcube

在有提示的時候,選擇dbconfig並設置roundcube使用mysql。然後,提供一下mysql的root密碼並為roundcube的mysql用戶設置一個漂亮的密碼。然後,按如下方式編輯roundcube的配置文件/etc/roundcube/main.inc.php,這樣登錄roundcube默認會使用你的IMAP伺服器:

$rcmail_config[&apos;default_host&apos;] = &apos;ssl://localhost&apos;;
$rcmail_config[&apos;default_port&apos;] = 993;

現在我們來配置一下apache2網頁伺服器增加SSL支持,這樣我們可以和Owncloud和Roundcube對話時使用加密的方式傳輸我們的密碼和數據。讓我們打開Apache的SSL模塊:

a2enmod ssl

然後編輯文件/etc/apache2/ports.conf並設定以下參數:

NameVirtualHost *:80   
Listen 80   
ServerName [www.jhausse.net](http://www.jhausse.net)  
<IfModule mod_ssl.c>
    # If you add NameVirtualHost *:443 here, you will also have to change
    # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
    # to <VirtualHost *:443>
    # Server Name Indication for SSL named virtual hosts is currently not
    # supported by MSIE on Windows XP.
    NameVirtualHost *:443
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

我們將在目錄/var/www下為伺服器加密連接https://www.jhausse.net設定一個默認網站。編輯文件/etc/apache2/sites-available/default-ssl

<VirtualHost _default_:443>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        ServerName www.jhausse.net
        [...]
        <Directory /var/www/owncloud>
          Deny from all
        </Directory>
        [...]
        SSLCertificateFile    /etc/ssl/certs/cloud.crt
        SSLCertificateKeyFile /etc/ssl/private/cloud.key
        [...]
</VirtualHost>

然後讓我們同時也在目錄/var/www下設定一個非加密連接http://www.jhausse.net的默認網站。編輯文件/etc/apache2/sites-available/default

<VirtualHost _default_:443>
        DocumentRoot /var/www
        ServerName www.jhausse.net
        [...]
        <Directory /var/www/owncloud>
          Deny from all
        </Directory>
</VirtualHost>

這樣的話,我們通過把文件放到/var/www目錄下讓www.jhausse.net使用它們提供網站服務。名叫'Deny from all'的指令可以阻止通過www.jhausse.net訪問Owncloud:我們將設定通過https://cloud.jhausse.net來正常訪問。

現在我們將設定網頁郵件(roundcube),讓它可以通過網址https://webmail.jhausse.net來訪問。編輯文件/etc/apache2/sites-available/roundcube並寫入以下內容:

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/lib/roundcube
    # The host name under which you&apos;d like to access the webmail
        ServerName webmail.jhausse.net
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined

        #   SSL Engine Switch:
        #   Enable/Disable SSL for this virtual host.
        SSLEngine on

        # do not allow unsecured connections
        # SSLRequireSSL
        SSLCipherSuite HIGH:MEDIUM

        #   A self-signed (snakeoil) certificate can be created by installing
        #   the ssl-cert package. See
        #   /usr/share/doc/apache2.2-common/README.Debian.gz for more info.
        #   If both key and certificate are stored in the same file, only the
        #   SSLCertificateFile directive is needed.
        SSLCertificateFile    /etc/ssl/certs/cloud.crt
        SSLCertificateKeyFile /etc/ssl/private/cloud.key

        # Those aliases do not work properly with several hosts on your apache server
        # Uncomment them to use it or adapt them to your configuration
        Alias /program/js/tiny_mce/ /usr/share/tinymce/www/

        # Access to tinymce files
        <Directory "/usr/share/tinymce/www/">
                Options Indexes MultiViews FollowSymLinks
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        <Directory /var/lib/roundcube/>
                Options +FollowSymLinks
                # This is needed to parse /var/lib/roundcube/.htaccess. See its
                # content before setting AllowOverride to None.
                AllowOverride All
                order allow,deny
                allow from all
        </Directory>

        # Protecting basic directories:
        <Directory /var/lib/roundcube/config>
                Options -FollowSymLinks
                AllowOverride None
        </Directory>

        <Directory /var/lib/roundcube/temp>
                Options -FollowSymLinks
                AllowOverride None
                Order allow,deny
                Deny from all
        </Directory>

        <Directory /var/lib/roundcube/logs>
                Options -FollowSymLinks
                AllowOverride None
                Order allow,deny
                Deny from all
        </Directory>

        <FilesMatch ".(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
        </Directory>
        #   SSL Protocol Adjustments:
        #   The safe and default but still SSL/TLS standard compliant shutdown
        #   approach is that mod_ssl sends the close notify alert but doesn&apos;t wait for
        #   the close notify alert from client. When you need a different shutdown
        #   approach you can use one of the following variables:
        #   o ssl-unclean-shutdown:
        #     This forces an unclean shutdown when the connection is closed, i.e. no
        #     SSL close notify alert is send or allowed to received.  This violates
        #     the SSL/TLS standard but is needed for some brain-dead browsers. Use
        #     this when you receive I/O errors because of the standard approach where
        #     mod_ssl sends the close notify alert.
        #   o ssl-accurate-shutdown:
        #     This forces an accurate shutdown when the connection is closed, i.e. a
        #     SSL close notify alert is send and mod_ssl waits for the close notify
        #     alert of the client. This is 100% SSL/TLS standard compliant, but in
        #     practice often causes hanging connections with brain-dead browsers. Use
        #     this only for browsers where you know that their SSL implementation
        #     works correctly.
        #   Notice: Most problems of broken clients are also related to the HTTP
        #   keep-alive facility, so you usually additionally want to disable
        #   keep-alive for those clients, too. Use variable "nokeepalive" for this.
        #   Similarly, one has to force some clients to use HTTP/1.0 to workaround
        #   their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
        #   "force-response-1.0" for this.
        BrowserMatch "MSIE [2-6]" 
                nokeepalive ssl-unclean-shutdown 
                downgrade-1.0 force-response-1.0
        # MSIE 7 and newer should be able to use keepalive
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>

然後在你的DNS服務商那裡聲明一下伺服器,例如:

webmail.jhausse.net.    300 IN  CNAME   cloud.jhausse.net.

現在讓我激活這三個網站:

a2ensite default default-ssl roundcube
service apache2 restart

關於網頁郵件,可以通過網址https://webmail.jhausse.net來訪問,基本上能工作。之後使用郵箱全名(例如roudy@jhausse.net)和在本文一開始在郵件伺服器資料庫里設定的密碼登錄。第一次連接成功,瀏覽器會警告說證書沒有可靠機構的簽名。這個沒什麼關係,只要添加一個例外即可。

最後但很重要的是,我們將通過把以下內容寫入到/etc/apache2/sites-available/owncloud來為Owncloud創建一個虛擬主機。

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/owncloud
        ServerName cloud.jhausse.net
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/owncloud>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined

        #   SSL Engine Switch:
        #   Enable/Disable SSL for this virtual host.
        SSLEngine on

        # do not allow unsecured connections
        # SSLRequireSSL
        SSLCipherSuite HIGH:MEDIUM
        SSLCertificateFile    /etc/ssl/certs/cloud.crt
        SSLCertificateKeyFile /etc/ssl/private/cloud.key

        <FilesMatch ".(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
        </Directory>

        BrowserMatch "MSIE [2-6]" 
                nokeepalive ssl-unclean-shutdown 
                downgrade-1.0 force-response-1.0
        # MSIE 7 and newer should be able to use keepalive
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>

然後通過執行以下命令激活Owncloud:

a2ensite owncloud
service apache2 reload

之後通過在瀏覽器里打開鏈接https://cloud.jhausse.net/配置一下Owncloud。

就這些了!現在你已經擁有自己的Google Drive,日程表,聯繫人,Dropbox,以及Gmail!好好享受下新鮮恢復保護的隱私吧!:-)

在雲上同步你的設備

要同步你的郵件,你只需用你喜歡的郵件客戶端即可:Android或iOS自帶的默認郵件應用,k9mail,或者電腦上的Thunderbird。或者你也可以使用我們設置好的網頁郵件。

在Owncloud的文檔里描述了如何與雲端同步你的日程表和聯繫人。在Android系統中,我用的是CalDAV-Sync,CardDAV-Sync應用橋接了手機上Android自帶日曆以及聯繫人應用和Owncloud伺服器。

對於文件,有一個叫Owncloud的Android應用可以訪問你手機上的文件,然後自動把你拍的圖片和視頻上傳到雲中。在你的Mac/PC上訪問雲端文件也很容易,在Owncloud文檔里有很好的描述

最後一點提示

在上線後的前幾個星期里,最好每天檢查一下日誌/var/log/syslog/var/log/mail.log以保證一切都在順利運行。在你邀請其他人(朋友,家人,等等)加入你的伺服器之前這很重要。他們信任你能很好地架設個人伺服器維護他們的數據,但是如果伺服器突然崩潰會讓他們很失望。

要添加另一個郵件用戶,只要在資料庫mailservervirtual_users表中增加一行。

要添加一個域名,只要在virtual_domains表中增加一行。然後更新/etc/opendkim/SigningTable為發出的郵件簽名,上傳OpenDKIM密鑰到伺服器區域,然後重啟OpenDKIM服務。

Owncloud有自己的用戶資料庫,在用管理員帳號登錄後可以修改。

最後,萬一在伺服器臨時崩潰的時候想辦法找解決方案很重要。比如說,在伺服器恢復之前你的郵件應該送往哪兒?一種方式是找個能幫你做備份MX的朋友,同時你也可以當他的備份MX(看下postfix的配置文件main.cfrelay_domainsrelay_recipient_maps里的設定)。與此類似,如果你的伺服器被破解然後一個壞蛋把你所有文件刪了怎麼辦?對於這個,考慮增加一個常規備份系統就很重要了。Linode提供了備份選項。在1984.is里,我用crontabs和scp做了一個基本但管用的自動備份系統。

via: https://www.howtoforge.com/tutorial/build-your-own-cloud-on-debian-wheezy/

作者:Roudy Jhausse 譯者:zpl1025 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國