目次 1 1. 介绍1.1 1.1 为什么在 Ubuntu 上配置 SSH?1.1.1 1.1.1 什么是 SSH?1.1.2 1.1.2 何时在 Ubuntu 上需要 SSH2 2. 基本 SSH 配置2.1 2.1 安装并启动 OpenSSH2.1.1 2.1.1 什么是 OpenSSH?2.1.2 2.1.2 安装 OpenSSH2.1.3 2.1.3 启动 SSH 并启用自动启动2.1.4 2.1.4 检查 SSH 状态2.2 2.2 配置防火墙(UFW)2.2.1 2.2.1 检查 UFW 状态2.2.2 2.2.2 允许 SSH2.2.3 2.2.3 启用 UFW2.2.4 2.2.4 验证 UFW 规则2.3 2.3 基本 SSH 连接方法2.3.1 2.3.1 从 Linux/macOS 连接2.3.2 2.3.2 从 Windows 连接3 结论4 3. 加强 SSH 安全4.1 3.1 禁用 Root 登录4.1.1 3.1.1 步骤4.2 3.2 禁用密码认证并使用密钥认证4.2.1 3.2.1 创建 SSH 密钥4.2.2 3.2.2 上传公钥4.2.3 3.2.3 禁用密码认证4.3 3.3 仅允许特定用户访问 SSH4.3.1 3.3.1 配置步骤4.4 3.4 更改 SSH 端口4.4.1 3.4.1 配置步骤4.4.2 3.4.2 更新防火墙设置4.5 3.5 使用 Fail2Ban 防止暴力攻击4.5.1 3.5.1 安装 Fail2Ban4.5.2 3.5.2 创建配置文件4.5.3 3.5.3 重启 Fail2Ban4.5.4 3.5.4 检查封禁列表5 结论6 4. 高级 SSH 配置6.1 4.1 在 Ubuntu 22.10+ 上使用 ssh.socket6.1.1 4.1.1 检查 ssh.socket 状态6.1.2 4.1.2 启用或禁用 ssh.socket6.2 4.2 SSH 隧道(端口转发)6.2.1 4.2.1 本地端口转发6.2.2 4.2.2 反向端口转发6.2.3 4.2.3 动态端口转发(SOCKS 代理)6.3 4.3 多端口监听6.3.1 4.3.1 配置步骤6.4 4.4 仅允许特定 IP 地址访问 SSH6.4.1 4.4.1 配置 /etc/hosts.allow6.4.2 4.4.2 配置 /etc/hosts.deny7 结论8 5. SSH 故障排除8.1 5.1 当 SSH 无法连接8.1.1 5.1.1 SSH 服务未运行8.1.2 5.1.2 SSH 端口未打开8.1.3 5.1.3 防火墙 (UFW) 阻止 SSH8.2 5.2 身份验证错误8.2.1 5.2.1 用户名或密码错误8.2.2 5.2.2 公钥未正确安装8.2.3 5.2.3 .ssh 目录权限不正确8.3 5.3 SSH 连接不稳定或意外断开8.3.1 5.3.1 调整 ClientAliveInterval8.3.2 5.3.2 调整本地客户端设置8.4 5.4 查看 SSH 日志8.4.1 5.4.1 实时查看日志8.4.2 5.4.2 查看历史日志9 结论10 6. 常见问题解答 (FAQ)10.1 6.1 如何解决 SSH 超时问题?10.1.1 6.1.1 服务器端设置10.1.2 6.1.2 客户端设置10.2 6.2 如果忘记 SSH 密码该怎么办?10.2.1 6.2.1 如果您拥有物理访问权限10.2.2 6.2.2 如果无法获得物理访问(云 VPS)10.3 6.3 如何在 Windows 上使用 SSH?10.3.1 6.3.1 使用 PowerShell10.3.2 6.3.2 使用 PuTTY10.4 6.4 如何在 Ubuntu WSL 上配置 SSH?10.4.1 6.4.1 安装 SSH 服务器10.4.2 6.4.2 修改 SSH 设置10.5 6.5 其他安全最佳实践10.5.1 6.5.1 使用 Fail2Ban10.5.2 6.5.2 更改 SSH 端口10.6 6.6 如何实时监控 SSH 日志?10.7 6.7 更方便使用 SSH 的技巧10.7.1 6.7.1 使用 .ssh/config 简化登录10.7.2 6.7.2 使用 ssh-agent11 结论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 上需要 SSHSSH 用于远程管理 Ubuntu 的常见场景包括:
云服务器管理:AWS、GCP、Vultr 等上的 Linux 服务器通常通过 SSH 访问。局域网环境中的远程操作:远程访问内部服务器或开发机器。管理 IoT 设备:远程控制嵌入式系统,例如 Raspberry Pi。默认情况下,Ubuntu 上的 SSH 服务器是禁用的,因此必须手动安装并配置以启用 SSH 访问。
2. 基本 SSH 配置要在 Ubuntu 上使用 SSH,您必须安装 SSH 服务器(OpenSSH)并正确配置它。本节解释了如何安装 SSH、调整基本设置、配置防火墙以及连接到服务器。
2.1 安装并启动 OpenSSH2.1.1 什么是 OpenSSH?OpenSSH(Open Secure Shell)是 SSH 协议的开源实现。它支持远程连接、安全文件传输(SCP 和 SFTP)以及端口转发。
2.1.2 安装 OpenSSHUbuntu 默认不包含 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 允许 SSHsudo ufw allow ssh
或明确指定:
sudo ufw allow 22/tcp
2.2.3 启用 UFWsudo 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 连接您可以使用 PowerShell 或 PuTTY。
使用 PowerShell(Windows 10+ 包含 SSH):
ssh username@server-ip-address
使用 PuTTY:
从官方网站下载 PuTTY。打开 PuTTY 并在 Host Name (or IP address) 中输入服务器 IP。将连接类型选择为 SSH。点击 Open 并登录 结论本节介绍了在 Ubuntu 上设置 SSH 的基础内容:
如何安装并启动 OpenSSH如何使用 UFW 允许 SSH 连接如何从 Linux/macOS 和 Windows 连接 3. 加强 SSH 安全SSH 功能强大,但保持默认设置会增加安全风险。攻击者常常尝试暴力登录或端口扫描。加强 SSH 安全至关重要。
3.1 禁用 Root 登录Root 登录提供完整的系统控制,是攻击者的主要目标。禁用它可以提升安全性。
3.1.1 步骤编辑 SSH 配置文件:sudo nano /etc/ssh/sshd_config
将该行更改为:PermitRootLogin no
重启 SSH:sudo systemctl restart ssh
确认更改: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 配置步骤打开 SSH 配置文件 /etc/ssh/sshd_config :sudo nano /etc/ssh/sshd_config
添加允许通过 SSH 访问的用户:AllowUsers username1 username2
重启 SSH 以应用设置:sudo systemctl restart ssh
3.4 更改 SSH 端口由于端口 22 常被攻击者盯上,更改默认端口可以提升安全性。
3.4.1 配置步骤打开 SSH 配置文件:sudo nano /etc/ssh/sshd_config
修改端口设置,例如:Port 2200
重启 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 安装 Fail2Bansudo 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 重启 Fail2Bansudo 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 配置步骤编辑 /etc/ssh/sshd_config :sudo nano /etc/ssh/sshd_config
添加多行 Port:Port 22
Port 2200
重启 SSH:sudo systemctl restart ssh
使用 UFW 允许新端口:sudo ufw allow 2200/tcp
4.4 仅允许特定 IP 地址访问 SSH通过 IP 地址限制 SSH 访问可提供强大的安全控制。
4.4.1 配置 /etc/hosts.allowsudo nano /etc/hosts.allow
添加允许的 IP 地址:
sshd: 192.168.1.100
4.4.2 配置 /etc/hosts.denysudo 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
解决方案:
如果状态为 inactive 或 failed,请重启 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) 阻止 SSHsudo 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 调整 ClientAliveIntervalClientAliveInterval 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 如果您拥有物理访问权限进入单用户模式(在 GRUB 中选择 recovery mode)重置密码:passwd username
重启系统6.2.2 如果无法获得物理访问(云 VPS)使用托管服务提供的 VPS 控制台使用公钥认证6.3 如何在 Windows 上使用 SSH?6.3.1 使用 PowerShellssh username@server-ip-address
6.3.2 使用 PuTTY下载并安装 PuTTY在 Host Name 中输入服务器 IP 地址将连接类型选择为 SSH使用用户名和密码登录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 使用 Fail2Bansudo 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-agenteval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa
结论本节总结了与 SSH 相关的常见问题:
如何解决 SSH 超时问题如何恢复忘记的密码如何在 Windows 和 WSL 上使用 SSH安全最佳实践如何检查 SSH 日志使用 .ssh/config 提高 SSH 便利性的技巧通过应用这些技术,您可以构建安全高效的 SSH 环境,并顺畅地管理远程服务器。