{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2025-07-24 14:20:23","updateBy":"admin","updateTime":"2025-08-31 14:21:34","remark":null,"id":120,"articleTitle":"Linux基础：SSH服务","articleUrl":"service_ssh","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/ee03af4419724d50a127c34d6a588554.png","articleFlag":"0","draftStatus":"1","reprintStatement":"0","articleSummary":"SSH是一个网络协议，用于通过一个**不安全**的网络（如互联网）在两个设备之间提供**安全**的加密通信通道。最常见的用途是远程登录到另一台计算机执行命令和操作。","articleContent":"## SSH：安全远程管理的基石\n\n### 1. SSH 是什么？\n\n*   **SSH**：**S**ecure **Sh**ell 的缩写。\n*   **是什么**：它是一个网络协议，用于通过一个**不安全**的网络（如互联网）在两个设备之间提供**安全**的加密通信通道。最常见的用途是远程登录到另一台计算机执行命令和操作。\n*   **目标**：代替那些以**明文**传输数据（包括密码）的不安全旧协议，如 **Telnet**、**rsh** 和 **FTP**。\n\n#### 为什么需要 SSH？\n\n假设你使用 `telnet` 远程管理服务器，你的用户名、密码以及所有执行的命令都以纯文本形式在网络上传输。任何能截获网络流量的人都可以看到这一切。SSH 通过加密所有通信彻底解决了这个问题，即使数据被截获，没有密钥也无法解密。\n\n### 2. 核心工作原理\n\nSSH 的安全建立在现代加密学之上，主要结合了两种加密技术：\n\n1.  **非对称加密 (Asymmetric Encryption)**：\n    *   使用一对密钥：**公钥 (Public Key)** 和 **私钥 (Private Key)**。\n    *   公钥可以公开分享，用于**加密**数据。\n    *   私钥必须严格保密，用于**解密**用对应公钥加密的数据。\n    *   **作用**：在 SSH 连接初始阶段，用于安全地交换一个**会话密钥**，并验证服务器的身份（防止中间人攻击）。\n\n2.  **对称加密 (Symmetric Encryption)**：\n    *   连接双方使用**同一个密钥**进行加密和解密。\n    *   **作用**：在连接建立后，所有传输的数据都使用这个高效的“会话密钥”进行加密。\n\n**连接建立过程简析**：\n\n1.  **TCP 握手**：客户端连接到服务器的 22 端口。\n2.  **协议与密钥交换**：双方协商使用的 SSH 协议版本和支持的算法。\n3.  **服务器认证**：服务器将其公钥发送给客户端。客户端检查其是否在已知的 `~/.ssh/known_hosts` 文件中，以避免中间人攻击。\n4.  **会话密钥生成**：客户端生成一个会话密钥，并用服务器的公钥加密后发送给服务器。只有拥有私钥的服务器能解密它。\n5.  **用户认证**：现在安全通道已建立，客户端开始通过此通道向服务器证明自己的身份（通常通过密码或密钥对）。\n6.  **数据交互**：认证成功后，双方开始通过加密的通道进行通信。\n\n### 3. 安装与启动 SSH 服务\n\n在绝大多数 Linux 发行版上，SSH 的官方实现是 **OpenSSH**。\n\n#### **在服务端 (Server)**：\n\n你需要安装 `openssh-server` 包来提供 SSH 连接能力。\n\n```bash\n# 在 CentOS 7 / RHEL 7 / Fedora\nsudo yum install openssh-server\n# 或使用 dnf (新版本 Fedora/RHEL)\nsudo dnf install openssh-server\n\n# 在 Debian / Ubuntu\nsudo apt-get update\nsudo apt-get install openssh-server\n\n# 启动 SSH 服务并设置开机自启\nsudo systemctl start sshd    # 启动服务\nsudo systemctl enable sshd   # 启用开机自启\nsudo systemctl status sshd   # 检查服务状态\n```\n\n#### **在客户端 (Client)**：\n\n`openssh-client` 通常已预装在大多数 Linux 和 macOS 系统中。Windows 10/11 后期版本也内置了 OpenSSH 客户端。\n\n如果需要手动安装：\n\n```bash\n# Ubuntu/Debian\nsudo apt-get install openssh-client\n\n# CentOS/RHEL\nsudo yum install openssh-clients\n```\n\n### 4. 基本使用与连接方法\n\n#### 1. 密码认证登录\n\n最基本的方式，使用服务器上的系统用户密码登录。\n\n```bash\nssh username@remote_server_ip\n# 例如： ssh john@192.168.1.100\n# 如果是首次连接，会提示你确认服务器的公钥指纹，输入 'yes' 后继续。\n# 然后输入用户 'john' 在服务器上的密码。\n```\n\n#### 2. 密钥对认证登录 (推荐，更安全)\n\n免密码、更安全的方式。原理是将客户端的**公钥**放入服务器的`~/.ssh/authorized_keys`文件中。\n**步骤**：\n\n1. **在客户端生成密钥对** (如果还没有的话)：\n\n   ```bash\n   ssh-keygen -t rsa -b 4096 -C \"your_email@example.com\" # -t 类型 -b 强度 -C 注释\n   # 一直回车接受默认保存路径 (~/.ssh/id_rsa) 和空密码。\n   # 会生成两个文件： id_rsa (私钥，绝不能分享) 和 id_rsa.pub (公钥)。\n   ```\n\n2. **将公钥上传到服务器**：\n\n   ```bash\n   ssh-copy-id username@remote_server_ip\n   # 输入一次密码，之后即可免密登录。\n   # 手动方法：将 id_rsa.pub 的内容追加到服务器的 ~/.ssh/authorized_keys 文件末尾。\n   ```\n\n3. **使用密钥登录**：\n\n   ```bash\n   ssh username@remote_server_ip # 不再需要输入密码\n   ```\n\n#### 常见连接参数\n\n```bash\n-p 2222\t      # 指定端口（如果服务器SSH端口不是默认的22）\n-i ~/.ssh/my_key  # 指定使用的私钥文件\n-X            # 启用 X11 转发，可以在远程运行图形程序\n-t            # 强制分配伪终端，常用于跳板连接，如 ssh -t user@gateway ssh user@internal\n-v            # 详细模式，输出连接调试信息，用于排错 (-vvv 更详细)\n```\n\n### 5. SSH 服务端配置\n\n配置文件位于 `/etc/ssh/sshd_config`。**修改前务必备份！**\n\n#### 关键安全配置选项：\n\n```bash\n# 修改默认端口，减少自动化攻击，默认为22\nPort 2222\n\n# 禁止 root 用户直接登录，默认为yes\nPermitRootLogin no\n\n# 限制允许登录的用户，空格分隔\nAllowUsers username1 username2\n\n# 是否使用密码认证。建议在配置好密钥后禁用，默认为yes\nPasswordAuthentication no\n\n# 是否允许空密码\nPermitEmptyPasswords no\n\n# 密钥认证是否开启（通常保持 yes）\nPubkeyAuthentication yes\n\n# 登录失败尝试次数\nMaxAuthTries 3\n\n# 客户端连接保活间隔，防止连接断开\nClientAliveInterval 300\nClientAliveCountMax 2\n```\n\n#### 应用配置与故障排除：\n\n```bash\n# 每次修改配置后，必须重启 sshd 服务生效\nsudo systemctl restart sshd\n\n# 检查配置语法是否正确（很有用！）\nsudo sshd -t\n\n# 如果配置错误导致无法连接，请通过物理控制台或VNC登录修复。\n```\n\n## 用户目录下.ssh目录的作用\n\n### 1.核心概述\n\n*   **位置**： `~/.ssh/` （例如： `/home/username/.ssh/` 或 `/root/.ssh/`）\n*   **权限**： 该目录本身必须具有严格的权限，通常为 `700` （`drwx------`）。这意味着只有目录的所有者（即该用户）可以读、写、进入此目录。如果权限过松，SSH 客户端会出于安全考虑拒绝使用其中的密钥。\n*   **所有者**： 必须由相应用户所有。如果你使用 `sudo` 创建或修改了里面的文件，可能需要用 `chown` 命令更改所有者。\n\n### 2.主要文件详解\n\n以下是你在 `.ssh` 目录中可能遇到的常见文件及其作用：\n\n#### **1）`id_rsa` 和 `id_rsa.pub` (最常见)**\n\n*   **`id_rsa`**： **你的私钥 (Private Key)**。\n    *   **作用**： 这是你身份的**根本证明**，相当于一把极其重要的钥匙或你的数字身份证。它用于向 SSH 服务器证明你拥有对应的公钥。\n    *   **安全性**： **此文件必须绝对保密！** 绝不能发送给任何人。它的权限通常应为 `600` （`-rw-------`），即只有用户自己可读可写。\n*   **`id_rsa.pub`**： **你的公钥 (Public Key)**。\n    *   **作用**： 这是从私钥派生出来的、可以公开分享的部分。它的内容需要添加到你想登录的**远程服务器**上的 `~/.ssh/authorized_keys` 文件中。\n    *   **安全性**： 这个文件可以随意分发，没有安全风险。即使别人得到它，也无法反向推导出你的私钥。\n\n**生成命令**： `ssh-keygen -t rsa`\n\n#### **2）`authorized_keys`**\n\n* **作用**： 这是 SSH **服务端**上最重要的文件之一。它存储了一个被授权可以通过 SSH 登录到**本账户**的所有用户的**公钥列表**（每行一个公钥）。\n\n* **工作流程**： 当你尝试用密钥登录时，服务器会检查你的公钥是否存在于这个文件中。如果存在，它会用该公钥验证你发来的签名（由你的私钥生成），验证通过则允许登录。\n\n* **权限**： 此文件权限也必须严格，通常为 `600`。权限过宽会导致 SSH 服务器出于安全原因拒绝使用它。\n\n* **如何填充**： 通常使用 `ssh-copy-id` 命令自动将你的公钥追加到远程服务器的此文件中。\n\n  ```bash\n  ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_server\n  ```\n\n#### **3）`known_hosts`**\n\n*   **作用**： 这是 SSH **客户端**用来记录你曾经连接过的所有服务器的公钥指纹的文件。它主要用于防止**中间人攻击 (Man-in-the-Middle Attack)**。\n*   **工作流程**：\n    1.  你第一次连接到一个新服务器时，SSH 客户端会显示服务器的公钥指纹并询问你是否信任它。\n    2.  如果你输入 `yes`，该服务器的 hostname/IP 及其公钥就会保存在这个文件中。\n    3.  下次连接时，客户端会比对接收到的公钥和此文件中存储的公钥。如果不同，就会发出**严重警告**，提示你服务器身份可能发生了变化（可能是被攻击，也可能是服务器重装了系统）。\n*   **格式**： 每行一条记录，包含服务器地址、加密算法和公钥。\n\n#### **4）`config`**\n\n* **作用**： SSH 客户端的**配置文件**，用于为不同的主机创建别名和预设连接参数，极大简化命令行操作。\n\n* **示例**：\n\n  ```bash\n  # ~/.ssh/config\n  Host myserver1\n      HostName server1.example.com\n      User john\n      Port 2222\n      IdentityFile ~/.ssh/myserver1_key\n  \n  Host github.com\n      User git\n      IdentityFile ~/.ssh/github_key\n  ```\n\n  *   配置后，你不再需要输入冗长的命令 `ssh -p 2222 -i ~/.ssh/myserver1_key john@server1.example.com`，只需输入 `ssh myserver1`。\n  *   同样，执行 `ssh github.com` 时会自动使用 `git` 用户和指定的密钥。\n\n#### **5）其他常见密钥对**\n\nSSH 支持多种加密算法，因此你可能会看到其他名称的密钥对：\n\n*   **`id_ed25519` 和 `id_ed25519.pub`**： 使用 Ed25519 算法生成的密钥对。比 RSA 更安全、更快速，是当前的新标准。生成命令： `ssh-keygen -t ed25519`\n*   **`id_ecdsa` 和 `id_ecdsa.pub`**： 使用 ECDSA 算法生成的密钥对。也比传统的 RSA 更优。\n\n#### **6）其他文件**\n\n*   **`*.pem`， `*.cer`， `*.crt`**： 可能是其他格式的证书或密钥文件，有时用于某些特定的 SSH 认证场景或与云服务（如 AWS）交互。\n\n### 3.总结与权限参考\n\n| 文件/目录                | 作用                                            | 推荐权限 (八进制) | 推荐权限 (字符) |\n| :----------------------- | :---------------------------------------------- | :---------------- | :-------------- |\n| `~/.ssh/`                | SSH 配置和密钥目录                              | `700`             | `drwx------`    |\n| `~/.ssh/id_rsa`          | **私钥** (你的身份证明，绝密！)                 | `600`             | `-rw-------`    |\n| `~/.ssh/id_rsa.pub`      | **公钥** (可公开，用于添加到远程服务器)         | `644`             | `-rw-r--r--`    |\n| `~/.ssh/authorized_keys` | 存储**允许访问本账户**的远程公钥列表 (服务器端) | `600`             | `-rw-------`    |\n| `~/.ssh/known_hosts`     | 存储已认证的**服务器**公钥指纹 (客户端)         | `644`             | `-rw-r--r--`    |\n| `~/.ssh/config`          | SSH 客户端配置文件                              | `600`             | `-rw-------`    |\n\n## SSH 相关命令大全：从连接到管理\n\n### 1. 核心连接命令\n\n#### `ssh` - 安全远程登录\n\n最基本的命令，用于建立到远程主机的安全 shell 会话。\n\n**基本语法：**\n\n```bash\nssh [options] [user@]hostname [command]\n```\n\n**常用选项：**\n\n- `-p <port>`：指定远程主机的 SSH 端口（默认 22）\n- `-l <username>`：指定登录用户名\n- `-i <identity_file>`：指定使用的私钥文件\n- `-X`：启用 X11 转发（用于运行图形界面程序）\n- `-Y`：启用可信 X11 转发（较新的实现）\n- `-C`：启用压缩，适用于慢速连接\n- `-v` / `-vv` / `-vvv`：详细模式，用于调试（输出更多信息）\n- `-q`：安静模式，抑制警告和诊断信息\n- `-t`：强制分配伪终端，常用于跳板连接\n\n**示例：**\n\n```bash\n# 基本连接\nssh user@example.com\n\n# 使用特定端口和密钥\nssh -p 2222 -i ~/.ssh/my_key user@example.com\n\n# 连接到服务器并直接执行命令\nssh user@example.com 'ls -l /tmp'\n\n# 启用 X11 转发运行图形程序\nssh -X user@example.com gedit\n\n# 通过跳板机连接内部服务器\nssh -t user@gateway.example.com ssh user@internal.server\n```\n\n### 2. 密钥管理命令\n\n#### `ssh-keygen` - 生成、管理和转换密钥\n\n用于创建新的 SSH 密钥对、更改密钥密码短语或转换密钥格式。\n\n**常用选项：**\n\n- `-t <type>`：指定密钥类型（如 `rsa`, `ed25519`, `ecdsa`）\n- `-b <bits>`：指定密钥长度（如 RSA 的 4096）\n- `-C <comment>`：添加注释（通常是邮箱）\n- `-f <output_file>`：指定输出文件名\n- `-p`：更改现有私钥的密码短语\n- `-N <new_passphrase>`：提供新密码短语\n\n**示例：**\n\n```bash\n# 生成默认的 RSA 密钥（2048 位）\nssh-keygen\n\n# 生成更安全的 4096 位 RSA 密钥\nssh-keygen -t rsa -b 4096\n\n# 生成 Ed25519 密钥（当前推荐）\nssh-keygen -t ed25519 -C \"your_email@example.com\"\n\n# 生成指定名称的密钥\nssh-keygen -f ~/.ssh/my_custom_key\n\n# 更改现有密钥的密码\nssh-keygen -p -f ~/.ssh/id_rsa\n```\n\n#### `ssh-copy-id` - 将公钥安装到远程服务器\n\n将本地公钥添加到远程主机的 `authorized_keys` 文件中，实现免密码登录。\n\n**语法：**\n\n```bash\nssh-copy-id [-i [identity_file]] [user@]hostname\n```\n\n**示例：**\n\n```bash\n# 使用默认密钥 (~/.ssh/id_rsa.pub)\nssh-copy-id user@example.com\n\n# 使用特定密钥\nssh-copy-id -i ~/.ssh/my_key.pub user@example.com\n\n# 指定端口\nssh-copy-id -i ~/.ssh/my_key.pub -p 2222 user@example.com\n```\n\n### 3. 文件传输命令\n\n#### `scp` - 安全复制\n\n基于 SSH 的安全文件传输，语法类似传统的 `cp` 命令。\n\n**语法：**\n\n```bash\nscp [options] source target\n```\n\n**常用选项：**\n\n- `-P <port>`：指定 SSH 端口（注意是大写 P）\n- `-i <identity_file>`：指定私钥文件\n- `-r`：递归复制整个目录\n- `-C`：启用压缩\n- `-v`：详细模式\n\n**示例：**\n\n```bash\n# 复制本地文件到远程服务器\nscp file.txt user@example.com:/remote/directory/\n\n# 从远程服务器复制文件到本地\nscp user@example.com:/remote/file.txt /local/directory/\n\n# 递归复制整个目录\nscp -r /local/directory user@example.com:/remote/parent/\n\n# 使用特定端口和密钥\nscp -P 2222 -i ~/.ssh/my_key file.txt user@example.com:~\n```\n\n#### `sftp` - 安全文件传输协议\n\n交互式文件传输程序，提供类似 FTP 的界面但通过 SSH 加密。\n\n**语法：**\n\n```bash\nsftp [options] [user@]hostname\n```\n\n**常用选项：**\n\n- `-P <port>`：指定端口\n- `-i <identity_file>`：指定私钥\n- `-b <batch_file>`：批处理模式执行命令文件\n\n**示例：**\n\n```bash\n# 启动 SFTP 会话\nsftp user@example.com\n\n# 在 sftp 会话中的常用命令\nsftp> ls              # 列出远程文件\nsftp> lls             # 列出本地文件\nsftp> get file.txt    # 下载文件\nsftp> put file.txt    # 上传文件\nsftp> mkdir new_dir   # 创建远程目录\nsftp> exit            # 退出\n\n# 批处理模式\nsftp -b commands.txt user@example.com\n```\n\n#### `rsync` - 高效文件同步\n\n虽然不是 SSH 专属命令，但常通过 SSH 协议工作，提供高效的文件同步。\n\n**语法：**\n\n```bash\nrsync [options] source destination\n```\n\n**常用选项（与 SSH 结合）：**\n\n- `-e ssh`：指定使用 SSH 作为远程 shell\n- `-a`：归档模式（保留权限、时间戳等）\n- `-z`：压缩传输\n- `-v`：详细输出\n- `--progress`：显示传输进度\n- `--delete`：删除目标中源没有的文件\n\n**示例：**\n\n```bash\n# 通过 SSH 同步本地目录到远程\nrsync -avz -e ssh /local/dir/ user@example.com:/remote/dir/\n\n# 从远程同步到本地\nrsync -avz -e ssh user@example.com:/remote/dir/ /local/dir/\n\n# 使用特定端口\nrsync -avz -e \"ssh -p 2222\" /local/dir/ user@example.com:/remote/dir/\n```\n\n### 4. 端口转发与隧道命令\n\n#### SSH 本地端口转发\n\n将远程服务器上的端口映射到本地计算机。\n\n**语法：**\n\n```bash\nssh -L [local_bind_ip:]local_port:remote_host:remote_port [user@]ssh_server\n```\n\n**示例：**\n\n```bash\n# 将远程 MySQL 服务 (3306) 映射到本地 13306 端口\nssh -L 13306:localhost:3306 user@example.com\n\n# 使用特定绑定 IP（只允许本机访问）\nssh -L 127.0.0.1:13306:localhost:3306 user@example.com\n\n# 转发到其他主机的服务（通过跳板机）\nssh -L 8080:internal.server:80 user@gateway.example.com\n```\n\n#### SSH 远程端口转发\n\n将本地计算机上的端口映射到远程服务器。\n\n**语法：**\n\n```bash\nssh -R [remote_bind_ip:]remote_port:local_host:local_port [user@]ssh_server\n```\n\n**示例：**\n\n```bash\n# 将本地 Web 服务 (80) 映射到远程服务器的 8080 端口\nssh -R 8080:localhost:80 user@example.com\n```\n\n#### SSH 动态端口转发（SOCKS 代理）\n\n创建安全的 SOCKS 代理服务器。\n\n**语法：**\n\n```bash\nssh -D [local_bind_ip:]local_port [user@]ssh_server\n```\n\n**示例：**\n\n```bash\n# 在本地 1080 端口创建 SOCKS 代理\nssh -D 1080 user@example.com\n\n# 指定绑定 IP（允许局域网其他设备使用）\nssh -D 0.0.0.0:1080 user@example.com\n```\n\n### 5. 服务管理命令\n\n#### 管理系统上的 SSH 服务\n\n**启动/停止/重启 SSH 服务：**\n\n```bash\n# Systemd 系统 (CentOS 7+, Ubuntu 16.04+)\nsudo systemctl start sshd    # 启动\nsudo systemctl stop sshd     # 停止\nsudo systemctl restart sshd  # 重启\nsudo systemctl reload sshd   # 重新加载配置（不断开现有连接）\nsudo systemctl status sshd   # 查看状态\nsudo systemctl enable sshd   # 设置开机自启\nsudo systemctl disable sshd  # 禁用开机自启\n\n# 旧版 SysVinit 系统\nsudo service ssh start\nsudo service ssh stop\nsudo service ssh restart\nsudo service ssh status\n```\n\n**检查配置文件语法：**\n\n```bash\nsudo sshd -t\n```\n\n**查看 SSH 服务日志：**\n\n```bash\n# Ubuntu/Debian\ntail -f /var/log/auth.log\n\n# CentOS/RHEL\ntail -f /var/log/secure\n\n# 使用 journalctl (Systemd)\njournalctl -u sshd -f\n```\n\n","categoryId":1,"viewCount":57,"categoryName":"Linux","author":"球接子","authorAvatar":null,"tagIds":[10],"tagNames":["Linux基础"]}}