第6章。网络应用

目录

6.1. 网页浏览器
6.1.1. 浏览器配置
6.2. 邮件系统
6.2.1. 电子邮件基础知识
6.2.2. 现代邮件服务基础知识
6.2.3. 工作站的邮件配置策略
6.3. 邮件传输代理 (MTA)
6.3.1. exim4 的配置
6.3.2. 使用 SASL 的 postfix 配置
6.3.3. 邮件地址配置
6.3.4. 基本 MTA 操作
6.4. 邮件用户代理 (MUA)
6.4.1. 基本 MUA — Mutt
6.5. 远程邮件检索和转发实用程序
6.5.1. getmail 配置
6.5.2. fetchmail 配置
6.6. 带有过滤器的邮件投递代理 (MDA)
6.6.1. maildrop 配置
6.6.2. procmail 配置
6.6.3. 重新投递 mbox 内容
6.7. POP3/IMAP4 服务器
6.8. 打印服务器和实用程序
6.9. 远程访问服务器和实用程序 (SSH)
6.9.1. SSH 基础知识
6.9.2. 用于 SMTP/POP3 隧道的端口转发
6.9.3. 无需远程密码即可连接
6.9.4. 处理非标准 SSH 客户端
6.9.5. 设置 ssh-agent
6.9.6. 如何在 SSH 上关闭远程系统
6.9.7. SSH 故障排除
6.10. 其他网络应用服务器
6.11. 其他网络应用客户端
6.12. 系统守护程序的诊断

建立网络连接后(参见第5章,网络设置),您可以运行各种网络应用程序。

6.1. 网页浏览器

有许多网页浏览器软件包可以通过超文本传输协议 (HTTP) 访问远程内容。


6.1.1. 浏览器配置

您或许可以使用以下特殊 URL 字符串来确认浏览器的设置。

  • about:

  • about:config

  • about:plugins

Debian 在主归档区域提供了许多免费的浏览器插件软件包,它们不仅可以处理 Java(软件平台)Flash,还可以处理 MPEGMPEG2MPEG4DivXWindows Media Video (.wmv)QuickTime (.mov)MP3 (.mp3)Ogg/Vorbis 文件、DVD、VCD 等。Debian 还提供辅助程序来安装 contrib 或 non-free 归档区域中的非自由浏览器插件软件包。

表 6.2. 浏览器插件软件包列表


[Tip] 提示

虽然使用上述 Debian 软件包更容易,但仍然可以通过将“*.so”安装到插件目录(例如,“/usr/lib/iceweasel/plugins/”)并重启浏览器来手动启用浏览器插件。

某些网站会根据您浏览器的用户代理字符串拒绝连接。您可以通过欺骗用户代理字符串来解决这种情况。例如,您可以通过将以下行添加到用户配置文件中,例如“~/.gnome2/epiphany/mozilla/epiphany/user.js”或“~/.mozilla/firefox/*.default/user.js”。

user_pref{"general.useragent.override","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"};

或者,您可以通过在 URL 中键入“about:config”并右键单击其显示内容来添加和重置此变量。

[Caution] 警告

欺骗的用户代理字符串可能会导致 Java 的不良副作用

6.2. 邮件系统

[Caution] 警告

如果您要设置邮件服务器以直接与 Internet 交换邮件,您应该比阅读这份基础文档更了解。

[Note] 注意

以下配置示例仅对消费级 Internet 连接上的典型移动工作站有效。

6.2.1. 电子邮件基础知识

电子邮件消息由三个组件组成:消息信封、消息头和消息体。

消息信封中的“To”和“From”信息供 SMTP 用于传递电子邮件。(消息信封中的“From”信息也称为 退信地址、From_ 等。)

消息头中的“To”和“From”信息由电子邮件客户端显示。(虽然这些信息最常见的情况是与消息信封中的信息相同,但并非总是如此。)

电子邮件客户端需要使用 多用途 Internet 邮件扩展 (MIME) 来解释消息头和消息体数据,以处理内容数据类型和编码。

6.2.2. 现代邮件服务基础知识

为了遏制垃圾邮件(不需要的和未经请求的电子邮件)问题,许多提供消费级 Internet 连接的 ISP 正在实施对策。

  • 他们为客户发送消息而提供的智能主机服务使用 rfc4409 中指定的消息提交端口 (587) 和 rfc4954 中指定的密码(SMTP AUTH 服务)。

  • 从其内部网络主机(ISP 自己的出站邮件服务器除外)到 Internet 的 SMTP 端口 (25) 连接被阻止。

  • 从某些可疑的外部网络主机到 ISP 的入站邮件服务器的 SMTP 端口 (25) 连接被阻止。(来自拨号和其他消费级 Internet 连接使用的动态 IP 地址范围的主机的连接是首批被阻止的连接。)

  • 反垃圾邮件技术,例如 域密钥识别邮件 (DKIM)发件人策略框架 (SPF),被广泛用于 电子邮件过滤

  • 您的邮件通过智能主机发送时,可能会提供 域密钥识别邮件 服务。

在配置邮件系统或解决邮件传递问题时,您必须考虑这些新的限制。

鉴于这些充满敌意的 Internet 环境和限制,一些独立的 Internet 邮件 ISP(如 Yahoo.com 和 Gmail.com)提供了安全邮件服务,该服务可以使用 传输层安全 (TLS) 及其前身安全套接层 (SSL) 从 Internet 上的任何位置连接。

  • 端口 465 上的智能主机服务,使用已弃用的基于 SSL 的 SMTP(SMTPS 协议)。

  • 端口 587 上的智能主机服务,使用 STARTTLS

  • 入站邮件可以通过 TLS/POP3 端口 (995) 使用 POP3 访问。

[Caution] 警告

在消费级网络上运行 SMTP 服务器以将邮件可靠地直接发送到远程主机是不现实的。它们很可能被拒绝。您必须使用连接 ISP 或独立邮件 ISP 提供的一些智能主机服务。

为了简单起见,我在以下文本中假设智能主机位于“smtp.hostname.dom”,需要 SMTP 身份验证,并使用消息提交端口 (587) 和 STARTTLS

6.2.3. 工作站的邮件配置策略

最简单的邮件配置是邮件发送到 ISP 的智能主机,并由 MUA(参见第 6.4 节,“邮件用户代理 (MUA)”)本身从 ISP 的 POP3 服务器接收。这种类型的配置在功能齐全的基于 GUI 的 MUA(如 icedove(1)evolution(1) 等)中很流行。如果您需要按类型过滤邮件,您可以使用 MUA 的过滤功能。对于这种情况,本地 MTA(参见第 6.3 节,“邮件传输代理 (MTA)”)只需要进行本地投递。

另一种邮件配置是邮件通过本地 MTA 发送到 ISP 的智能主机,并由邮件检索器(参见第 6.5 节,“远程邮件检索和转发实用程序”)从 ISP 的 POP3 接收到本地邮箱。如果您需要按类型过滤邮件,您可以使用带有过滤器的 MDA(参见第 6.6 节,“带有过滤器的邮件投递代理 (MDA)”)将邮件过滤到单独的邮箱中。这种类型的配置在简单的基于控制台的 MUA(如 mutt(1)gnus(1) 等)中很流行,尽管这对于任何 MUA 都是可能的(参见第 6.4 节,“邮件用户代理 (MUA)”)。对于这种情况,本地 MTA(参见第 6.3 节,“邮件传输代理 (MTA)”)需要同时进行智能主机投递和本地投递。由于移动工作站没有有效的 FQDN,您必须配置本地 MTA 以隐藏和欺骗出站邮件中的真实本地邮件名称,以避免邮件传递错误(参见第 6.3.3 节,“邮件地址配置”)。

[Tip] 提示

您可能希望配置 MUA/MDA 以使用 Maildir 将电子邮件消息存储在您主目录下的某个位置。

6.3. 邮件传输代理 (MTA)

对于普通工作站,邮件传输代理 (MTA) 的常用选择是 exim4-*postfix 软件包。这完全取决于您。

表 6.3. 工作站的基本邮件传输代理相关软件包列表


虽然 exim4-* 的 popcon 投票数看起来比 postfix 高几倍,但这并不意味着 postfix 在 Debian 开发人员中不受欢迎。Debian 服务器系统同时使用 exim4postfix邮件头分析来自杰出的 Debian 开发人员的邮件列表帖子也表明,这两种 MTA 都同样受欢迎。

exim4-* 软件包以其极小的内存消耗和非常灵活的配置而闻名。postfix 软件包以其紧凑、快速、简单和安全而闻名。两者都附带了大量的文档,并且在质量和许可方面都很好。

在 Debian 归档中,邮件传输代理 (MTA) 软件包有很多选择,它们具有不同的功能和重点。


6.3.1. exim4 的配置

对于通过智能主机发送 Internet 邮件,您可以按如下方式(重新)配置 exim4-* 软件包。

$ sudo /etc/init.d/exim4 stop
$ sudo dpkg-reconfigure exim4-config

为“邮件配置的通用类型”选择“通过智能主机发送邮件;通过 SMTP 或 fetchmail 接收”。

将“系统邮件名称:”设置为其默认值,即 FQDN(参见第 5.1.2 节,“主机名解析”)。

将“侦听传入 SMTP 连接的 IP 地址:”设置为其默认值,即“127.0.0.1 ; ::1”。

取消设置“接受邮件的其他目标:”的内容。

取消设置“为其转发邮件的计算机:”的内容。

将“传出智能主机的 IP 地址或主机名:”设置为“smtp.hostname.dom:587”。

为“在外发邮件中隐藏本地邮件名称?”选择“<否>”。(使用“/etc/email-addresses”,如第 6.3.3 节,“邮件地址配置”中所示。)

回复“保持 DNS 查询数量最少(按需拨号)?”,回复以下其中一项。

  • 如果系统在启动时连接到 Internet,则选择“否”。

  • 如果系统在启动时连接到 Internet,则选择“是”。

将“本地邮件的投递方法:”设置为“/var/mail/ 中的 mbox 格式”。

为“将配置拆分为小文件?:”选择“<是>”。

通过编辑“/etc/exim4/passwd.client”为智能主机创建密码条目。

$ sudo vim /etc/exim4/passwd.client
 ...
$ cat /etc/exim4/passwd.client
^smtp.*\.hostname\.dom:username@hostname.dom:password

通过以下方式启动 exim4

$ sudo /etc/init.d/exim4 start

/etc/exim4/passwd.client”中的主机名不应是别名。您可以使用以下命令检查真实主机名。

$ host smtp.hostname.dom
smtp.hostname.dom is an alias for smtp99.hostname.dom.
smtp99.hostname.dom has address 123.234.123.89

我在“/etc/exim4/passwd.client”中使用正则表达式来解决别名问题。即使 ISP 移动了别名指向的主机,SMTP AUTH 也可能仍然有效。

您可以通过以下方式手动更新 exim4 配置

  • 更新“/etc/exim4/”中的 exim4 配置文件。

    • 创建“/etc/exim4/exim4.conf.localmacros”以设置 MACRO,并编辑“/etc/exim4/exim4.conf.template”。(非拆分配置)

    • 在“/etc/exim4/exim4.conf.d”子目录中创建新文件或编辑现有文件。(拆分配置)

  • 运行“invoke-rc.d exim4 reload”。

请阅读以下官方指南:“/usr/share/doc/exim4-base/README.Debian.gz”和 update-exim4.conf(8)

[Caution] 警告

如果为 debconf 查询“保持 DNS 查询数量最少(按需拨号)?”选择了“否”(默认值),并且系统在启动时连接到 Internet,则启动 exim4 需要很长时间。

[Warning] 警告

即使您的 ISP 允许,在没有加密的情况下使用纯文本密码也是不安全的。

[Tip] 提示

虽然建议使用端口 587 上的 STARTTLSSMTP,但某些 ISP 仍然使用已弃用的 SMTPS(端口 465 上的 SSL)。4.77 之后的 Exim4 支持此已弃用的 SMTPS 协议,既可以作为客户端,也可以作为服务器。

[Tip] 提示

如果您正在寻找尊重“/etc/aliases”的轻量级 MTA 以用于您的笔记本电脑 PC,您应该考虑在“/etc/default/exim4”中使用“QUEUERUNNER='queueonly'”、“QUEUERUNNER='nodaemon'”等配置 exim4(8)

6.3.2. 使用 SASL 的 postfix 配置

对于通过智能主机发送 Internet 邮件,您应该首先阅读 postfix 文档和关键手册页。

表 6.5. 重要的 postfix 手册页列表

命令 功能
postfix(1) Postfix 控制程序
postconf(1) Postfix 配置实用程序
postconf(5) Postfix 配置参数
postmap(1) Postfix 查找表维护
postalias(1) Postfix 别名数据库维护

您可以按如下方式(重新)配置 postfixsasl2-bin 软件包。

$ sudo /etc/init.d/postfix stop
$ sudo dpkg-reconfigure postfix

选择“使用智能主机的 Internet”。

将“SMTP 中继主机(无则留空):”设置为“[smtp.hostname.dom]:587”,并按如下方式配置它。

$ sudo postconf -e 'smtp_sender_dependent_authentication = yes'
$ sudo postconf -e 'smtp_sasl_auth_enable = yes'
$ sudo postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'
$ sudo postconf -e 'smtp_sasl_type = cyrus'
$ sudo vim /etc/postfix/sasl_passwd

为智能主机创建密码条目。

$ cat /etc/postfix/sasl_passwd
[smtp.hostname.dom]:587     username:password
$ sudo postmap hush:/etc/postfix/sasl_passwd

通过以下方式启动 postfix

$ sudo /etc/init.d/postfix start

此处在 dpkg-reconfigure 对话框和“/etc/postfix/sasl_passwd”中使用“[”和“]”可确保不检查 MX 记录,而是直接使用指定的精确主机名。请参阅“/usr/share/doc/postfix/html/SASL_README.html”中的“在 Postfix SMTP 客户端中启用 SASL 身份验证”。

6.3.3. 邮件地址配置

有一些用于邮件传输、投递和用户代理的邮件地址配置文件

表 6.6. 邮件地址相关配置文件列表

文件 功能 应用程序
/etc/mailname (外发)邮件的默认主机名 Debian 特定,mailname(5)
/etc/email-addresses 外发邮件的主机名欺骗 exim(8) 特定,exim4-config_files(5)
/etc/postfix/generic 外发邮件的主机名欺骗 postfix(1) 特定,在 postmap(1) 命令执行后激活。
/etc/aliases 入站邮件的帐户名别名 通用,在 newaliases(1) 命令执行后激活。

/etc/mailname”文件中的mailname通常是完全限定域名 (FQDN),它解析为主机的 IP 地址之一。对于没有具有可解析 IP 地址的主机名的移动工作站,请将此mailname设置为“hostname -f”的值。(这是安全的选择,适用于 exim4-*postfix。)

[Tip] 提示

许多非 MTA 程序使用“/etc/mailname”的内容作为其默认行为。对于 mutt,请在 ~/muttrc 文件中设置“hostname”和“from”变量以覆盖mailname值。对于 devscripts 软件包中的程序,例如 bts(1)dch(1),导出环境变量“$DEBFULLNAME”和“$DEBEMAIL”以覆盖它。

[Tip] 提示

popularity-contest 软件包通常从 root 帐户发送带有 FQDN 的邮件。您需要在 /etc/popularity-contest.conf 中设置 MAILFROM,如 /usr/share/popularity-contest/default.conf 文件中所述。否则,您的邮件将被智能主机 SMTP 服务器拒绝。虽然这很繁琐,但这种方法比通过 MTA 重写来自 root 的所有邮件的源地址更安全,并且应该用于其他守护程序和 cron 脚本。

当将mailname设置为“hostname -f”时,可以通过以下方式实现通过 MTA 欺骗源邮件地址。

  • 用于 exim4(8) 的“/etc/email-addresses”文件,如 exim4-config_files(5) 中所述

  • 用于 postfix(1) 的“/etc/postfix/generic”文件,如 generic(5) 中所述

对于 postfix,需要以下额外步骤。

# postmap hash:/etc/postfix/generic
# postconf -e 'smtp_generic_maps = hash:/etc/postfix/generic'
# postfix reload

您可以使用以下命令测试邮件地址配置。

  • exim(8),带有 -brw, -bf, -bF, -bV, … 选项

  • postmap(1),带有 -q 选项。

[Tip] 提示

Exim 附带了几个实用程序,例如 exiqgrep(8)exipick(8)。有关可用命令,请参阅“dpkg -L exim4-base|grep man8/”。

6.3.4. 基本 MTA 操作

有几个基本的 MTA 操作。有些可以通过 sendmail(1) 兼容性接口执行。

表 6.7. 基本 MTA 操作列表

exim 命令 postfix 命令 描述
sendmail sendmail 从标准输入读取邮件并安排投递 (-bm)
mailq mailq 列出带有状态和队列 ID 的邮件队列 (-bp)
newaliases newaliases 初始化别名数据库 (-I)
exim4 -q postqueue -f 刷新等待邮件 (-q)
exim4 -qf postsuper -r ALL deferred; postqueue -f 刷新所有邮件
exim4 -qff postsuper -r ALL; postqueue -f 甚至刷新冻结的邮件
exim4 -Mg queue_id postsuper -h queue_id 按队列 ID 冻结一条消息
exim4 -Mrm queue_id postsuper -d queue_id 按队列 ID 删除一条消息
N/A postsuper -d ALL 删除所有消息

[Tip] 提示

在“/etc/ppp/ip-up.d/*”中的脚本中刷新所有邮件可能是一个好主意。

6.4. 邮件用户代理 (MUA)

如果您订阅了 Debian 相关的邮件列表,则使用 muttgnus 等 MUA 可能是个好主意,它们是参与者的事实标准,并且已知行为符合预期。

表 6.8. 邮件用户代理 (MUA) 列表

软件包 popcon 大小 类型
evolution http://qa.debian.org/popcon.php?package=evolution 4983 X GUI 程序(GNOME3,群件套件)
icedove http://qa.debian.org/popcon.php?package=icedove 39788 X GUI 程序(GNOME2,未命名的 Mozilla Thunderbird)
kmail http://qa.debian.org/popcon.php?package=kmail 29238 X GUI 程序 (KDE)
mutt http://qa.debian.org/popcon.php?package=mutt 5446 字符终端程序,可能与 vim 一起使用
gnus http://qa.debian.org/popcon.php?package=gnus 6453 字符终端程序,在 (x)emacs 下运行

6.4.1. 基本 MUA — Mutt

自定义“~/.muttrc”,如下所示,将 mutt 用作邮件用户代理 (MUA) 并与 vim 结合使用。

#
# User configuration file to override /etc/Muttrc
#
# spoof source mail address
set use_from
set hostname=example.dom
set from="Name Surname <username@example.dom>"
set signature="~/.signature"

# vim: "gq" to reformat quotes
set editor="vim -c 'set tw=72 et ft=mail'"

# "mutt" goes to Inbox, while "mutt -y" lists mailboxes
set mbox_type=Maildir           # use qmail Maildir format for creating mbox
set mbox=~/Mail                 # keep all mail boxes in $HOME/Mail/
set spoolfile=+Inbox            # mail delivered to $HOME/Mail/Inbox
set record=+Outbox              # save fcc mail to $HOME/Mail/Outbox
set postponed=+Postponed        # keep postponed in $HOME/Mail/postponed
set move=no                     # do not move Inbox items to mbox
set quit=ask-yes                # do not quit by "q" only
set delete=yes                  # always delete w/o asking while exiting
set fcc_clear                   # store fcc as non encrypted

# Mailboxes in Maildir (automatic update)
mailboxes `cd ~/Mail; /bin/ls -1|sed -e 's/^/+/' | tr "\n" " "`
unmailboxes Maillog *.ev-summary

## Default
#set index_format="%4C %Z %{%b %d} %-15.15L (%4l) %s"
## Thread index with senders (collapse)
set index_format="%4C %Z %{%b %d} %-15.15n %?M?(#%03M)&(%4l)? %s"

## Default
#set folder_format="%2C %t %N %F %2l %-8.8u %-8.8g %8s %d %f"
## just folder names
set folder_format="%2C %t %N %f"

将以下内容添加到“/etc/mailcap”或“~/.mailcap”以内联显示 HTML 邮件和 MS Word 附件。

text/html; lynx -force_html %s; needsterminal;
application/msword; /usr/bin/antiword '%s'; copiousoutput; description="Microsoft Word Text"; nametemplate=%s.doc
[Tip] 提示

Mutt 可以用作 IMAP 客户端和邮箱格式转换器。您可以使用“t”、“T”等标记消息。这些标记的消息可以使用“;C”在不同邮箱之间复制,并使用“;d”在一个操作中删除。

6.5. 远程邮件检索和转发实用程序

虽然 fetchmail(1) 一直是 GNU/Linux 上远程邮件检索的事实标准,但作者现在更喜欢 getmail(1)。如果您想在下载邮件以节省带宽之前拒绝邮件,mailfiltermpop 可能很有用。无论使用哪个邮件检索实用程序,最好配置系统以通过管道将检索到的邮件投递到 MDA,例如 maildrop

表 6.9. 远程邮件检索和转发实用程序列表

软件包 popcon 大小 描述
fetchmail http://qa.debian.org/popcon.php?package=fetchmail 2356 邮件检索器 (POP3, APOP, IMAP) (旧)
getmail4 http://qa.debian.org/popcon.php?package=getmail4 600 邮件检索器 (POP3, IMAP4, 和 SDPS) (简单、安全和可靠)
mailfilter http://qa.debian.org/popcon.php?package=mailfilter 281 邮件检索器 (POP3),具有正则表达式过滤功能
mpop http://qa.debian.org/popcon.php?package=mpop 207 邮件检索器 (POP3) 和 MDA,具有过滤功能

6.5.1. getmail 配置

getmail(1) 的配置在 getmail 文档中描述。 这是我作为用户访问多个 POP3 帐户的设置。

创建 "/usr/local/bin/getmails" 如下。

#!/bin/sh
set -e
if [ -f $HOME/.getmail/running ]; then
  echo "getmail is already running ... (if not, remove $HOME/.getmail/running)" >&2
  pgrep -l "getmai[l]"
  exit 1
else
  echo "getmail has not been running ... " >&2
fi
if [ -f $HOME/.getmail/stop ]; then
  echo "do not run getmail ... (if not, remove $HOME/.getmail/stop)" >&2
  exit
fi
if [ "x$1" = "x-l" ]; then
  exit
fi
rcfiles="/usr/bin/getmail"
for file in $HOME/.getmail/config/* ; do
  rcfiles="$rcfiles --rcfile $file"
done
date -u > $HOME/.getmail/running
eval "$rcfiles $@"
rm $HOME/.getmail/running

像下面这样配置它。

$ sudo chmod 755 /usr/local/bin/getmails
$ mkdir -m 0700 $HOME/.getmail
$ mkdir -m 0700 $HOME/.getmail/config
$ mkdir -m 0700 $HOME/.getmail/log

为每个 POP3 帐户创建配置文件 "$HOME/.getmail/config/pop3_name" 如下。

[retriever]
type = SimplePOP3SSLRetriever
server = pop.example.com
username =  pop3_name@example.com
password = secret

[destination]
type = MDA_external
path = /usr/bin/maildrop
unixfrom = True

[options]
verbose = 0
delete = True
delivered_to = False
message_log = ~/.getmail/log/pop3_name.log

像下面这样配置它。

$ chmod 0600 $HOME/.getmail/config/*

计划使用 cron(8) 每 15 分钟运行 "/usr/local/bin/getmails",通过执行 "sudo crontab -e -u <user_name>" 并将以下内容添加到用户的 cron 条目中。

5,20,35,50 * * * * /usr/local/bin/getmails --quiet
[Tip] 提示

POP3 访问的问题可能并非来自 getmail。 一些流行的免费 POP3 服务可能违反了 POP3 协议,并且它们的垃圾邮件过滤器可能不完善。 例如,它们可能在接收到 RETR 命令后,在接收到 DELE 命令之前就删除了邮件,并且可能将邮件隔离到垃圾邮件邮箱中。 您应该通过配置它们来存档已访问的邮件而不是删除它们,从而最大限度地减少损失。 另请参阅 “某些邮件未被下载”

6.5.2. fetchmail 配置

fetchmail(1) 的配置由 "/etc/default/fetchmail"、"/etc/fetchmailrc" 和 "$HOME/.fetchmailrc" 设置。 请参阅 "/usr/share/doc/fetchmail/examples/fetchmailrc.example" 中的示例。

6.6. 邮件投递代理 (MDA) 与过滤器

大多数 MTA 程序,例如 postfixexim4,都充当 MDA(邮件投递代理)。 还有具有过滤功能的专用 MDA。

虽然 procmail(1) 一直是 GNU/Linux 上带过滤器的 MDA 的事实标准,但作者现在更喜欢 maildrop(1)。 无论使用何种过滤实用程序,将系统配置为将过滤后的邮件投递到 qmail 风格的 Maildir 都是一个好主意。

表 6.10. MDA 与过滤器列表

软件包 popcon 大小 描述
procmail http://qa.debian.org/popcon.php?package=procmail 368 带过滤器的 MDA(旧)
mailagent http://qa.debian.org/popcon.php?package=mailagent 1201 带 Perl 过滤器的 MDA
maildrop http://qa.debian.org/popcon.php?package=maildrop 1221 具有结构化过滤语言的 MDA

6.6.1. maildrop 配置

maildrop(1) 的配置在 maildropfilter 文档中描述。 这是 "$HOME/.mailfilter" 的配置示例。

# Local configuration
MAILROOT="$HOME/Mail"
# set this to /etc/mailname contents
MAILHOST="example.dom"
logfile $HOME/.maildroplog

# rules are made to override the earlier value by the later one.

# mailing list mails ?
if (     /^Precedence:.*list/:h || /^Precedence:.*bulk/:h )
{
    # rules for mailing list mails
    # default mailbox for mails from mailing list
    MAILBOX="Inbox-list"
    # default mailbox for mails from debian.org
    if ( /^(Sender|Resent-From|Resent-Sender): .*debian.org/:h )
    {
        MAILBOX="service.debian.org"
    }
    # default mailbox for mails from bugs.debian.org (BTS)
    if ( /^(Sender|Resent-From|Resent-sender): .*@bugs.debian.org/:h )
    {
        MAILBOX="bugs.debian.org"
    }
    # mailbox for each properly maintained mailing list with "List-Id: foo" or "List-Id: ...<foo.bar>"
    if ( /^List-Id: ([^<]*<)?([^<>]*)>?/:h )
    {
        MAILBOX="$MATCH2"
    }
}
else
{
    # rules for non-mailing list mails
    # default incoming box
    MAILBOX="Inbox-unusual"
    # local mails
    if ( /Envelope-to: .*@$MAILHOST/:h )
    {
        MAILBOX="Inbox-local"
    }
    # html mails (99% spams)
    if ( /DOCTYPE html/:b ||\
         /^Content-Type: text\/html/ )
    {
        MAILBOX="Inbox-html"
    }
    # blacklist rule for spams
    if ( /^X-Advertisement/:h ||\
         /^Subject:.*BUSINESS PROPOSAL/:h ||\
         /^Subject:.*URGENT.*ASISSTANCE/:h ||\
         /^Subject: *I NEED YOUR ASSISTANCE/:h )
    {
        MAILBOX="Inbox-trash"
    }
    # whitelist rule for normal mails
    if ( /^From: .*@debian.org/:h ||\
         /^(Sender|Resent-From|Resent-Sender): .*debian.org/:h ||\
         /^Subject: .*(debian|bug|PATCH)/:h )
    {
        MAILBOX="Inbox"
    }
    # whiltelist rule for BTS related mails
    if ( /^Subject: .*Bug#.*/:h ||\
         /^(To|Cc): .*@bugs.debian.org/:h )
    {
        MAILBOX="bugs.debian.org"
    }
    # whitelist rule for getmails cron mails
    if ( /^Subject: Cron .*getmails/:h )
    {
        MAILBOX="Inbox-getmails"
    }
}

# check existance of $MAILBOX
`test -d $MAILROOT/$MAILBOX`
if ( $RETURNCODE == 1 )
{
    # create maildir mailbox for $MAILBOX
    `maildirmake $MAILROOT/$MAILBOX`
}
# deliver to maildir $MAILBOX
to "$MAILROOT/$MAILBOX/"
exit
[Warning] 警告

procmail 不同,maildrop 不会自动创建缺失的 maildir 目录。 您必须提前使用 maildirmake(1) 手动创建它们,如 "$HOME/.mailfilter" 示例中所示。

6.6.2. procmail 配置

这是使用 "$HOME/.procmailrc" 为 procmail(1) 提供的类似配置。

MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/Inbox/
LOGFILE=$MAILDIR/Maillog
# clearly bad looking mails: drop them into X-trash and exit
:0
* 1^0 ^X-Advertisement
* 1^0 ^Subject:.*BUSINESS PROPOSAL
* 1^0 ^Subject:.*URGENT.*ASISSTANCE
* 1^0 ^Subject: *I NEED YOUR ASSISTANCE
X-trash/

# Delivering mailinglist messages
:0
* 1^0 ^Precedence:.*list
* 1^0 ^Precedence:.*bulk
* 1^0 ^List-
* 1^0 ^X-Distribution:.*bulk
{
:0
* 1^0 ^Return-path:.*debian-devel-admin@debian.or.jp
jp-debian-devel/

:0
* ^Resent-Sender.*debian-user-request@lists.debian.org
debian-user/

:0
* ^Resent-Sender.*debian-devel-request@lists.debian.org
debian-devel/

:0
* ^Resent-Sender.*debian-announce-request@lists.debian.org
debian-announce

:0
mailing-list/
}

:0
Inbox/

6.6.3. 重新投递 mbox 内容

如果您的主目录已满且 procmail(1) 失败,您需要手动将邮件从 "/var/mail/<username>" 投递到您主目录中已排序的邮箱。 在主目录中创建磁盘空间后,运行以下命令。

# /etc/init.d/${MAILDAEMON} stop
# formail -s procmail </var/mail/<username>
# /etc/init.d/${MAILDAEMON} start

6.7. POP3/IMAP4 服务器

如果您要在 LAN 上运行私有服务器,您可以考虑运行 POP3 / IMAP4 服务器,以便将邮件投递到 LAN 客户端。

表 6.11. POP3/IMAP4 服务器列表

软件包 popcon 大小 类型 描述
qpopper http://qa.debian.org/popcon.php?package=qpopper 684(*) POP3 Qualcomm 增强型 BSD POP3 服务器
courier-pop http://qa.debian.org/popcon.php?package=courier-pop 108 POP3 Courier 邮件服务器 - POP3 服务器(仅限 maildir 格式)
ipopd http://qa.debian.org/popcon.php?package=ipopd 169 POP3 华盛顿大学 POP2 和 POP3 服务器
cyrus-pop3d http://qa.debian.org/popcon.php?package=cyrus-pop3d 21 POP3 Cyrus 邮件系统 (POP3 支持)
xmail http://qa.debian.org/popcon.php?package=xmail 688 POP3 ESMTP/POP3 邮件服务器
courier-imap http://qa.debian.org/popcon.php?package=courier-imap 539 IMAP Courier 邮件服务器 - IMAP 服务器(仅限 maildir 格式)
uw-imapd http://qa.debian.org/popcon.php?package=uw-imapd 221 IMAP 华盛顿大学 IMAP 服务器
cyrus-imapd http://qa.debian.org/popcon.php?package=cyrus-imapd 21 IMAP Cyrus 邮件系统 (IMAP 支持)

6.8. 打印服务器和实用程序

在旧的类 Unix 系统中,BSD 行式打印机守护程序是标准。 由于自由软件的标准打印输出格式在类 Unix 系统上是 PostScript,因此某些过滤器系统与 Ghostscript 一起使用,以实现向非 PostScript 打印机打印。

最近,通用 UNIX 打印系统 (CUPS) 是新的事实标准。 CUPS 使用 Internet 打印协议 (IPP)。 IPP 现在已被其他操作系统(如 Windows XP 和 Mac OS X)支持,并已成为具有双向通信功能的远程打印的新的跨平台事实标准。

Debian 系统上应用程序的标准可打印数据格式是 PostScript (PS),它是一种页面描述语言。 PS 格式的数据被馈送到 Ghostscript PostScript 解释器,以生成特定于打印机的可打印数据。 请参阅 第 11.3.1 节,“Ghostscript”

感谢 CUPS 系统的文件格式依赖型自动转换功能,只需将任何数据馈送到 lpr 命令即可生成预期的打印输出。(在 CUPS 中,可以通过安装 cups-bsd 软件包来启用 lpr。)

Debian 系统有一些用于打印服务器和实用程序的值得注意的软件包。

表 6.12. 打印服务器和实用程序列表

软件包 popcon 大小 端口 描述
lpr http://qa.debian.org/popcon.php?package=lpr 460 打印机 (515) BSD lpr/lpd (行式打印机守护程序)
lprng http://qa.debian.org/popcon.php?package=lprng 2764 , , ,,(增强)
cups http://qa.debian.org/popcon.php?package=cups 4287 IPP (631) Internet 打印 CUPS 服务器
cups-client http://qa.debian.org/popcon.php?package=cups-client 557 , , CUPS 的 System V 打印机命令lp(1)lpstat(1)lpoptions(1)cancel(1)lpmove(8)lpinfo(8)lpadmin(8)、…
cups-bsd http://qa.debian.org/popcon.php?package=cups-bsd 158 , , CUPS 的 BSD 打印机命令lpr(1)lpq(1)lprm(1)lpc(8)
cups-driver-gutenprint http://qa.debian.org/popcon.php?package=cups-driver-gutenprint 21 不适用 CUPS 的打印机驱动程序

[Tip] 提示

您可以通过将 Web 浏览器指向 "http://localhost:631/" 来配置 CUPS 系统。

6.9. 远程访问服务器和实用程序 (SSH)

安全 Shell (SSH) 是通过 Internet 连接的安全方式。 免费版本的 SSH 称为 OpenSSH,在 Debian 中以 openssh-clientopenssh-server 软件包的形式提供。

表 6.13. 远程访问服务器和实用程序列表

软件包 popcon 大小 工具 描述
openssh-client http://qa.debian.org/popcon.php?package=openssh-client 2246 ssh(1) 安全 shell 客户端
openssh-server http://qa.debian.org/popcon.php?package=openssh-server 701 sshd(8) 安全 shell 服务器
ssh-askpass-fullscreen http://qa.debian.org/popcon.php?package=ssh-askpass-fullscreen 24 ssh-askpass-fullscreen(1) 要求用户输入 ssh-add 的密码短语 (GNOME2)
ssh-askpass http://qa.debian.org/popcon.php?package=ssh-askpass 156 ssh-askpass(1) 要求用户输入 ssh-add 的密码短语 (plain X)

[Caution] 警告

如果您的 SSH 可以从 Internet 访问,请参阅 第 4.7.3 节,“Internet 的额外安全措施”

[Tip] 提示

请使用 screen(1) 程序,使远程 shell 进程能够在连接中断后继续运行(请参阅 第 9.1 节,“screen 程序”)。

6.9.1. SSH 基础知识

[Warning] 警告

如果希望运行 OpenSSH 服务器,则 "/etc/ssh/sshd_not_to_be_run" 必须不存在。

SSH 有两种身份验证协议。

表 6.14. SSH 身份验证协议和方法列表

SSH 协议 SSH 方法 描述
SSH-1 "RSAAuthentication" 基于 RSA 身份密钥的用户身份验证
, , "RhostsAuthentication" 基于 ".rhosts" 的主机身份验证(不安全,已禁用)
, , "RhostsRSAAuthentication" 基于 ".rhosts" 的主机身份验证,与 RSA 主机密钥结合使用(已禁用)
, , "ChallengeResponseAuthentication" RSA 质询-响应身份验证
, , "PasswordAuthentication" 基于密码的身份验证
SSH-2 "PubkeyAuthentication" 基于公钥的用户身份验证
, , "HostbasedAuthentication" 基于 "~/.rhosts" 或 "/etc/hosts.equiv" 的主机身份验证,与公钥客户端主机身份验证结合使用(已禁用)
, , "ChallengeResponseAuthentication" 质询-响应身份验证
, , "PasswordAuthentication" 基于密码的身份验证

[Caution] 警告

如果您使用的是非 Debian 系统,请注意这些差异。

有关详细信息,请参阅 "/usr/share/doc/ssh/README.Debian.gz"、ssh(1)sshd(8)ssh-agent(1)ssh-keygen(1)

以下是关键的配置文件。

表 6.15. SSH 配置文件列表

配置文件 配置文件的描述
/etc/ssh/ssh_config SSH 客户端默认设置,请参阅 ssh_config(5)
/etc/ssh/sshd_config SSH 服务器默认设置,请参阅 sshd_config(5)
~/.ssh/authorized_keys 客户端用于连接到此 SSH 服务器上此帐户的默认公共 SSH 密钥
~/.ssh/identity 用户的秘密 SSH-1 RSA 密钥
~/.ssh/id_rsa 用户的秘密 SSH-2 RSA 密钥
~/.ssh/id_dsa 用户的秘密 SSH-2 DSA 密钥

[Tip] 提示

有关如何使用公共和秘密 SSH 密钥的信息,请参阅 ssh-keygen(1)ssh-add(1)ssh-agent(1)

[Tip] 提示

务必通过测试连接来验证设置。 如果出现任何问题,请使用 "ssh -v"。

[Tip] 提示

您可以稍后使用 "ssh-keygen -p" 更改密码短语以加密本地秘密 SSH 密钥。

[Tip] 提示

您可以将选项添加到 "~/.ssh/authorized_keys" 中的条目,以限制主机和运行特定命令。 有关详细信息,请参阅 sshd(8)

以下是从客户端启动 ssh(1) 连接。

表 6.16. SSH 客户端启动示例列表

命令 描述
ssh username@hostname.domain.ext 以默认模式连接
ssh -v username@hostname.domain.ext 以默认模式连接,并显示调试消息
ssh -1 username@hostname.domain.ext 强制使用 SSH 版本 1 连接
ssh -1 -o RSAAuthentication=no -l username hostname.domain.ext 强制使用 SSH 版本 1 的密码
ssh -o PreferredAuthentications=password -l username hostname.domain.ext 强制使用 SSH 版本 2 的密码

如果您在本地和远程主机上使用相同的用户名,则可以消除键入 "username@"。 即使您在本地和远程主机上使用不同的用户名,也可以使用 "~/.ssh/config" 来消除它。 对于帐户名为 "foo-guest" 的 Debian Alioth 服务,您将 "~/.ssh/config" 设置为包含以下内容。

Host alioth.debian.org svn.debian.org git.debian.org
    User foo-guest

对于用户而言,ssh(1) 的功能类似于更智能、更安全的 telnet(1)。 与 telnet 命令不同,ssh 命令不会在 telnet 转义字符(初始默认 CTRL-])上崩溃。

6.9.2. 用于 SMTP/POP3 隧道传输的端口转发

要建立一个管道,通过 sshlocalhost 的端口 4025 连接到 remote-server 的端口 25,并将 localhost 的端口 4110 连接到 remote-server 的端口 110,请在本地主机上执行以下操作。

# ssh -q -L 4025:remote-server:25 4110:remote-server:110 username@remote-server

这是通过 Internet 连接到 SMTP/POP3 服务器的安全方法。 将远程主机的 "/etc/ssh/sshd_config" 中的 "AllowTcpForwarding" 条目设置为 "yes"。

6.9.3. 无需远程密码即可连接

可以通过使用 "RSAAuthentication" (SSH-1 协议) 或 "PubkeyAuthentication" (SSH-2 协议) 来避免记住远程系统的密码。

在远程系统上,在 "/etc/ssh/sshd_config" 中设置相应的条目 "RSAAuthentication yes" 或 "PubkeyAuthentication yes"。

在本地生成身份验证密钥,并通过以下方式在远程系统上安装公钥。

  • "RSAAuthentication":用于 SSH-1 的 RSA 密钥(已弃用,因为它已被取代。)

$ ssh-keygen
$ cat .ssh/identity.pub | ssh user1@remote "cat - >>.ssh/authorized_keys"
  • "PubkeyAuthentication":用于 SSH-2 的 RSA 密钥

$ ssh-keygen -t rsa
$ cat .ssh/id_rsa.pub | ssh user1@remote "cat - >>.ssh/authorized_keys"
  • "PubkeyAuthentication":用于 SSH-2 的 DSA 密钥(已弃用,因为它速度慢。)

$ ssh-keygen -t dsa
$ cat .ssh/id_dsa.pub | ssh user1@remote "cat - >>.ssh/authorized_keys"
[Tip] 提示

建议不要将 DSA 密钥用于 SSH-2,因为密钥较小且速度较慢。 自 RSA 专利到期以来,没有更多理由使用 DSA 来规避 RSA 专利。 DSA 代表 数字签名算法 且速度较慢。 另请参阅 DSA-1571-1

[Note] 注意

为了使 "HostbasedAuthentication" 在 SSH-2 中工作,您必须在服务器主机上的 "/etc/ssh/sshd_config" 和客户端主机上的 "/etc/ssh/ssh_config" 或 "~/.ssh/config" 中将 "HostbasedAuthentication" 的设置调整为 "yes"。

6.9.4. 处理非本机的 SSH 客户端

有一些免费的 SSH 客户端可用于其他平台。

表 6.17. 其他平台的免费 SSH 客户端列表

环境 免费 SSH 程序
Windows puTTY (http://www.chiark.greenend.org.uk/~sgtatham/putty/) (GPL)
Windows (cygwin) cygwin 中的 SSH (http://www.cygwin.com/) (GPL)
Macintosh Classic macSSH (http://www.macssh.com/) (GPL)
Mac OS X OpenSSH;在终端应用程序中使用 ssh (GPL)

6.9.5. 设置 ssh-agent

使用密码短语保护您的 SSH 身份验证密钥更安全。 如果未设置密码短语,请使用 "ssh-keygen -p" 进行设置。

使用基于密码的连接到远程主机(如上所述),将您的公共 SSH 密钥(例如 "~/.ssh/id_rsa.pub")放入远程主机上的 "~/.ssh/authorized_keys" 中。

$ ssh-agent bash
$ ssh-add ~/.ssh/id_rsa
Enter passphrase for /home/<username>/.ssh/id_rsa:
Identity added: /home/<username>/.ssh/id_rsa (/home/<username>/.ssh/id_rsa)

从现在开始,下一个命令不需要远程密码。

$ scp foo <username>@remote.host:foo

按 ^D 终止 ssh-agent 会话。

对于 X 服务器,正常的 Debian 启动脚本将 ssh-agent 作为父进程执行。 因此,您只需要执行一次 ssh-add。 有关更多信息,请阅读 ssh-agent(1)ssh-add(1)

6.9.6. 如何在 SSH 上关闭远程系统

您需要使用 at(1) 命令(请参阅 第 9.5.13 节,“一次性计划任务”)保护执行 "shutdown -h now" 的进程(请参阅 第 1.1.8 节,“如何关闭系统”)免受 SSH 终止的影响,方法如下。

# echo "shutdown -h now" | at now

screen(1)(请参阅 第 9.1 节,“screen 程序”)会话中运行 "shutdown -h now" 是另一种执行相同操作的方法。

6.9.7. SSH 故障排除

如果您遇到问题,请检查配置文件的权限,并使用 "-v" 选项运行 ssh

如果您是 root 用户并且在防火墙方面遇到问题,请使用 "-P" 选项; 这可以避免使用服务器端口 1 — 1023。

如果到远程站点的 ssh 连接突然停止工作,则可能是系统管理员进行调整的结果,最可能是系统维护期间 "host_key" 的更改。 在确保是这种情况并且没有人试图通过某些巧妙的黑客手段伪造远程主机之后,可以通过删除本地主机上 "~/.ssh/known_hosts" 中的 "host_key" 条目来重新建立连接。

6.10. 其他网络应用程序服务器

以下是其他网络应用程序服务器。


通用 Internet 文件系统协议 (CIFS) 与 服务器消息块 (SMB) 协议相同,并且被 Microsoft Windows 广泛使用。

[Tip] 提示

有关服务器系统集成的更多信息,请参阅 第 4.5.2 节,“现代集中式系统管理”

[Tip] 提示

主机名解析通常由 DNS 服务器提供。 对于由 DHCP 动态分配的主机 IP 地址,可以按照 Debian wiki 上的 DDNS 页面中的描述,使用 bind9isc-dhcp-server 设置 动态 DNS 以进行主机名解析。

[Tip] 提示

与使用包含完整 Debian 存档内容的本地镜像服务器相比,使用代理服务器(如 squid)在节省带宽方面效率更高。

6.11. 其他网络应用程序客户端

以下是其他网络应用程序客户端。

表 6.19. 网络应用程序客户端列表

软件包 popcon 大小 协议 描述
netcat http://qa.debian.org/popcon.php?package=netcat 40 TCP/IP TCP/IP 瑞士军刀
openssl http://qa.debian.org/popcon.php?package=openssl 1079 SSL 安全套接字层 (SSL) 二进制文件和相关加密工具
stunnel4 http://qa.debian.org/popcon.php?package=stunnel4 445 , , 通用 SSL 包装器
telnet http://qa.debian.org/popcon.php?package=telnet 200 TELNET TELNET 客户端
telnet-ssl http://qa.debian.org/popcon.php?package=telnet-ssl 260 , , ,,(SSL 支持)
nfs-common http://qa.debian.org/popcon.php?package=nfs-common 700 NFS Unix 文件共享
smbclient http://qa.debian.org/popcon.php?package=smbclient 41911 SMB MS Windows 文件和打印机共享客户端
smbfs http://qa.debian.org/popcon.php?package=smbfs 7 , , 用于远程 MS Windows 文件的 mount 和 umount 命令
ftp http://qa.debian.org/popcon.php?package=ftp 145 FTP FTP 客户端
lftp http://qa.debian.org/popcon.php?package=lftp 1720 , , , ,
ncftp http://qa.debian.org/popcon.php?package=ncftp 1233 , , 全屏 FTP 客户端
wget http://qa.debian.org/popcon.php?package=wget 2162 HTTPFTP Web 下载器
curl http://qa.debian.org/popcon.php?package=curl 335 , , , ,
axel http://qa.debian.org/popcon.php?package=axel 212 , , 加速下载器
aria2 http://qa.debian.org/popcon.php?package=aria2 4873 , , 具有 BitTorrentMetalink 支持的加速下载器
bind9-host http://qa.debian.org/popcon.php?package=bind9-host 175 DNS host(1) 来自 bind9,"Priority: standard"
dnsutils http://qa.debian.org/popcon.php?package=dnsutils 374 , , dig(1) 来自 bind,"Priority: standard"
isc-dhcp-client http://qa.debian.org/popcon.php?package=isc-dhcp-client 1776 DHCP 获取 IP 地址
ldap-utils http://qa.debian.org/popcon.php?package=ldap-utils 685 LDAP 从 LDAP 服务器获取数据

6.12. 系统守护程序的诊断

telnet 程序允许手动连接到系统守护程序及其诊断。

为了测试普通的 POP3 服务,请尝试以下操作

$ telnet mail.ispname.net pop3

为了测试某些 ISP 的 TLS/SSL 启用的 POP3 服务,您需要通过 telnet-sslopenssl 软件包使用 TLS/SSL 启用的 telnet 客户端。

$ telnet -z ssl pop.gmail.com 995
$ openssl s_client -connect pop.gmail.com:995

以下 RFC 提供了每个系统守护程序所需的知识。

表 6.20. 常用 RFC 列表

RFC 描述
rfc1939rfc2449 POP3 服务
rfc3501 IMAP4 服务
rfc2821 (rfc821) SMTP 服务
rfc2822 (rfc822) 邮件文件格式
rfc2045 多用途 Internet 邮件扩展 (MIME)
rfc819 DNS 服务
rfc2616 HTTP 服务
rfc2396 URI 定义

端口使用情况在 "/etc/services" 中描述。