章 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 (plain 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/ssh/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@`"。

如果本地和遠端主機，使用同樣的使用者名稱，你可以省略輸入 "`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（圖形使用者介面）系統