第 6 章 网络应用

# 第 6 章 网络应用

建立网络连接后（参加 第 5 章 网络设置），你可以运行各种网络应用。

| 提示
对于现代的 Debian 网络基础设施的具体说明，阅读 Debian 管理员手册 —— 网络基础设施。

| 提示
在某些 ISP 下，如果你启用“两步验证”，你可能需要获取一个应用密码以从你的程序访问 POP 和 SMTP 服务。你也可能需要事先允许你的主机 IP 进行访问。

## 6.1. 网页浏览器

有许多网页浏览器软件包，使用超文本传输协议（HTTP）访问远程内容。

表 6.1. 网页浏览器列表

软件包 | 流行度 | 大小 | 类型 | 网络浏览器说明
--- | --- | --- | --- | ---
`chromium` | V:30, I:103 | 286985 | X | Chromium，（来自 Google 的开源浏览器）
`firefox` | V:15, I:21 | 277820 | 同上 | Firefox，（来自 Mozilla 的开源浏览器，仅在 Debian Unstable 中可用）
`firefox-esr` | V:214, I:442 | 266490 | 同上 | Firefox ESR（Firefox 延长支持版本）
`epiphany-browser` | V:2, I:11 | 2258 | 同上 | GNOME，兼容 HIG，Epiphany
`konqueror` | V:27, I:116 | 7861 | 同上 | KDE，Konqueror
`dillo` | V:0, I:4 | 1585 | 同上 | Dillo，（基于 FLTK 的轻量级浏览器）
`w3m` | V:11, I:145 | 2853 | 文本 | w3m
`lynx` | V:29, I:457 | 1972 | 同上 | Lynx
`elinks` | V:2, I:16 | 1791 | 同上 | ELinks
`links` | V:2, I:21 | 2321 | 同上 | Links（纯文本）
`links2` | V:0, I:10 | 5466 | 图像 | Links（没有 X 的控制台图像）

### 6.1.1. 伪装用户代理字符串

为了访问一些过度限制的网站，你可能需要伪装网页浏览器程序返回的 User-Agent 字符串。参见：

- MDN Web Docs: userAgent
- Chrome Developers: Override the user agent string
- How to change your user agent
- How to Change User-Agent in Chrome, Firefox, Safari, and more
- How to Change Your Browser’s User Agent Without Installing Any Extensions
- How to change the User Agent in Gnome Web (epiphany)

| 小心
伪装的用户代理字符串可以会导致 来自 Java 的不良副作用。

### 6.1.2. 浏览器扩展

所有现代的 GUI（图形用户界面）浏览器支持基于 browser extension 的源代码，它在按 web extensions 变成标准化。

## 6.2. 邮件系统

本章节关注于消费者级互联网连接的典型的移动工作站。

| 小心
如果你想设置邮件服务器来直接通过互联网交换邮件，你应该最好阅读一下这个基本文档。

### 6.2.1. 电子邮件基础

电子邮件 由三个部分组成，消息的信封，邮件头及邮件正文。

- SMTP 用电子邮件信封上的 "To" 和 "From" 信息来投递邮件。(信封上的 "From" 信息也被叫做退回地址, 例如 From_ 等等）。

- 电子邮件头的"To" 和 "From" 信息，显示在 电子邮件客户端上. (在大部分情况下，这些信息是跟电子邮件信封一致，但并不全是这样。）

- 覆盖邮件头和正文数据的电子邮件消息格式被 多用途互联网邮件扩展 (MIME) 扩展，从纯文本的 ASCII 到其它字符编码，包括作为附件的音频、视频、图像和应用程序。

功能全面的基于 电子邮件客户端的 GUI 程序使用基于 GUI 的直观的配置，提供下列所有功能。

- 为了处理正文数据类型及其编码，它创建和使用多用途互联网邮件扩展 (MIME)来解释邮件标头和邮件正文。

- 它使用旧的 基础访问认证 或现代的 OAuth 2.0向 ISP（互联网服务提供商）的 SMTP 和 IMAP 服务器认证它自己。 (对于 OAuth 2.0,通过桌面环境设置来设置它，例如，"Settings" -> "Online Accounts".)

- 它发送消息到 ISP 的智能主机的 SMTP 服务监听的消息递交端口（587）。

- 从 TLS/IMAP4 端口（993）接收存储在 ISP 的服务器上的消息。

- 它能够通过他们的属性过滤邮件。

- 它能够提供额外的功能：联系人、日历、任务、备忘录。

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

软件包 | 流行度 | 大小 | 类型
--- | --- | --- | ---
`evolution` | V:28, I:240 | 492 | X GUI program (GNOME, groupware suite)
`thunderbird` | V:46, I:109 | 274692 | X GUI 程序 (GTK， Mozilla Thunderbird)
`kmail` | V:43, I:107 | 25212 | X GUI 程序 (KDE)
`mutt` | V:11, I:94 | 7118 | 很有可能与 `vim` 一起使用的字符终端程序
`mew` | V:0, I:0 | 2319 | `(x)emacs` 下的字符终端程序

### 6.2.2. 现代邮件服务限制

现代邮件服务器有一些限制来最小化暴露滥用（不希望和未被要求的电子邮件）问题。

- 在消费者级的网络上运行 SMTP 服务器来直接可靠的发送邮件到远端主机是不现实的。

- 一个邮件能够被任何主机静悄悄的拒绝，即使路由到了目的地，除非它尽可能看起来是经过认证的。

- 期望单个智能主机可靠的发送不相关的源邮件地址到远程主机，这是不现实的。

这是因为：

- 从消费者级网络提供的主机连接到互联网的 SMTP 端口（25）已经被封锁了。

- 从互联网的 SMTP 端口（25）连接到消费者级网络提供的主机已经被封锁了。

- 从消费者级网络提供的主机发出到互联网的消息，只能够通过消息递交端口（587）发送。

- 像域名密钥识别邮件 (DKIM)、发信者策略框架 (SPF) 和 基于域名的消息认证、报告和反应（DMARC） 这样的反垃圾邮件技术广泛用于电子邮件过滤。

- 域名密钥识别邮件服务可能会用于你的通过 smarthost 的电子邮件发送。

- 智能主机可以在邮件头重写源电子邮件地址为你的邮件账户，来阻止电子邮件欺诈。

### 6.2.3. 历史邮件服务端期望

一些在 Debian 上的程序，它们默认期望访问 `/usr/sbin/sendmail` 命令来发送邮件，或者从一个个性化设置的 UNIX 系统邮件服务器来发送邮件，实现历史的功能：

- 邮件是由纯文本文件创建。

- 邮件是由 `/usr/sbin/sendmail` 命令处理。

- 对于目的地址为同一主机，`/usr/sbin/sendmail` 命令进行邮件的本地分发，将邮件附在 `/var/mail/$username` 文件后。

  - 期望这个特征的命令： `apt-listchanges`, `cron`, `at`, ...

- 对于目的地址在远程主机，`/usr/sbin/sendmail` 命令远程传输邮件到目的主机，使用 SMTP 发现 DNS MX 记录。

  - 期望这个特征的命令：`popcon`, `reportbug`, `bts`, ...

### 6.2.4. 邮件传输代理 (MTA)

在 Debian 12 Bookworm 后，在没有 mail transfer agent (MTA) 程序的情况下，Debian 移动工作站可以基于 电子邮件客户端，配置为全功能的 GUI （图像用户界面）。

以往的 Debian 会安装某个 MTA 程序来支持期望 `/usr/sbin/sendmail` 命令的程序。移动工作站上这样的 MTA 必须和 第 6.2.2 节 “现代邮件服务限制” 第 6.2.3 节 “历史邮件服务端期望” 协同工作。

对于移动工作站，典型的 MTA 选择是 `exim4-daemon-light` 或 `postfix`，并选择类似这样的安装选项：“Mail sent by smarthost; received via SMTP or fetchmail”。这些是轻量 MTA 和 "`/etc/aliases`" 匹配。

| 提示
配置 `exim4` 来发送互联网邮件，多个源电子邮件地址使用多个相应的智能主机，这是不寻常的。如果一些程序需要这样的能力，使用 `msmtp` 来设置他们，它比较容易来设置多个源电子邮件地址。然后给主 MTA 仅仅保留单个电子邮件地址。

表 6.3. 基础的邮件传输代理相关的软件包列表

软件包 | 流行度 | 大小 | 说明
--- | --- | --- | ---
`exim4-daemon-light` | V:219, I:226 | 1649 | Exim4 邮件传输代理 (MTA : Debian 默认的)
`exim4-daemon-heavy` | V:5, I:5 | 1814 | Exim4 邮件传输代理 (MTA : 灵活的替代品)
`exim4-base` | V:225, I:231 | 1646 | Exim4 文档 (文本) 和通用文件
`exim4-doc-html` | I:1 | 3798 | Exim4 文档 (html)
`exim4-doc-info` | I:0 | 648 | Exim4 文档 (info)
`postfix` | V:106, I:112 | 4003 | Postfix 邮件传输代理 (MTA : 安全的替代品)
`postfix-doc` | I:4 | 4841 | Postfix 文档 (html+text)
`sasl2-bin` | V:4, I:10 | 368 | Cyrus SASL API 实现 (实现 postfix SMTP 认证)
`cyrus-sasl2-doc` | I:0 | 2142 | Cyrus SASL - 文档
`msmtp` | V:7, I:13 | 811 | 轻量 MTA
`msmtp-mta` | V:5, I:7 | 136 | 轻量 MTA (sendmail 兼容扩展到`msmtp`)
`esmtp` | V:0, I:0 | 123 | 轻量 MTA
`esmtp-run` | V:0, I:0 | 27 | 轻量 MTA(sendmail 兼容扩展到`esmtp`)
`nullmailer` | V:7, I:8 | 483 | 部分功能 MTA，没有本地邮件
`ssmtp` | V:4, I:6 | 133 | 部分功能 MTA，没有本地邮件
`sendmail-bin` | V:10, I:11 | 1959 | 全功能 MTA(如果你已经对它熟悉)
`courier-mta` | V:0, I:0 | 2674 | 全功能 MTA(web 接口等.)
`git-email` | V:0, I:10 | 1187 | `git-send-email`(1) 发送系列补丁邮件程序

#### 6.2.4.1. exim4 的配置

对于那些通过 smarthost 的网络邮件，你应该按如下所示的 (重新) 配置 `exim4-*` 软件包。

    $ sudo systemctl stop exim4
    $ sudo dpkg-reconfigure exim4-config

配置 "General type of mail configuration" 时，选择 "mail sent by smarthost; received via SMTP or fetchmail"。

设置 "System mail name:" 为默认的 FQDN (参见第 5.1.1 节 “主机名解析”)。

设置 "IP-addresses to listen on for incoming SMTP connections:" 为默认的 "127.0.0.1; ::1"。

"Other destinations for which mail is accepted:" 选项留空。

"Machines to relay mail for:" 选项留空。

设置 "IP address or host name of the outgoing smarthost:" 为 "smtp.hostname.dom:587"。

设置 "Hide local mail name in outgoing mail?" 选项为 "NO"。(或者像第 6.2.4.3 节 “邮件地址配置”描述的那样使用 `/etc/email-addresses`" 代替)

选择如下所示的其中一个来回答 "Keep number of DNS-queries minimal (Dial-on-Demand)?"。

- "No" 如果启动的时候，系统就连上了互联网。

- "Yes" 如果启动的时候，系统没有连上互联网。

设置 "Delivery method for local mail:" 选项为 "mbox format in /var/mail/"。

"Split configuration into small files?:" 选项设为 "Yes"。

通过修改 "`/etc/exim4/passwd.client`" 文件，来创建用于 smarthost 的密码条目。

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

配置 `exim4`(8)，在 "`/etc/default/exim4`" 文件中写入 "`QUEUERUNNER='queueonly'`"，"`QUEUERUNNER='nodaemon'`" 等等，来最小化系统资源使用。（可选的）

通过如下所示的启动 `exim4`。

    $ sudo systemctl start exim4

"`/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`" 来设置宏命令和修改 "`/etc/exim4/exim4.conf.template`" 文件。(没有分割的配置）

  - 在 ”`/etc/exim4/exim4.conf.d`" 子目录中创建新文件或编辑已存在的文件。(分割的配置）

- 运行 "`systemctl reload exim4`".

| 小心
如果 debconf 询问 "Keep number of DNS-queries minimal (Dial-on-Demand)?" 这个问题时，选择 了 "No" (默认值)，那么启动 `exim4` 会花很长时间并且系统在启动的时候不会连接到互联网。

请阅读 "`/usr/share/doc/exim4-base/README.Debian.gz`" 官方指导和 `update-exim4.conf`(8)。

| 警告
从所有的实践考虑，使用带 STARTTLS 的 SMTP 端口 587，或者 SMTPS (SSL 之上的 SMTP ) 端口 465, 代替纯 SMTP 端口 25。

#### 6.2.4.2. 带有 SASL 的 postfix 配置

对于通过 smarthost 的网络邮件，你应该首先阅读 postfix 文档和关键的手册页。

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

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

你应该按如下所示的 (重新) 配置 `postfix` 和 `sasl2-bin` 软件包。

    $ sudo systemctl stop postfix
    $ sudo dpkg-reconfigure postfix

选择 "Internet with smarthost"。

设置 "SMTP relay host (blank for none):" 为 "`[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

为 smarthost 创建密码条目。

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

通过如下所示的启动 `postfix`。

    $ sudo systemctl start postfix

`dpkg-reconfigure` 会话中使用的 "`[`" 和 "`]`" 和 "`/etc/postfix/sasl_passwd`" 确保不去检查 MX 记录而是直接使用指定的明确主机名。参见 "`/usr/share/doc/postfix/html/SASL_README.html`" 里面的 "Enabling SASL authentication in the Postfix SMTP client" 条目。

#### 6.2.4.3. 邮件地址配置

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

表 6.5. 与邮件地址相关的配置文件列表

文件 | 功能 | 应用
--- | --- | ---
`/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` 都是安全有效的选择。)

| 提示
"`/etc/mailname`" 中的内容被许多非 MTA 程序用作它们的默认行为。对于 `mutt`, 在`~/muttrc` 文件中设置 "`hostname`" 和 "`from`" 变量来覆盖 mailname 值。对于 `devscripts` 软件包的程序，例如 `bts`(1) 和 `dch`(1)，导出环境变量 "`$DEBFULLNAME`" 和 "`$DEBEMAIL`" 的值来覆盖它。

| 提示
`popularity-contest` 软件包一般以 FQDN 形式的 root 账户发送邮件。你需要像 `/usr/share/popularity-contest/default.conf` 文件中描述的那样去设置 `/etc/popularity-contest.conf` 文件中的 `MAILFROM` 值。否则，你的邮件会被 smarthost 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` 选项。

| 提示
Exim 带有一些有用的程序，例如 `exiqgrep`(8) 和 `exipick`(8)。参见 "`dpkg -L exim4-base|grep man8/`" 来获得可用的命令。

#### 6.2.4.4. 基础 MTA 操作

这里有一些基础的 MTA 操作。有一些可能会通过 `sendmail`(1) 的兼容性接口来实现。

表 6.6. 基础 MTA 操作列表

exim 命令 | postfix 命令 | 说明
--- | --- | ---
`sendmail` | `sendmail` | 从标准输入读取邮件并且安排投递 (`-bm`)
`mailq` | `mailq` | 列出带有状态和队列 ID 的邮件队列 (`-bq`)
`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` | 移除所有邮件

| 提示
往 "`/etc/ppp/ip-up.d/*`" 里写一个刷新所有邮件的脚本会是个不错的主意。

## 6.3. 服务器远程访问和工具 (SSH)

Secure SHell (SSH) 是因特网上的 安全 连接方式。在 Debian 里面，有一个叫 OpenSSH 的免费 SSH 版本，在 `openssh-client` 和 `openssh-server` 包里。

对于用户来讲, `ssh`(1) 功能比`telnet`(1) 更加智能和安全. 不像 `telnet`命令, `ssh` 命令不会在遇到 `telnet` 的退出字符(初始默认是 CTRL-])时停止.

表 6.7. 服务器远程访问和工具列表

软件包 | 流行度 | 大小 | 工具 | 说明
--- | --- | --- | --- | ---
`openssh-client` | V:898, I:996 | 5133 | `ssh`(1) | SSH 客户端
`openssh-server` | V:745, I:804 | 3502 | `sshd`(8) | SSH 服务端
`ssh-askpass` | I:17 | 103 | `ssh-askpass`(1) | 请求用户输入 ssh-add 密码 (简单的 X)
`ssh-askpass-gnome` | V:0, I:3 | 215 | `ssh-askpass-gnome`(1) | 请求用户输入 ssh-add 密码 (GNOME)
`ssh-askpass-fullscreen` | V:0, I:0 | 41 | `ssh-askpass-fullscreen`(1) | 请求用户输入 ssh-add 密码 (GNOME)，有更好看的界面
`shellinabox` | V:0, I:1 | 525 | `shellinaboxd`(1) | 浏览器访问 VT100 终端模拟器 网页服务器

虽然 `shellinabox` 不是一个 SSH 程序，它列在这里作为远程终端访问的一个有趣的替代。

连接到远程 X 客户端程序，参见：第 7.9 节 “X 服务端连接”。

| 小心
如果你的 SSH 是从因特网来访问，参见 第 4.6.3 节 “互联网额外的安全方式”。

| 提示
请使用 `screen`(1) 程序来让远程 shell 在中断的连接上存活(参见 第 9.1.2 节 “screen 程序”).

### 6.3.1. SSH 基础

OpenSSH SSH 后台守护进程（daemon）只支持 SSH 2协议。

请阅读 "`/usr/share/doc/openssh-client/README.Debian.gz`"、 `ssh`(1)、 `sshd`(8)、 `ssh-keygen`(1)、 `ssh-add`(1) 和 `ssh-agent`(1).

| 警告
如果想要运行 OpenSSH 服务，"`/etc/ssh/sshd_not_to_be_run`"必须不存在。 不要打开基于 rhost 的认证( `/etc/ssh/sshd_config` 中的 `HostbasedAuthentication` )。

表 6.8. SSH 配置文件列表

配置文件 | 配置文件描述
--- | ---
`/etc/ssh/ssh_config` | SSH 客户端默认, 参见 `ssh_config`(5)
`/etc/ssh/sshd_config` | SSH 服务端默认, 参见 `sshd_config`(5)
`~/.ssh/authorized_keys` | 该账户连接到这个服务器上的客户端使用的默认 SSH 公钥
`~/.ssh/id_rsa` | 用户的 SSH-2 RSA 私钥
`~/.ssh/id_key-type-name` | 用户的 SSH-2 密钥， key-type-name 为 `ecdsa`、 `ed25519` 等

从客户端启动一个 `ssh`(1) 连接.

表 6.9. SSH 客户端启动例子列表

命令 | 说明
--- | ---
`ssh username@hostname.domain.ext` | 使用默认模式连接
`ssh -v username@hostname.domain.ext` | 有详细信息的默认连接模式
`ssh -o PreferredAuthentications=password username@hostname.domain.ext` | SSH 2 版本，强制使用密码
`ssh -t username@hostname.domain.ext passwd` | 在远程主机上运行 `passwd` 命令来更新密码

### 6.3.2. 远程主机上的用户名

如果你在本地和远程主机上使用相同的用户名，你能够省略输入"`username@`"。

即使在本地和远程主机使用不同的用户名，你可以使用 "`~/.ssh/config`" 来省略输入用户名.对于 Debian Salsa 服务器，使用账户名 "`foo-guest`",你可以设置 "`~/.ssh/config`" 包含下面的内容。

    Host salsa.debian.org people.debian.org
    User foo-guest

### 6.3.3. 免密码远程连接

使用"`PubkeyAuthentication`" (SSH-2 协议)，人们可以避免记住远程系统的密码.

在远程系统的"`/etc/ssh/sshd_config`"里，设置相应的条目, "`PubkeyAuthentication yes`"。

在本地生成授权秘钥对，并安装公钥到远程系统。

    $ ssh-keygen -t rsa
    $ cat .ssh/id_rsa.pub | ssh user1@remote "cat - >>.ssh/authorized_keys"

你可以在 "`~/.ssh/authorized_keys`" 里给条目增加选项来限制主机和运行特定的命令。参见 `sshd`(8)"AUTHORIZED_KEYS FILE FORMAT" 。

### 6.3.4. 处理其它 SSH 客户端

其它平台上有一些免费的 SSH 客户端。

表 6.10. 其它平台上免费 SSH 客户端列表

环境 | 免费 SSH 程序
--- | ---
Windows | puTTY (PuTTY：一个自由的 SSH 、Telnet 客户端) (GPL)
Windows (cygwin) | cygwin 里的 SSH(Cygwin: Get that Linux feeling - on Windows) (GPL)
Mac OS X | OpenSSH;在终端应用中使用 `ssh` (GPL)

### 6.3.5. 建立 ssh 代理

用密码来保护你的 SSH 认证私钥是安全的。如果密码没有设置，使用 "`ssh-keygen -p`" 来设置。

把你的公钥 (比如："`~/.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 代理会话。

对于 X 服务端，通常的 Debian 启动脚本会作为父进程执行 `ssh-agent`。所以你只需要执行一次 `ssh-add`。进一步的信息，请阅读 `ssh-agent`(1) 和 `ssh-add`(1).

### 6.3.6. 从远程主机发送邮件

如果你在一个正确设置 了DNS 的服务器上有一个 SSH shell 账号，你能够将在你本地工作站上生成的邮件，作为远程服务器上的邮件，真正的从远程服务器上发送。

    $ ssh username@example.org /usr/sbin/sendmail -bm -ti -f "username@example.org" < mail_data.txt

### 6.3.7. SMTP/POP3 隧道的端口转发

通过 `ssh` 建立一个这样的管道连接，从 `localhost` 的 4025 端口到 `remote-server` 的 25 端口，并从 `localhost` 的 4110 端口到 `remote-server` 的 110 端口，请在本机执行如下命令.

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

这是跨越因特网建立 SMTP/POP3 服务连接的安全方法。在远程主机"`/etc/ssh/sshd_config`"里设置"`AllowTcpForwarding`"条目为 "`yes`".

### 6.3.8. 怎样通过 SSH 关闭远程系统

你可以使用 `at`(1) 命令 (参见 第 9.4.13 节 “单次任务时间安排”)来从 SSH 终端里保护"`shutdown -h now`" (参见 第 1.1.8 节 “怎样关闭系统”)操作过程。

    # echo "shutdown -h now" | at now

在 `screen`(1) (参见 第 9.1.2 节 “screen 程序”) 会话里运行 "`shutdown -h now`"，是另外一个方法来做这同样的事情。

### 6.3.9. SSH 故障排查

如果你遇到问题，检查配置文件的权限并用 "`-v`" 选项运行 `ssh`。

如果你是 root 账户，并有使用防火墙，使用 "`-p`" 选项; 这可以避免使用1 — 1023 之间的服务端口.

如果 `ssh` 连接到远程站点突然停止工作，这也许是系统管理员胡乱操作的结果，可能是在系统维护时改变了 "`host_key`". 在确认这个情况后，并且没有人试图用聪明的黑客技术来篡改远程主机，你可以在本机 "`~/.ssh/known_hosts`" 里删除 "`host_key`" 条目来重新获得连接。

## 6.4. 打印服务和工具

在老的类 Unix 系统中，BSD Line printer daemon(lpd) 行打印机后台守护 曾经是标准。传统的自由软件的标准打印输出格式是 PostScript (PS)。为了能够打印到非 PostScript 打印机，需要将一些过滤器系统和 Ghostscript 一道使用。参见 第 11.4.1 节 “Ghostscript”。

在现代的 Debian 系统中，Common UNIX Printing System 通用 UNIX 打印系统是事实上的标准。现代自由软件的标准打印输出格式是 Portable Document Format (PDF)可移植文件格式。

The CUPS uses Internet Printing Protocol (IPP). The IPP is the cross-platform de facto standard for remote printing with bi-directional communication capability.

幸亏有 CUPS 系统的文件格式依赖自动转化特征，简单的发送任何数据到 `lpr` 命令，都将产生期望的打印输出。(在 CUPS 里, `lpr` 能够通过安装 `cups-bsd` 软件包来获取.)

Debian 系统有一些不错的软件包用于打印服务和作为打印工具。

表 6.11. 打印服务和工具列表

软件包 | 流行度 | 大小 | 端口 | 说明
--- | --- | --- | --- | ---
`lpr` | V:2, I:2 | 378 | printer (515) | BSD lpr/lpd (线性打印机后台守护进程 daemon)
`cups` | V:118, I:460 | 1092 | IPP (631) | 互联网打印 CUPS 服务器
`cups-client` | V:137, I:474 | 433 | 同上 | 用于 CUPS 的 System V 打印机命令: `lp`(1), `lpstat`(1), `lpoptions`(1), `cancel`(1), `lpmove`(8), `lpinfo`(8), `lpadmin`(8), …
`cups-bsd` | V:36, I:194 | 131 | 同上 | 用于 CUPS 的 BSD 打印机命令: `lpr`(1), `lpq`(1), `lprm`(1), `lpc`(8)
`printer-driver-gutenprint` | V:13, I:61 | 1122 | 没有使用 | CUPS 打印机驱动

| 提示
你可以让你的 web 浏览器访问 "http://localhost:631/" 来配置 CUPS 系统。

## 6.5. 其它网络应用服务

这里是其它网络应用服务。

表 6.12. 其它网络应用服务列表

软件包 | 流行度 | 大小 | 协议 | 说明
--- | --- | --- | --- | ---
`telnetd` | V:0, I:1 | 51 | TELNET | TELNET 服务
`nfs-kernel-server` | V:45, I:54 | 797 | NFS | Unix 文件共享
`samba` | V:106, I:121 | 5011 | SMB | Windows 文件和打印共享
`netatalk` | V:0, I:1 | 814 | ATP | Apple/Mac 文件和打印共享(AppleTalk)
`proftpd-basic` | V:4, I:10 | 452 | FTP | 通用文件下载
`apache2` | V:186, I:227 | 586 | HTTP | 通用 web 服务器
`squid` | V:9, I:10 | 9349 | 同上 | 通用 web 代理服务器
`bind9` | V:35, I:39 | 888 | DNS | 其它主机的 IP 地址
`isc-dhcp-server` | V:15, I:25 | 6102 | DHCP | 客户端自身的 IP 地址

通用互联网文件系统协议(CIFS) 和服务消息块(SMB) 协议一样，被微软 Windows 广泛应用。

| 提示
参见 第 4.5.2 节 “现代的集中式系统管理” 服务系统集成。

| 提示
主机名解析通常由 DNS 服务提供. 对于由 DHCP 动态分配的主机 IP 地址, 动态 DNS 能够使用 `bind9` 和`isc-dhcp-server` 建立主机名解析，Debian wiki 的 DDNS 页 有说明.

| 提示
使用 `squid` 之类的代理服务器，和使用 Debian 文档库的完全本地镜像服务器相比，能够大量节省带宽。

## 6.6. 其它网络应用客户端

这里是其它网络应用客户端。

表 6.13. 网络应用客户端列表

软件包 | 流行度 | 大小 | 协议 | 说明
--- | --- | --- | --- | ---
`netcat-traditional` | V:46, I:904 | 139 | TCP/IP | TCP/IP 瑞士军刀
`netcat-openbsd` | V:21, I:121 | 109 | TCP/IP | 支持 IPv6、代理和 Unix 套接字的 TCP/IP 瑞士军刀
`openssl` | V:834, I:995 | 2503 | SSL | 安全套接字层 (SSL)二进制和相关的加密工具
`stunnel4` | V:6, I:9 | 573 | 同上 | 通用 SSL 封装
`telnet` | V:12, I:239 | 51 | TELNET | TELNET 客户端
`nfs-common` | V:145, I:199 | 1137 | NFS | Unix 文件共享
`smbclient` | V:27, I:209 | 2106 | SMB | 微软 Windows 文件和打印共享客户端
`cifs-utils` | V:31, I:118 | 351 | 同上 | 远程微软 Windows 文件系统挂载和卸载命令
`wget` | V:191, I:982 | 3784 | HTTP 和 FTP | web 下载工具
`curl` | V:227, I:684 | 507 | 同上 | 同上
`transmission-gtk` | V:13, I:178 | 6245 | BitTorrent | BitTorrent client (GTK)
`transmission-qt` | V:0, I:2 | 6203 | 同上 | BitTorrent client (Qt)
`ktorrent` | V:1, I:5 | 5167 | 同上 | BitTorrent client (Qt)
`qbittorrent` | V:9, I:22 | 14384 | 同上 | BitTorrent client (Qt)
`bind9-host` | V:121, I:940 | 140 | DNS | 来自 bind9 的 `host`(1), "`Priority: standard`"
`dnsutils` | I:174 | 23 | 同上 | 来自 bind 的 `dig`(1), "`Priority: standard`"
`isc-dhcp-client` | V:169, I:707 | 2884 | DHCP | 获得 IP 地址
`ldap-utils` | V:10, I:58 | 789 | LDAP | 从 LDAP 服务获取数据

## 6.7. 系统后台守护进程（daemon）诊断

`telnet` 程序能够手工连接到系统后台守护进程（daemon），并进行诊断。

测试纯 POP3 服务，尝试用下面的操作

    $ telnet mail.ispname.net pop3

部分 ISP 提供 TLS/SSL 加密的POP3 服务，为了测试它，你需要用到 `telnet-ssl` 包里支持 TLS/SSL 的 `telnet` 客户端，或 `openssl` 软件包。

    $ telnet -z ssl pop.gmail.com 995

    $ openssl s_client -connect pop.gmail.com:995

下面的 RFCs 提供每一个系统后台守护进程（daemon）所需要的知识。

表 6.14. 常用 RFC 列表

RFC | 说明
--- | ---
rfc1939 和 rfc2449 | POP3 服务
rfc3501 | IMAP4 服务
rfc2821 (rfc821) | SMTP 服务
rfc2822 (rfc822) | 邮件文件格式
rfc2045 | 多用途互联网邮件扩展 (MIME)
rfc819 | DNS 服务
rfc2616 | HTTP 服务
rfc2396 | URI 定义

在 "`/etc/services`" 里，描述了端口用途.

第 5 章 网络设置 |  | 第 7 章 GUI（图形用户界面）系统