如何在 Debian Wheezy 上为您和您的朋友构建自己的云
在此页
- 在短短几个小时内取回您的隐私并控制您的数据:为您和您的朋友构建您自己的云
- 您身份中一些最私人的部分存储在您无法控制的世界各地的服务器上
- 您每天泄露最个人信息的习惯会以一种没人能预见的方式影响您的生活
- 在短短 5 小时内收回您和您所关心的人的隐私
- 这篇文章的灵感来自于之前的工作并以此为基础
- 发件人政策框架
- 反向 PTR
- OpenDKIM
在短短几个小时内取回您的隐私并控制您的数据:为您和您的朋友构建您自己的云
作者 Roudy Jhausse <[email >
8 年超过 40000 次搜索!那是我的谷歌搜索历史。那你的怎么样? (你可以在这里自己找到)在这么长的时间里有如此多的数据点,谷歌非常准确地知道你感兴趣的是什么,你在想什么,你担心什么,以及这一切是如何改变的自您首次获得该 Google 帐户以来的这些年。
您身份中一些最私人的部分存储在您无法控制的世界各地的服务器上
假设你像我一样在 2006 年到 2013 年之间成为 Gmail 用户,这意味着你在这 7 年期间收到了 30000 多封电子邮件并写了大约 5000 封电子邮件。您发送或收到的一些电子邮件非常私人化,可能非常私人化,以至于您可能甚至不希望某些家庭成员或密友系统地查看它们。也许您还起草了一些您从未发送过的电子邮件,因为您在最后一刻改变了主意。但即使您从未发送过它们,这些电子邮件仍会存储在服务器的某个位置。因此,可以公平地说,谷歌服务器比你最亲密的朋友或家人更了解你的个人生活。
从统计数据来看,认为您拥有智能手机是一个安全的选择。如果不使用默认情况下将您的联系人存储在 Google 服务器上的 Google Contact 中的联系人应用程序,您几乎无法使用手机。因此,Google 不仅知道您的电子邮件,还知道您的线下联系人:您喜欢给谁打电话、谁给您打电话、您发短信给谁以及发短信给他们的内容。你不必相信我的话,你可以通过查看你授予应用程序的权限来自己验证,例如 Google Play 服务,以读取给你打电话的人的列表和你收到的短信。您是否也使用手机自带的日历应用程序?除非您在设置日历时明确选择退出,否则这意味着谷歌准确地知道您在一天中的每个时间、日复一日、年复一年地在做什么。如果你选择了 iPhone 而不是 Android 手机,这同样适用,除了 Apple 而不是 Google 会了解你的通信、联系方式和日程安排。
您是否也非常注意保持您目录中的联系人是最新的,在您的朋友、同事和家人换工作或更换运营商时更新他们的电子邮件地址和电话号码?这使 Google 可以非常准确地了解您的社交网络的最新情况。而且您喜欢智能手机的 GPS,您经常将其与 Google 地图一起使用。这意味着谷歌不仅知道你从你的日历上做了什么,而且知道你在哪里,你住在哪里,你在哪里工作。通过关联用户的 GPS 位置数据,Google 还可以判断您现在可能与谁进行社交。
你每天分发最私人信息的习惯会以一种没人能预见的方式影响你的生活
总而言之,如果您是一名普通互联网用户,Google 拥有近 10 年来关于您的兴趣、忧虑、热情、问题的最新、深入的信息。它收集了一些您最私人的信息(电子邮件、短信)、您日常活动和位置的每小时详细信息,以及您社交网络的高质量图片。对您如此深入的了解可能超出了您最亲密的朋友、家人或您的爱人对您的了解。
不会想到将大量个人信息提供给完全陌生的人,例如将其全部放在 USB 密钥上,然后将其放在随便一家咖啡馆的桌子上,并附上一张便条,上面写着 Olivier Martin 的个人数据,作为您使用请。谁知道谁会找到它以及他们会用它做什么?然而,我们可以毫无问题地将你身份的核心部分交给对我们的数据有浓厚兴趣的 IT 公司的陌生人(这就是他们做面包的方式)和世界级的数据分析专家,也许只是因为它默认发生在没有当我们点击那个绿色的接受按钮时,我们正在考虑它。
有了这么多高质量的信息,多年来,谷歌可能会比你希望了解自己更了解你:哎呀,现在正在浏览我的数字过去,我不记得我发送过一半的电子邮件五年前。早在 2005 年我就重新发现了我对马克思主义的兴趣,而我的加入让我感到惊讶和高兴,就像索尼最近遭到黑客攻击,你所有的个人数据最终都永远在公共领域?
我们大多数人将我们的个人数据委托给这些公司的原因之一是他们免费提供服务。但它到底有多自由? Google 帐户的平均价值因估算方法而异:500 美元/年。因此,该服务并非完全免费:您通过广告和我们的数据未来可能发现的未知用途付费。
我一直在写关于谷歌的文章,主要是因为这是我迄今为止将大部分数字身份委托给的公司,因此也是我最了解的公司。但我很可能写过 Apple 或 Facebook。这些公司每天都在我们喜爱使用的设计、工程和服务方面取得了惊人的进步,真正改变了世界。但这并不意味着我们应该将所有最私人的数据堆积在他们的服务器中,并将我们的数字生活托付给他们:危害的可能性太大了。
在短短 5 小时内收回您和您关心的人的隐私
它不必是这样的。您可以生活在 21 世纪,拥有智能手机,每天使用电子邮件和 GPS,并且仍然保留您的隐私。您需要做的就是重新控制您的个人数据:电子邮件、日历、联系人、文件等。Prism-Break.org 网站列出了有助于控制您的个人数据命运的软件。除了这些选项之外,重新控制您的个人数据的最安全、最强大的方法是通过构建您自己的服务器来自行托管您的云。但是您可能只是没有时间和精力来研究究竟如何做到这一点并使其顺利进行。
这就是本文的用武之地。在短短 5 小时内,我们将设置一个服务器来为您、您的朋友和家人托管您的电子邮件、联系人、日历和文件。该服务器旨在充当您个人数据的枢纽或云,以便您始终保持对其的完全控制。数据将在您的个人电脑/笔记本电脑、手机和平板电脑之间自动同步。本质上,我们将建立一个系统来取代 Gmail、Google Drive/Dropbox、Google Contacts、Google Calendar 和 Picasa。
仅仅为自己做这件事就已经是一大步了。但是,你的很大一部分个人信息仍然会泄露并最终存储在硅谷的某些服务器上,因为你每天与之互动的人中有很多人使用 Gmail 并拥有智能手机。所以最好让一些你最亲近的人加入冒险。
我们将建立一个系统
- 支持任意数量的域和用户。这使得与家人和朋友共享您的服务器变得容易,这样他们也可以控制他们的个人数据,并可以与您分担服务器的费用。共享您服务器的人可以使用他们自己的域名或共享您的域名。
- 允许您在成功登录服务器后从任何网络发送和接收电子邮件。这样,您可以从您的任何电子邮件地址、任何设备(PC、手机、平板电脑)和任何网络(在家里、在工作中、从公共网络……)发送电子邮件
- 在发送和接收电子邮件时加密网络流量,这样您不信任的人就不会窃取您的密码,也无法阅读您的私人电子邮件。
- 提供最先进的反垃圾邮件,结合了已知垃圾邮件发送者的黑名单、自动灰名单和自适应垃圾邮件过滤。如果电子邮件被错误分类,只需将垃圾邮件移入或移出垃圾邮件文件夹即可重新训练自适应垃圾邮件过滤器。此外,该服务器还将为基于社区的垃圾邮件打击工作做出贡献。
- 偶尔只需要几分钟的维护,主要是安装安全更新和简要检查服务器日志。添加新的电子邮件地址归结为向数据库添加一条记录。除此之外,您可以忘记它并过自己的生活。我在 14 个月前设置了这篇文章中描述的系统,从那时起它一直运行顺利。所以我完全忘记了它,直到最近我对随意按下手机的“检查电子邮件”按钮会导致电子一直传播到冰岛(我的服务器所在的地方)并返回的想法微笑。
要阅读本文,您需要具备最低限度的技术能力。如果您知道 SMTP 和 IMAP 之间的区别是什么,什么是 DNS,并且对 TCP/IP 有基本的了解,那么您就足够了解了。您还需要 Unix 的基本工作知识(从命令行处理文件、基本系统管理)。您总共需要 5 个小时的时间来设置它。
这是我们将要做什么的概述:
- 获取虚拟专用服务器、域名并进行设置
- 设置 postfix 和 dovecot 来发送和接收电子邮件
- 防止垃圾邮件到达您的收件箱
- 确保您发送的电子邮件通过垃圾邮件过滤器
- 使用 Owncloud 托管日历、联系人、文件并设置网络邮件
- 将您的设备同步到云端
这篇文章的灵感来自于之前的工作并以此为基础
本文大量借鉴了其他两篇文章,即 Drew Crawfords 对电子邮件自托管的介绍。
这篇文章包括 Xaviers 和 Draws 文章的所有功能,除了 Drew 拥有而我不需要的三个功能,即对电子邮件的推送支持(我喜欢只在我决定查看电子邮件时查看电子邮件,否则我会一直分心) ,在电子邮件中进行全文搜索(我没有用到),以及以加密形式存储电子邮件(我的电子邮件和数据并不重要,以至于我必须在服务器上本地加密它们)。如果您需要这些功能中的任何一个,请随时按照与当前文章兼容的 Drews 文章的相应部分添加它们。
与 Xaviers 和 Drews 的工作相比,本文在几个方面有所改进:
- 它根据我对 Drews 文章的经验以及对他的原始文章的众多评论修复了错误和拼写错误。我还阅读了本文,多次从头开始设置服务器以复制它并确保它开箱即用。
- 维护成本低:与 Xaviers 的工作相比,本文增加了对服务器上多个电子邮件域的支持。它通过要求尽可能少的服务器维护来实现:基本上,要添加域或用户,只需将一行添加到 mysql 表即可(无需添加筛选脚本,...)。
- 我添加了网络邮件。
- 我添加了一个关于设置云的部分,不仅可以托管您的电子邮件,还可以托管您的文件、地址簿/联系人(电子邮件、电话号码、生日……)、日历和图片,以便在您的设备上使用。
获取虚拟专用服务器、域名并进行设置
让我们从设置基本基础设施开始:我们的虚拟专用服务器和我们的域名。
我对自由软件的虚拟专用服务器 (VPS) 有极好的体验。
启动一个文件来存储我们需要在服务器上设置的各种密码(用户帐户、邮件帐户、云帐户、数据库帐户)可能是个好主意。加密此文件绝对是个好主意(也许使用 GnuPG),这样即使您用来设置服务器的计算机被盗或受到损害,也不会太容易攻击您的服务器。
对于域名注册,我已经使用gandi服务超过10年了,也很满意。对于本文,我们将设置一个名为 jhausse.net 的区域。然后我们向其添加一个名为 cloud.jhausse.net 的主机,将 MX 记录设置为该主机。当你这样做时,为你的记录设置较短的生存时间 (TTL),例如 300 秒,这样你就可以在设置服务器时对你的区域进行更改并快速测试结果。
最后,设置本文以获取背景。如果你使用Linode,你可以在控制面板的Remote Access部分设置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 以便文件末尾反映您的主机名或实例 [email受保护]。然后重新启动系统以确保主机名在任何地方都是固定的
reboot
我们将更新系统并删除我们不需要的服务,以降低远程攻击的风险。
apt-get update apt-get dist-upgrade service exim4 stop apt-get remove exim4 rpcbind apt-get autoremove apt-get install vim
我喜欢使用 vim 远程编辑配置文件。为此,它有助于自动打开语法突出显示。我们通过添加
syn on
到 ~/.vimrc。
设置 postfix 和 dovecot 来发送和接收电子邮件
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 域。如果您想托管其他域,也可以添加它们。我们还为每个域设置了一个邮局主管地址,该地址转发到 [email 。
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', ''); mysql> INSERT INTO virtual_aliases (`domain_id`, `source`, `destination`) VALUES ('2', 'postmaster', '');
我们现在添加一个本地托管的电子邮件帐户 [email 。首先,我们为它生成一个密码哈希:
doveadm pw -s SHA512-CRYPT
然后将哈希添加到数据库
mysql> INSERT INTO `mailserver`.`virtual_users` (`domain_id`, `password`, `email`) VALUES ('1', '$6$YOURPASSWORDHASH', '');
现在我们的域、别名和用户列表已经准备就绪,我们将设置 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 mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf postmap -q mysql:/etc/postfix/mysql-virtual-alias-maps.cf postmap -q mysql:/etc/postfix/mysql-virtual-alias-maps.cf
如果一切设置正确,前两个查询应该返回 1,第三个查询应该返回 [email ,最后一个应该什么都不返回。
现在,让我们设置 dovecot(IMAP 服务器,从我们的设备获取服务器上的传入邮件)。编辑 /etc/dovecot/dovecot.conf 以设置以下参数:
# Enable installed protocol # !include_try /usr/share/dovecot/protocols.d/*.protocol protocols = imap lmtp
这只会启用 imap(让我们获取电子邮件)和 lmtp(后缀将使用它来将传入的电子邮件传递给 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 指定一个电子邮件地址:
postmaster_address =
最后但同样重要的是,我们需要为服务器生成一对公钥和私钥,我们将在 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: rcpt to: 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, ): ... saved mail to INBOX
到目前为止,一切都很好?好的。现在,让我们在另一台机器上尝试相同的操作,比如我们用来设置服务器的计算机。这次使用加密 (TLS) 与服务器对话:
openssl s_client -connect cloud.jhausse.net:25 -starttls smtp EHLO cloud.jhausse.net MAIL FROM: rcpt to:
服务器应该响应的
554 5.7.1 <>: Relay access denied
这很好:如果服务器接受了邮件,就意味着我们将 postfix 设置为开放中继,供世界上所有垃圾邮件发送者使用。您可能会收到以下消息,而不是中继访问被拒绝的消息
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 地址联系服务器。我在尝试通过我的常规 Internet 服务提供商 (ISP) 连接到服务器时收到此消息。要解决此问题,您可以尝试从另一台主机连接,也许是您可以通过 SSH 访问的另一台服务器。或者,您可以重新配置 Postfixs main.cf 以不使用 Spamhauss RBL,重新加载 postfix,并验证上述测试是否有效。在这两种情况下,重要的是找到适合您的解决方案,因为我们会在一分钟内测试其他东西。如果您选择重新配置 Postfix 以不使用 RBL,请不要忘记在完成本文后将 RBL 放回原处并重新加载 postfix,以避免收到不必要的垃圾邮件。
现在让 尝试在端口 25 上通过 SMTP 发送有效电子邮件,常规邮件服务器使用该端口相互通信:
openssl s_client -connect cloud.jhausse.net:25 -starttls smtp EHLO cloud.jhausse.net MAIL FROM: rcpt to:
服务器应该响应的
Client host rejected: Greylisted, see http://postgrey.schweikert.ch/help/jhausse.net.html
这表明 postgrey 正在正常工作。如果以前从未见过发件人,postgrey 会做什么来拒绝带有临时错误的电子邮件。电子邮件的技术规则要求电子邮件服务器尝试再次发送电子邮件。五分钟后,postgrey 将接受电子邮件。世界各地的合法电子邮件服务器会反复尝试将电子邮件重新发送给我们,但大多数垃圾邮件发送者不会这样做。因此,等待 5 分钟,尝试使用上面的命令再次发送电子邮件,并验证 postfix 现在是否接受电子邮件。
之后,检查我们是否可以通过将 IMAP 与 dovecot 通信来获取我们刚刚发送的两封电子邮件:
openssl s_client -crlf -connect cloud.jhausse.net:993 1 login "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
并重新加载后缀
service postfix reload
现在,让我们尝试在与服务器不同的机器上使用此服务,以验证 postfix 现在将中继我们的电子邮件而不是其他人:
openssl s_client -connect cloud.jhausse.net:587 -starttls smtp EHLO cloud.jhausse.net
请注意服务器通告的 250-AUTH PLAIN 功能,当我们连接到端口 25 时它不会出现。
MAIL FROM: rcpt to: 554 5.7.1 <>: Relay access denied QUIT
很好,如果他不认识我们,postfix 不会转发我们的电子邮件。因此,让我们首先验证自己。为此,我们首先需要生成一个身份验证字符串:
echo -ne '\\000mypassword'|base64
让我们再次尝试通过服务器发送电子邮件:
openssl s_client -connect cloud.jhausse.net:587 -starttls smtp EHLO cloud.jhausse.net AUTH PLAIN DGplYW5AMTk4NGNsb3VQLm5ldAA4bmFmNGNvNG5jOA== MAIL FROM: rcpt to:
现在应该接受哪个后缀。要完成测试,让我们通过向 [email 发送电子邮件来验证我们的虚拟别名是否有效:
telnet cloud.jhausse.net 25 EHLO cloud.jhausse.net MAIL FROM: rcpt to: 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 "mypassword" 2 LIST "" "*" 3 SELECT INBOX * 2 EXISTS * 2 RECENT 4 LOGOUT
在这一点上,我们有一个功能性的电子邮件服务器,用于传入和传出邮件。我们可以设置我们的设备来使用它。
PS:您是否记得再次尝试通过端口 25 向服务器托管的帐户发送电子邮件,以验证您是否不再被 postgrey 阻止?
<一个名字=dspam>
防止垃圾邮件到达您的收件箱
<一个名字=dspam>
为了垃圾邮件过滤,我们已经有了实时黑名单 (RBL) 和灰名单 (postgrey)。现在,通过添加自适应垃圾邮件过滤功能,让我们的垃圾邮件打击能力更上一层楼。这意味着将人工智能添加到我们的电子邮件服务器中,以便它可以从经验中了解什么是垃圾邮件,什么不是。为此,我们将使用 dspam。
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
现在我们需要通过在 /etc/postfix/master.cf 的末尾添加这两行来将 dspam 连接到 postfix 和 dovecot:
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 流量)上提交到服务器的每一封新电子邮件,除非电子邮件是从服务器本身(permit_mynetworks)提交的。请注意,我们使用 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
这就是后缀部分。现在让我们为垃圾邮件过滤设置 dovecot。在 /etc/dovecot/conf.d/20-imap.conf 中,编辑 imap mail_plugins 插件参数,这样:
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_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 需要读取的两个后缀配置文件的权限:
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: rcpt to: DATA Subject: DSPAM test Hi Roudy, how'd you like to eat some ham tonight? Yours, J . QUIT
让我们检查邮件是否到达:
openssl s_client -crlf -connect cloud.jhausse.net:993 1 login "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'd+#+#+to, 0.40000, tonight+Yours, 0.40000, Received*with+cipher, 0.40000 5 LOGOUT
好的!您现在已经为服务器的用户设置了自适应垃圾邮件过滤。当然,每个用户都需要在前几周训练过滤器。要将邮件训练为垃圾邮件,只需使用您的任何设备(PC、平板电脑、手机)将其移动到名为“垃圾邮件”或“垃圾邮件”的文件夹中。否则它会被训练成火腿。
<名称=SPF>
确保您发送的电子邮件通过垃圾邮件过滤器
<名称=SPF>
我们在本节中的目标是让我们的邮件服务器在世界上看起来尽可能干净,并让垃圾邮件发送者更难以我们的名义发送电子邮件。作为副作用,这将帮助我们通过其他邮件服务器的垃圾邮件过滤器获取我们的电子邮件。
发件人政策框架
发件人策略框架 (SPF) 是您添加到您的区域的记录,它声明整个 Internet 上的哪些邮件服务器可以为您的域名发送电子邮件。设置非常简单,使用 microsoft.com 上的 SPF 向导生成您的 SPF 记录,然后将其作为 TXT 记录添加到您的区域。它看起来像这样:
jhausse.net. 300 IN TXT v=spf1 mx mx:cloud.jhausse.net -all
反向PTR
我们在本文前面讨论了这一点,正确设置服务器的反向 DNS 是个好主意,这样对服务器的 IP 地址进行反向查找会返回服务器的实际名称。
打开DKIM
当我们激活 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: 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 进行签名。如果我们有其他要签名的域,我们也可以在此处添加它们。
下一步是生成该密钥并修复 OpenDKIMs 配置文件的权限。
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'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 记录。为此,我们可以使用 Brandons 网页,我们可以在服务器上运行以下命令
mail -s CloudCheck www.brandonchecketts.com
在 Brandons 网页上,您应该会在 DKIM 签名部分看到结果=通过,在 SPF 信息部分看到结果:通过。如果我们的电子邮件通过了这个测试,只需重新生成一个没有 -t 开关的 OpenDKIM 密钥,将新密钥上传到区域文件,如果它仍然通过测试则重新测试。如果是这样,恭喜!您刚刚在服务器上成功设置了 OpenDKIM 和 SPF!
<一个名字=owncloud>
使用 Owncloud 托管日历、联系人、文件并使用 Roundcube 设置网络邮件
<一个名字=owncloud>
现在我们有了一流的电子邮件服务器,让我们将您的联系人、日历和文件存储在云中的可能性添加到它。这些是 Owncloud 开箱即用的服务。同时,我们还设置了一个网络邮件,这样即使您在没有电子设备的情况下旅行,或者您的手机和笔记本电脑没电了,您也可以查看电子邮件。
安装 Owncloud 非常简单,此处有详细描述。在 Debian 上,它归结为将 owncloud 存储库添加到您的 apt 源,下载 ownclouds 发布密钥并将其添加到您的 apt 密钥环,然后使用 apt-get 安装 owncloud 本身:
echo 'deb http://download.opensuse.org/repositories/isv:/ownCloud:/community/Debian_7.0/ /' >> /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['default_host'] = 'ssl://localhost'; $rcmail_config['default_port'] = 993;
现在我们将使用 SSL 设置 apache2 网络服务器,以便我们可以使用密码和数据加密与 Owncloud 和 Roundcube 通信。让我们打开 Apaches ssl 模块:
a2enmod ssl
并编辑 /etc/apache2/ports.conf 以设置以下参数:
NameVirtualHost *:80 Listen 80 ServerName 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 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 DocumentRoot /var/lib/roundcube # The host name under which you'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'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
和 webmail,可在 https://webmail.jhausse.net 下访问,基本上应该可以工作。使用完整的电子邮件(例如 [email )和您在本文开头在邮件服务器数据库中设置的密码登录。第一次连接时,浏览器会警告您证书未由证书颁发机构签署。没关系,只需添加一个例外。
最后但同样重要的是,我们将通过将以下内容放入 /etc/apache2/sites-available/owncloud 来为 owncloud 创建一个虚拟主机:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerAdmin 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 云端硬盘、日历、通讯录、Dropbox 和 Gmail!享受您刚刚恢复的隐私! 🙂
<名称=同步>
将您的设备同步到云端
<名称=同步>
要同步您的电子邮件,您只需使用您最喜欢的电子邮件客户端:Android 或 iOS 上的标准电子邮件程序、k9mail 或 PC 上的 Thunderbird。或者您也可以使用我们设置的网络邮件。
owncloud 的文档中描述了如何将您的日历和联系人与云同步。在 Android 上,我使用 CalDAV-Sync 和 CardDAV-Sync 应用程序,它们充当手机的 Android 日历和联系人应用程序与 owncloud 服务器之间的桥梁。
对于文件,有一个名为 Owncloud 的 Android 应用程序可以从您的手机访问您的文件,并自动将您拍摄的照片和视频上传到云端。在您的 Mac/PC 上访问您的文件很容易,并且在 Owncloud 文档中有详细描述。
<一个名字=提示>
最后提示
<一个名字=提示>
在最初的几周内,每天监控 /var/log/syslog 和 /var/log/mail.log 并确保一切顺利运行是个好主意。在您邀请其他人(朋友、家人……)在您的服务器上托管之前这样做很重要;如果他们信任您使用他们的数据并且服务器突然变得不可用,您可能会永远失去他们对自托管的信任。
要添加另一个电子邮件用户,只需在邮件服务器数据库的 virtual_users 表中添加一行。
要添加域,只需在 virtual_domains 表中添加一行。然后更新 /etc/opendkim/SigningTable 以对外发电子邮件进行签名,将 OpenDKIM 密钥上传到该区域,然后重新加载 OpenDKIM。
Owncloud有自己的用户数据库,可以通过以管理员身份登录Owncloud进行管理。
最后,重要的是要提前考虑解决方案,以防您的服务器暂时不可用。例如,在您的服务器返回之前,您的邮件会去哪里?一种解决方案是找一个可以充当您的备用 MX 的朋友,而您充当他的备用 MX(请参阅 Postfixs main.cf 文件中的 relay_domains 和 relay_recipient_maps 设置)。同样,如果您的服务器遭到破坏并且恶意个人删除了您那里的所有文件怎么办?为此,考虑定期备份系统很重要。 Linode 提供备份选项。在 1984.is 上,我使用 on crontabs 和 scp 建立了一个基本但足够的自动备份系统。