Ubuntu 完整 SSH 设置指南:安装、强化安全、进阶配置与故障排除

目次

1. 介绍

在 Ubuntu 上配置 SSH 对于管理远程服务器至关重要。SSH(Secure Shell)是一种提供安全加密通信的协议,允许用户远程访问服务器、执行命令并传输文件。

本文解释了如何在 Ubuntu 上配置 SSH,从基本安装步骤到高级安全措施。

1.1 为什么在 Ubuntu 上配置 SSH?

1.1.1 什么是 SSH?

SSH(Secure Shell)是一种在网络上实现安全通信的协议。它通常用于登录远程服务器、传输文件以及隧道(端口转发)。与传统的 Telnet 或 FTP 不同,SSH 会加密所有通信,提供强大的安全性。

1.1.2 何时在 Ubuntu 上需要 SSH

SSH 用于远程管理 Ubuntu 的常见场景包括:

  • 云服务器管理:AWS、GCP、Vultr 等上的 Linux 服务器通常通过 SSH 访问。
  • 局域网环境中的远程操作:远程访问内部服务器或开发机器。
  • 管理 IoT 设备:远程控制嵌入式系统,例如 Raspberry Pi。

默认情况下,Ubuntu 上的 SSH 服务器是禁用的,因此必须手动安装并配置以启用 SSH 访问。

2. 基本 SSH 配置

要在 Ubuntu 上使用 SSH,您必须安装 SSH 服务器(OpenSSH)并正确配置它。本节解释了如何安装 SSH、调整基本设置、配置防火墙以及连接到服务器。

2.1 安装并启动 OpenSSH

2.1.1 什么是 OpenSSH?

OpenSSH(Open Secure Shell)是 SSH 协议的开源实现。它支持远程连接、安全文件传输(SCP 和 SFTP)以及端口转发。

2.1.2 安装 OpenSSH

Ubuntu 默认不包含 SSH 服务器,因此使用以下命令安装它:

sudo apt update && sudo apt install -y openssh-server

此命令会更新软件包列表并安装 OpenSSH 服务器。

2.1.3 启动 SSH 并启用自动启动

安装后,启动 SSH 服务器并启用自动启动:

sudo systemctl enable --now ssh

enable 选项确保操作系统启动时 SSH 会自动启动。

2.1.4 检查 SSH 状态

验证 SSH 是否正在运行:

systemctl status ssh

如果输出显示 active (running),则 SSH 运行正常:

● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2025-02-28 12:00:00 UTC; 5min ago

如果显示 inactive (dead)failed,则手动启动 SSH:

sudo systemctl start ssh

2.2 配置防火墙(UFW)

Ubuntu 包含一个简单的防火墙称为 ufw(Uncomplicated Firewall)。您必须允许通过它进行 SSH 连接。

2.2.1 检查 UFW 状态

sudo ufw status

示例输出(未激活):

Status: inactive

示例输出(已激活):

Status: active
To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere

2.2.2 允许 SSH

sudo ufw allow ssh

或明确指定:

sudo ufw allow 22/tcp

2.2.3 启用 UFW

sudo ufw enable

2.2.4 验证 UFW 规则

sudo ufw status verbose

示例:

Status: active
To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)

2.3 基本 SSH 连接方法

一旦 SSH 运行,您就可以从客户端机器连接。

2.3.1 从 Linux/macOS 连接

ssh username@server-ip-address

示例:

ssh user@192.168.1.100

首次连接时,您可能会看到安全警告:

The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)?

输入 yes 以继续。

2.3.2 从 Windows 连接

您可以使用 PowerShellPuTTY

使用 PowerShell(Windows 10+ 包含 SSH):

ssh username@server-ip-address

使用 PuTTY

  1. 官方网站下载 PuTTY。
  2. 打开 PuTTY 并在 Host Name (or IP address) 中输入服务器 IP。
  3. 将连接类型选择为 SSH
  4. 点击 Open 并登录

结论

本节介绍了在 Ubuntu 上设置 SSH 的基础内容:

  • 如何安装并启动 OpenSSH
  • 如何使用 UFW 允许 SSH 连接
  • 如何从 Linux/macOS 和 Windows 连接

3. 加强 SSH 安全

SSH 功能强大,但保持默认设置会增加安全风险。攻击者常常尝试暴力登录或端口扫描。加强 SSH 安全至关重要。

3.1 禁用 Root 登录

Root 登录提供完整的系统控制,是攻击者的主要目标。禁用它可以提升安全性。

3.1.1 步骤

  1. 编辑 SSH 配置文件:
    sudo nano /etc/ssh/sshd_config
    
  1. 将该行更改为:
    PermitRootLogin no
    
  1. 重启 SSH:
    sudo systemctl restart ssh
    
  1. 确认更改:
    sudo grep PermitRootLogin /etc/ssh/sshd_config
    

如果输出为 PermitRootLogin no,则表示已应用该设置。

3.2 禁用密码认证并使用密钥认证

公钥认证比密码更安全,并降低暴力攻击的风险。

3.2.1 创建 SSH 密钥

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa

这将生成两个文件:

  • id_rsa(私钥) — 本地保存,切勿共享
  • id_rsa.pub(公钥) — 上传到服务器

3.2.2 上传公钥

ssh-copy-id username@server-ip-address

3.2.3 禁用密码认证

sudo nano /etc/ssh/sshd_config

编辑:

PasswordAuthentication no

重启 SSH:

sudo systemctl restart ssh

3.3 仅允许特定用户访问 SSH

为了提升 SSH 安全性,您可以限制访问,仅允许特定用户登录。

3.3.1 配置步骤

  1. 打开 SSH 配置文件 /etc/ssh/sshd_config
    sudo nano /etc/ssh/sshd_config
    
  1. 添加允许通过 SSH 访问的用户:
    AllowUsers username1 username2
    
  1. 重启 SSH 以应用设置:
    sudo systemctl restart ssh
    

3.4 更改 SSH 端口

由于端口 22 常被攻击者盯上,更改默认端口可以提升安全性。

3.4.1 配置步骤

  1. 打开 SSH 配置文件:
    sudo nano /etc/ssh/sshd_config
    
  1. 修改端口设置,例如:
    Port 2200
    
  1. 重启 SSH:
    sudo systemctl restart ssh
    

3.4.2 更新防火墙设置

如果更改端口,需要更新 UFW:

sudo ufw allow 2200/tcp

检查新规则:

sudo ufw status

3.5 使用 Fail2Ban 防止暴力攻击

Fail2Ban 检测登录失败并在指定时间内阻止攻击 IP。

3.5.1 安装 Fail2Ban

sudo apt install fail2ban -y

3.5.2 创建配置文件

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

打开文件:

sudo nano /etc/fail2ban/jail.local

修改设置:

[sshd]
enabled = true
port = 2200
maxretry = 3
findtime = 600
bantime = 3600

3.5.3 重启 Fail2Ban

sudo systemctl restart fail2ban

3.5.4 检查封禁列表

sudo fail2ban-client status sshd

结论

本节解释了加强 SSH 安全性的方法:

  • 禁用 root 登录
  • 禁用密码认证并启用密钥认证
  • 限制 SSH 访问仅限特定用户
  • 更改 SSH 端口
  • 使用 Fail2Ban 阻止未授权尝试

实施这些设置有助于创建安全的 SSH 环境。

4. 高级 SSH 配置

在完成基本的 SSH 配置和安全加固后,您可以继续使用高级功能,以提升灵活性和安全性。本节涵盖 ssh.socket 管理(Ubuntu 22.10+)、SSH 隧道、多端口监听以及基于 IP 的访问控制。

4.1 在 Ubuntu 22.10+ 上使用 ssh.socket

在 Ubuntu 22.10+ 中,SSH 可能由 ssh.socket 而非 ssh.service 管理。这种基于套接字的激活仅在需要时启动 SSH,节省系统资源。

4.1.1 检查 ssh.socket 状态

sudo systemctl status ssh.socket

示例输出(已启用):

● ssh.socket - OpenSSH Server Socket
   Loaded: loaded (/lib/systemd/system/ssh.socket; enabled; vendor preset: enabled)
   Active: active (listening) since Fri 2025-02-28 12:00:00 UTC

4.1.2 启用或禁用 ssh.socket

启用套接字:

sudo systemctl enable --now ssh.socket

切换回传统的 ssh.service

sudo systemctl disable --now ssh.socket
sudo systemctl enable --now ssh.service

4.2 SSH 隧道(端口转发)

SSH 隧道在本地和远程系统之间建立安全的通信通道。

4.2.1 本地端口转发

用于安全连接远程数据库或内部服务。

示例:访问端口 3306 上的远程 MySQL 服务器

ssh -L 3306:localhost:3306 username@server-ip-address

4.2.2 反向端口转发

通过远程服务器公开本地服务。

示例:在远程端口 8080 上发布本地 Web 服务器

ssh -R 8080:localhost:80 username@server-ip-address

4.2.3 动态端口转发(SOCKS 代理)

使用 SSH 作为 SOCKS 代理进行匿名浏览。

ssh -D 1080 username@server-ip-address

4.3 多端口监听

SSH 可以监听多个端口,以适应不同网络环境的灵活性。

4.3.1 配置步骤

  1. 编辑 /etc/ssh/sshd_config
    sudo nano /etc/ssh/sshd_config
    
  1. 添加多行 Port
    Port 22
    Port 2200
    
  1. 重启 SSH:
    sudo systemctl restart ssh
    
  1. 使用 UFW 允许新端口:
    sudo ufw allow 2200/tcp
    

4.4 仅允许特定 IP 地址访问 SSH

通过 IP 地址限制 SSH 访问可提供强大的安全控制。

4.4.1 配置 /etc/hosts.allow

sudo nano /etc/hosts.allow

添加允许的 IP 地址:

sshd: 192.168.1.100

4.4.2 配置 /etc/hosts.deny

sudo nano /etc/hosts.deny

拒绝所有其他访问:

sshd: ALL

结论

本节涵盖了高级 SSH 配置主题:

  • 在 Ubuntu 22.10+ 中管理 ssh.socket
  • 使用 SSH 隧道(端口转发)
  • 多端口监听 SSH
  • 限制 SSH 访问仅限特定 IP 地址

应用这些配置可提升安全性和可用性。

5. SSH 故障排除

即使配置正确,SSH 连接有时仍会失败。本节解释常见的 SSH 问题及其解决方案。

5.1 当 SSH 无法连接

如果 SSH 返回 Connection refused 或超时,可能的原因包括服务问题、端口配置错误或防火墙限制。

5.1.1 SSH 服务未运行

sudo systemctl status ssh

解决方案:

  • 如果状态为 inactivefailed,请重启 SSH:
    sudo systemctl restart ssh
    
  • 启用自动启动:
    sudo systemctl enable ssh
    

5.1.2 SSH 端口未打开

ssh -p 2200 username@server-ip-address

检查打开的端口:

sudo netstat -tulnp | grep ssh

或:

ss -tulnp | grep ssh

5.1.3 防火墙 (UFW) 阻止 SSH

sudo ufw status

允许 SSH:

sudo ufw allow 22/tcp

如果使用自定义端口:

sudo ufw allow 2200/tcp

5.2 身份验证错误

5.2.1 用户名或密码错误

ssh username@server-ip-address

5.2.2 公钥未正确安装

cat ~/.ssh/authorized_keys

确认它与本地 id_rsa.pub 匹配。

5.2.3 .ssh 目录权限不正确

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

还要确保:

chmod 755 /home/username

5.3 SSH 连接不稳定或意外断开

5.3.1 调整 ClientAliveInterval

ClientAliveInterval 60
ClientAliveCountMax 3
sudo systemctl restart ssh

5.3.2 调整本地客户端设置

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

5.4 查看 SSH 日志

5.4.1 实时查看日志

sudo journalctl -u ssh -f

5.4.2 查看历史日志

sudo cat /var/log/auth.log | grep ssh
sudo grep "Failed password" /var/log/auth.log

结论

本节解释了常见的 SSH 问题及其解决方法:

  • 检查 SSH 服务是否正在运行
  • 验证端口是否打开
  • 检查防火墙设置
  • 确保正确的密钥认证
  • 修复超时和断开连接的问题
  • 分析 SSH 日志

大多数 SSH 问题源于配置错误或网络限制。使用这些故障排除步骤可以高效地解决问题。

6. 常见问题解答 (FAQ)

本节回答了与 SSH 使用和配置相关的常见问题。

6.1 如何解决 SSH 超时问题?

6.1.1 服务器端设置

ClientAliveInterval 60
ClientAliveCountMax 3
sudo systemctl restart ssh

6.1.2 客户端设置

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

6.2 如果忘记 SSH 密码该怎么办?

6.2.1 如果您拥有物理访问权限

  1. 进入单用户模式(在 GRUB 中选择 recovery mode
  2. 重置密码:
    passwd username
    
  1. 重启系统

6.2.2 如果无法获得物理访问(云 VPS)

  • 使用托管服务提供的 VPS 控制台
  • 使用公钥认证

6.3 如何在 Windows 上使用 SSH?

6.3.1 使用 PowerShell

ssh username@server-ip-address

6.3.2 使用 PuTTY

  1. 下载并安装 PuTTY
  2. Host Name 中输入服务器 IP 地址
  3. 将连接类型选择为 SSH
  4. 使用用户名和密码登录

6.4 如何在 Ubuntu WSL 上配置 SSH?

6.4.1 安装 SSH 服务器

sudo apt update && sudo apt install openssh-server

6.4.2 修改 SSH 设置

PasswordAuthentication yes

手动启动 SSH(WSL 不使用 systemd):

sudo service ssh start

6.5 其他安全最佳实践

6.5.1 使用 Fail2Ban

sudo apt install fail2ban -y
[sshd]
enabled = true
port = 22
maxretry = 3
findtime = 600
bantime = 3600
sudo systemctl restart fail2ban

6.5.2 更改 SSH 端口

Port 2200
sudo ufw allow 2200/tcp

6.6 如何实时监控 SSH 日志?

sudo journalctl -u ssh -f
sudo cat /var/log/auth.log | grep ssh

6.7 更方便使用 SSH 的技巧

6.7.1 使用 .ssh/config 简化登录

Host myserver
    HostName 192.168.1.100
    User user
    Port 2200
    IdentityFile ~/.ssh/id_rsa

然后使用以下方式连接:

ssh myserver

6.7.2 使用 ssh-agent

eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa

结论

本节总结了与 SSH 相关的常见问题:

  • 如何解决 SSH 超时问题
  • 如何恢复忘记的密码
  • 如何在 Windows 和 WSL 上使用 SSH
  • 安全最佳实践
  • 如何检查 SSH 日志
  • 使用 .ssh/config 提高 SSH 便利性的技巧

通过应用这些技术,您可以构建安全高效的 SSH 环境,并顺畅地管理远程服务器。

侍エンジニア塾