您自己的服务器(几乎)

作者:George Belotsky

您是否想以虚拟主机帐户的价格拥有 ISP 提供的专用服务器?对于大多数 Linux 用户来说,答案当然是肯定的。您需要对自己的服务器拥有 root 访问权限,并能够运行您选择的软件——即使预算只允许虚拟主机。

在这种情况下,解决方案是虚拟专用服务器 (VPS)。 VPS 帐户有效地将物理计算机的资源划分为多个虚拟机。您可以获得对 VPS 的 root 访问权限,并像配置专用服务器一样配置它。

当然,VPS 的灵活性是以增加复杂性为代价的。您是 VPS 的系统管理员,而不是您的 ISP。虚拟机的正确运行——尤其是安全性——是您的责任。

然而,典型的 VPS 帐户持有人只需要支持少量用户,并提供一些相对简单的服务。这使得管理系统变得容易得多。如果您至少可以从命令行轻松管理 Linux 机器,那么您应该能够成功过渡到 VPS 帐户。

在本文中,我们将注意力集中在从虚拟主机切换到 VPS 的最关键方面——让您的电子邮件正常工作。电子邮件是当今最重要的沟通工具之一。除了 DNS 之外,它也是您可能遇到的最复杂的服务。了解如何让您的电子邮件正常工作应该能让您对如何管理 VPS 有一个很好的整体了解。

关于 DNS,您可能希望您的 VPS 提供商完全为您处理它,至少在开始时是这样。在注册之前询问额外的费用。它们应该是每年额外几美元。一些域名注册商和第三方也可以为您提供 DNS 服务。

开始

我们使用 tummy.com 提供的 VPS 服务来实现和测试我们的电子邮件解决方案。默认情况下,它的 VPS 帐户基于 Red Hat 的 Fedora,但您可以在注册过程中轻松选择 Debian。本文使用基于 Fedora 的 VPS——写作时为 Fedora Core 3。以下讨论中的某些步骤特定于 Fedora,但大多数步骤适用于任何最新的 Linux 发行版。有关更新的 Linux 发行版的更新,请访问 /article/9380。该文档的开头有一个更正通知——只需继续阅读即可找到更新。

以下是您将在示例中看到的一些名称。 您的 VPS 主机名是myvps,您的工作站是ws,您的第一个域名是first.domain,您的第二个域名是second.domain。 您在工作站上的用户名是usera,VPS 上的邮件用户是mailamailb.

第一个域名以外的其他域名是可选的——只需记住删除所有对second.domain的引用,当您使用本文中的任何代码时。您还可以托管两个以上的域名——只需以与second.domain在示例中配置的方式相同的方式配置它们。

当然,您使用的实际域名应该是有效的并且注册在您名下。例如,我的first.domainopenlight.com。您也可以随意命名您的 VPS 和工作站。现在,让我们开始吧。

使用ssh root@MY.VPS.IP.ADDRESS以 root 身份登录到您的新 VPS 帐户。您在注册帐户时就已经选择了 root 密码,并且您的 VPS 提供商应该已经为您提供了虚拟机的 IP 地址。

设置新 Linux 服务器时的首要任务之一是配置内置的 iptables 防火墙。您的 VPS 提供商可能已设置合理的默认值,但您应始终自行验证。

在 Fedora Linux 发行版上,运行以下命令

[root@myvps ~]# system-config-securitylevel-tui

现在,您可以使用光标键从一个控件移动到另一个控件。 使用空格键激活按钮和切换复选框。 确保安全级别设置为已启用。 然后,激活自定义按钮。

在下一个屏幕上,您必须启用SSH, WWW邮件不要启用任何信任设备

接下来,向下滚动到其他端口文本框,并添加条目https:tcp,允许安全的 https 连接。 如果您决定配置 Web 邮件,您将需要 https,如本文后面所述。

完成自定义屏幕后,激活确定按钮。 此外,激活确定在下一个屏幕上。 最后,重新启动iptables以确保更改生效

[root@myvps ~]# /etc/init.d/iptables restart

重新配置 iptables 时必须非常小心。除了创建新漏洞的通常危险之外,很容易将自己锁定在远程 VPS 服务器之外。在这种情况下,您将不得不向您的 VPS 提供商寻求帮助。使 VPS 无法访问的其他常见方法是关闭网络、SSH 守护进程 (sshd) 或停止虚拟机。

接下来,创建一个普通用户登录名,您稍后将使用它来读取和发送电子邮件。设置新帐户的密码

[root@myvps ~]# useradd maila
[root@myvps ~]# passwd maila
Changing password for user maila.
New UNIX password:

对登录名使用诸如maila或化名之类的名称。 这样更安全,并防止意外在线发布个人信息。 验证您是否可以登录到新帐户。 现在您可以配置邮件服务器了。

警告

已经发生了很多针对 SSH 的自动攻击。 您至少必须使用强密码,否则您的系统将受到威胁。 apg 实用程序简化了此任务。 它生成您可以发音的随机、非字典的“单词”。 大多数流行的 Linux 发行版都有 apg 包。

请务必在本文的在线资源中查找更多信息。 SSH 安全性并非 VPS 环境所独有——它也是标准虚拟主机中的一个重要问题。但是,通过 VPS,您可以灵活地保护自己。 资源页面位于 /article/9380

配置邮件服务器

邮件服务器,也称为 邮件传输代理 (MTA),是一种传递和接收电子邮件消息的程序。 MTA 将接收其他人发送给您的所有邮件。 同样,您发送给其他人的任何消息都将通过 MTA 离开您的 VPS。

您的 VPS 上的默认 MTA 是 Sendmail。 这种复杂而强大的程序对于复杂的电子邮件配置具有优势。 不幸的是,它也很难配置并且往往有很多安全问题。

因此,我们将 Sendmail 替换为 Postfix。 Postfix 高效、非常安全,最重要的是,易于配置。 在继续安装之前,关闭 Sendmail,并确保它不会在重新启动时再次启动。 然后,安装 Postfix

[root@myvps ~]# /etc/init.d/sendmail stop
Shutting down sendmail:                      [  OK  ]
Shutting down sm-client:                     [  OK  ]
[root@myvps ~]# chkconfig --del sendmail
[root@myvps ~]# up2date --install postfix

请注意,使用up2date命令安装软件包特定于 Red Hat 和相关发行版。 您第一次运行up2date时,可能会出现配置屏幕。 您只需按 Enter 键即可接受默认值。 此外,up2date有时非常慢,甚至可能由于暂时性原因而失败。 如果第一次不起作用,您可以再次尝试该命令。

主要的 Postfix 配置文件是/etc/postfix/main.cf。 保存此文件的副本以供稍后阅读,因为它包含许多有用的注释。 然后,替换/etc/postfix/main.cf使用列表 1 中的代码。 您应该修改您的新main.cf以指定您将在 VPS 上托管的域名。

列表 1. VPS 上 Postfix 的示例 main.cf 文件
# Example "main.cf" file for Postfix on a VPS.
#
# Note that lines that begin with whitespace
# continue the previous line.
#

# LOCAL PATHNAME INFORMATION
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix

# QUEUE AND PROCESS OWNERSHIP
mail_owner = postfix

# Host name is usually the domain name on a VPS.
myhostname = first.domain
mydomain = first.domain

# Where locally-posted mail will come from.
myorigin = $myhostname

# Listen on all interfaces.
inet_interfaces = all

# This server is the final destination for these domains.
mydestination = localhost, localhost.localdomain,
                $myhostname, localhost.$mydomain,
                $mydomain, second.domain

# IMPORTANT -- accept mail for relaying ONLY from
# the local machine.
mynetworks_style = host

# Where your aliases are.
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

# This user should receive any mail whose recipient
# could not otherwise be matched.
luser_relay = maila@localhost.localdomain

# IMPORTANT -- local recipient checking must be
# turned off for the "luser_relay" directive to
# work.
local_recipient_maps =

# Error code to reject mail with when the local
# recipient is not known.
unknown_local_recipient_reject_code = 550

# Your server's greeting banner.  IMPORTANT -- it
# MUST start with your server's hostname, and the
# reverse DNS lookup on the server's IP address MUST
# match this hostname, or your outgoing mail could
# be rejected as SPAM.
smtpd_banner = $myhostname ESMTP

# See the "main.cf" that came with your Postfix
# distribution for discussion on the rest of the
# directives in this file.
debug_peer_level = 2

debugger_command =
  PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
  xxgdb $daemon_directory/$process_name $process_id
  & sleep 5

sendmail_path = /usr/sbin/sendmail.postfix

newaliases_path = /usr/bin/newaliases.postfix

mailq_path = /usr/bin/mailq.postfix

setgid_group = postdrop

html_directory = no

manpage_directory = /usr/share/man

sample_directory = /usr/share/doc/postfix-2.1.5/samples

readme_directory = /usr/share/doc/postfix-2.1.5/README_FILES

将列表 1 中所有出现的first.domain替换为您自己的完全限定域名,例如openlight.com您的 VPS 的 IP 地址的反向 DNS 查找必须返回此域名! 否则,您的出站邮件可能会被拒绝为垃圾邮件。

如果您托管其他域名,请将其替换为second.domain条目。 否则,删除second.domain在使用列表 1 之前。 如果您愿意,您也可以替换maila在列表 1 中使用您选择的用户名。

现在,将条目附加到/etc/aliases文件以指定将接收 root 邮件的用户。 这是一个例子

root:           maila

接下来,为其他电子邮件用户创建帐户。 将这些用户的任何别名附加到/etc/aliases。 以下示例条目将导致用户mailb接收发送到promo@first.domain:

promo:          mailb

的所有消息。 请注意,如果您有其他域名,则发送到promo@second.domain的消息也将发送到mailb。 对于小型组织来说,这可能是正确的默认行为,因为您将托管的所有域名几乎肯定都是相关的。 例如,如果您为您的产品托管其他域名,那么关于产品的技术支持问题很可能应该发送给同一个人,无论电子邮件地址中出现哪个域名。

完成后,更新别名数据库文件,并启动 Postfix

[root@myvps ~]# postalias /etc/aliases
[root@myvps ~]# /etc/init.d/postfix start
Starting postfix: [  OK  ]

检查日志文件/var/log/maillog以查找任何错误。

即使 Postfix 正在运行,您也可以更新别名文件,只需运行postalias /etc/aliases完成时再次运行。

您现在应该验证 Postfix 是否正在执行您期望的操作。 使用 telnet 连接到 VPS 上的端口 25,如列表 2 所示。 只需输入以粗体突出显示的文本即可——其余文本是系统的响应。 当然,您应该键入 VPS 的 IP 地址来代替MY.VPS.IP.ADDRESS,并键入您的实际域名来代替first.domain.

列表 2. 验证 Postfix 是否正常工作
[usera@ws]$ telnet MY.VPS.IP.ADDRESS 25
Trying MY.VPS.IP.ADDRESS
Connected to MY.VPS.IP.ADDRESS.
Escape character is '^]'.
220 first.domain ESMTP
HELO example.com
250 first.domain
MAIL FROM: test@example.com
250 Ok
RCPT TO: promo@first.domain
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
This is a test
.
250 Ok: queued as MESSAGEID
QUIT
221 Bye
Connection closed by foreign host.

使用列表 2 作为指南来运行以下测试

  • 从外部机器(例如您的工作站)连接到您的 VPS 的 25 端口。 验证 Postfix 是否接受您打算使用的每个电子邮件地址的消息。 然后,确保正确的用户正在接收消息。 有关详细信息,请参见以下讨论。

  • 再次从外部连接,并检查 Postfix 是否会拒绝将邮件中继到其他系统。 使用您在其他系统上拥有的电子邮件帐户作为目标,以防万一。 您的 MTA 拒绝来自外部机器的任何中继请求非常重要。 否则,垃圾邮件发送者会很快发现他们可以通过您的系统路由他们的垃圾邮件。

  • 使用telnet从 VPS 本身的 shell 提示符下,检查 MTA 是否会将邮件中继到远程服务器。 使用您在其他系统上的自己的电子邮件帐户作为目标。 请注意,远程 MTA 可能会拒绝接受该消息,因为您的系统尚未上线,因此反向 DNS 查找将不会产生正确的结果。

您可以使用 mail 命令验证 VPS 上的用户是否已收到邮件。 这是一个检查 maila 的邮件的示例

[root@myvps ~]# mail -u maila

Themail命令是一个简单的邮件阅读器。 键入h查看收到的邮件,然后键入邮件的编号以查看它。 按空格键滚动浏览消息。 您也可以使用 Enter 键滚动浏览消息,但是它将在到达当前消息的末尾后开始查看下一条消息。 您可以键入q停止查看消息。 当您没有查看消息时,键入q将会退出 mail。The?键会显示一个帮助屏幕。

当一切正常运行时,请告诉您的初始化脚本在系统重新启动时自动启动 Postfix

[root@myvps ~]# chkconfig --add postfix
准备读取您的邮件

在本文中,我们将讨论两种读取邮件的方法。 一种是将邮件下载到您的工作站。 另一种是将其留在 VPS 上,并使用基于 Web 的解决方案通过浏览器查看消息。 您可以一起使用这两种方法。

第一种方法需要 POP3 协议,第二种方法需要 IMAP。 在 Fedora 上,获取这两种协议的最简单方法是安装 Dovecot

[root@myvps ~]# up2date --install dovecot

安装完成后,编辑/etc/dovecot.conf. 找到protocols指令,并将其替换为以下内容。 不要删除原始行,但将其注释掉以供将来参考

#protocols = imap imaps pop3 pop3s
protocols = pop3 imap

作为安全预防措施,请配置 POP3 和 IMAP 以仅接受来自 VPS 本身的请求。 再次,不要删除原始代码,而是将其注释掉以供将来参考

#imap_listen = [::]
imap_listen = [127.0.0.1]
#pop3_listen = [::]
pop3_listen = [127.0.0.1]

启动dovecot,并将其添加到您的系统的初始化脚本中

[root@myvps ~]# /etc/init.d/dovecot start
Starting Dovecot Imap:                       [  OK  ]
[root@myvps ~]# chkconfig --level 345 dovecot on
如何从您的工作站读取和发送邮件

我们将使用 SSH 隧道 从您的工作站安全地读取和发送邮件。 使用 SSH 隧道,您可以暂时将 VPS 上的端口映射到工作站上的可用端口。 映射端口上的所有通信都通过加密隧道进行。

在您的工作站上给出以下命令。 如果您没有为myvps/etc/hosts文件上添加条目,请使用您的 VPS 的 IP 地址

[usera@ws ~]$ ssh -Nf maila@myvps \
-L 2525:localhost:25 -L 2110:localhost:110

用户maila必须具有对 VPS 的 shell 访问权限。 系统将提示您输入maila的密码。

此隧道分别将 VPS 上的 25 端口和 110 端口映射到工作站上的 2525 端口和 2110 端口。 如果您已经使用 POP3 下载您的入站邮件,并通过 ISP 的邮件服务器发送您的出站邮件,则您只需对邮件客户端的配置进行很少的更改。

只需将您的 POP3 服务器设置为localhost,端口为 2110,并将您的出站邮件服务器设置为localhost,端口为 2525。 您甚至可以保持出站邮件设置不变,除非您计划取消您当前使用的 ISP 的邮件服务器上的帐户。 以下是两个流行的电子邮件客户端的特定说明。

如果您使用 Mozilla Thunderbird,请选择帐户设置...来自编辑菜单。 通过单击添加帐户...对话框中的按钮,添加一个新帐户,然后按照帐户向导中的提示进行操作。 创建新帐户后,单击其服务器设置左窗格中的列表项以配置 POP3 服务器和端口。 图 1 显示了屏幕截图。 红色突出显示指示最重要的参数。

A Server (Almost) of Your Own

图 1. 在 Mozilla Thunderbird 中设置您的邮件帐户

您还可以从同一帐户设置对话框配置 Thunderbird 的传出邮件服务器。 单击对话框左窗格中的传出服务器 (SMTP)。 图 2 显示了结果屏幕截图。 记住取消选中使用名称和密码复选框。

A Server (Almost) of Your Own

图 2. 将您的传出邮件服务器设置为 localhost,端口为 2525。

另一个流行的邮件客户端是 Mutt。 一个典型的基于 Mutt 的配置使用 Fetchmail 下载邮件,Procmail 将其排序到邮箱中,以及 ssmtp 传递出站邮件。 请参见列表 3 以获取示例.fetchmailrc文件,以及列表 4 以获取示例ssmtp.conf文件。 两者都使用我们之前创建的 SSH 隧道。 不要忘记更改列表 3 中的代码以反映您正确的用户名和密码。

列表 3. .fetchmailrc 配置文件
set postmaster "usera"
set no bouncemail
set no spambounce

poll localhost with protocol POP3 and port 2110
and options no dns:
   user "maila" there is usera here and wants
   mda "/usr/bin/procmail -d %T" options fetchall
         password "MAILA'S VPS PASSWORD"
列表 4. ssmtp.conf 配置文件
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=postmaster

# The place where the mail goes. The actual machine
# name is required; no MX records are consulted.
mailhub=localhost:2525

# The full hostname
hostname=localhost

# The "From" line sender address will override any
# settings here.
FromLineOverride=YES

最后,请注意,您每次重新启动工作站时都需要再次设置 SSH 隧道。 有许多方法可以自动执行此过程,但是讨论它们超出了本文的范围。

如何通过 Web 读取和发送邮件

Fedora Linux 发行版提供了一个基于 Web 的电子邮件界面,只需很少的工作即可进行配置。 它基于 SquirrelMailApache。 Web 邮件是一种支持 Windows 客户端的简便方法。 它也不需要对 VPS 的 shell 访问权限。

首先,安装 SquirrelMail

[root@myvps ~]# up2date --install squirrelmail

此过程还会安装 SquirrelMail 需要的其他几个软件包。 接下来,通过安装 mod_ssl 启用安全的 https 访问

[root@myvps ~]# up2date --install mod_ssl

您必须禁用对 SquirrelMail 的不安全 http 访问。 编辑文件/etc/httpd/conf.d/squirrelmail.conf,并追加以下行

<LocationMatch "/webmail">
SSLRequireSSL
</LocationMatch>

现在,启动 Apache Web 服务器

[root@myvps ~]# /etc/init.d/httpd start

连接到https://MY.VPS.IP.ADDRESS/webmail。 您的浏览器会警告您有关 SSL 证书的信息——只需永久接受它,您就不会再次收到警告。 完全避免此错误的唯一方法是使用由公认的 证书颁发机构 (CA) 签名的证书。 CA 将需要验证您的身份,并且还会收取签署证书的年费。

接受证书后,您应该能够以您先前创建的任何邮件用户身份登录。 如果某个特定的邮件用户——例如mailb——不需要 shell 访问权限,请使用以下命令禁用它

[root@myvps ~]# usermod -s /sbin/nologin mailb

不要忘记将 Apache Web 服务器添加到您的启动环境中

[root@myvps ~]# chkconfig --level 345 httpd on

您的 Web 邮件用户应单击 SquirrelMail 界面中的选项链接,并配置他们的帐户信息。 否则,SquirrelMail 会以类似于mailb@localhost.localdomain的方式格式化他们的消息From

结论

本文介绍了切换到 VPS 帐户的最困难的方面之一——设置您的电子邮件。 如您所见,电子邮件服务由几个不同的程序协同工作提供。 有许多其他方法可以配置此服务。 不幸的是,描述和比较所有这些方法需要一本很长的书。 本文试图提供一个具有良好安全性的简单解决方案,新的 VPS 用户可以快速实现。

欢迎来到 VPS 托管的世界——一个(几乎)属于您自己的服务器。

致谢

作者希望感谢 tummy.com, LTD. 的 Sean Reifschneider 和 Evelyn Mitchell,他们慷慨地提供了一个 VPS 帐户来测试此处提供的示例,以及他们对本文的宝贵意见。

本文的资源: /article/9380.

George Belotsky 是一位软件架构师,他在高性能 Internet 服务器以及硬实时和嵌入式系统方面做了大量工作。 他的技术兴趣包括 C++、Python 和 Linux。 他也是 Flightdeck-UI 开源项目的作者,该项目使用来自飞机仪表的想法来实现计算机用户界面。 您可以通过 questions@openlight.com 联系 George。

加载 Disqus 评论