Ubuntu 终极 SSH 设置指南:安全远程访问、配置与故障排除

目次

1. 介绍

通过在 Ubuntu 上使用 SSH,您可以安全地远程访问和操作服务器或电脑。本文提供了对 SSH 的详细说明——从基本概念、如何在 Ubuntu 上安装 SSH 服务器,到安全最佳实践和故障排除——使用即使是初学者也能理解的清晰解释。

什么是 SSH?

SSH(Secure Shell)是一种协议,允许在网络上对计算机进行安全的远程连接。与传统的 Telnet 或 FTP 等协议不同,SSH 对通信数据进行加密,显著降低了窃听和篡改的风险。

Ubuntu 上 SSH 的主要使用场景

在 Ubuntu 上使用 SSH 的主要场景包括以下内容:

  • 远程服务器管理:从远程位置操作 Ubuntu 服务器
  • 文件传输:使用 SCP 或 SFTP 安全地交换文件
  • 端口转发:建立安全的远程连接

本文您将学到的内容

  • SSH 的基本概念和机制
  • 如何在 Ubuntu 上安装 SSH 服务器
  • 如何配置 SSH 连接并排除错误
  • SSH 的安全最佳实践

2. SSH 的基本概念

要有效使用 SSH,必须了解其核心概念。本章将解释 SSH 的工作原理以及不同的认证方式之间的区别。

SSH 的工作原理

SSH 是一种在客户端和服务器之间建立安全连接的协议。默认情况下,它使用 TCP 端口 22 进行加密通信。

主要特性

  • 远程登录:在服务器上执行命令
  • 文件传输:通过 SCP 或 SFTP 安全地发送数据
  • 端口转发:通过 SSH 连接其他服务

SSH 认证方式

SSH 主要提供两种认证方式:

密码认证

  • 使用用户名和密码登录
  • 简单,但容易受到暴力破解攻击

公钥认证

  • 使用公钥和私钥对进行认证
  • 更安全,默认推荐使用

SSH 的优势

  • 加密通信:保护传输的数据
  • 轻松的远程管理:随时随地访问
  • 增强的安全性:帮助防止未授权访问

3. 在 Ubuntu 上安装 SSH 服务器

要在 Ubuntu 上使用 SSH,必须安装 OpenSSH 服务器软件包。本章将说明如何安装并配置它。

安装 OpenSSH 服务器

您可以使用以下命令在 Ubuntu 上安装 OpenSSH 服务器:

sudo apt update
sudo apt install openssh-server

安装完成后,验证 SSH 服务是否正在运行:

sudo systemctl status ssh

启动和管理 SSH 服务

要手动启动或停止 SSH 服务,请使用以下命令:

# Start SSH
sudo systemctl start ssh

# Enable SSH to start automatically after reboot
sudo systemctl enable ssh

# Stop SSH
sudo systemctl stop ssh

配置 UFW(Uncomplicated Firewall)

如果已启用 UFW,SSH 连接可能会被阻止。使用下面的命令允许 SSH 端口(22):

sudo ufw allow ssh
sudo ufw enable

4. 配置 SSH 连接

要安全地使用 SSH,正确的配置至关重要。本章将说明如何设置公钥认证。

生成密钥对

在客户端机器上运行以下命令以生成公钥/私钥对:

ssh-keygen -t rsa -b 4096

默认情况下,私钥存放在 ~/.ssh/id_rsa,公钥存放在 ~/.ssh/id_rsa.pub 中。

将公钥上传到服务器

将生成的公钥传输到 SSH 服务器:

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

或手动传输:

scp ~/.ssh/id_rsa.pub username@server-ip-address:~/

在服务器上,执行以下命令将公钥放置在正确的目录中:

mkdir -p ~/.ssh
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
rm ~/id_rsa.pub

编辑 sshd_config

打开 SSH 配置文件以增强安全设置:

sudo nano /etc/ssh/sshd_config

检查并编辑以下配置项:

# Disable password authentication (use public key only)
PasswordAuthentication no

# Disable root login
PermitRootLogin no

# Change the SSH port (example: 2222)
Port 2222

更改完成后,重启 SSH 服务:

sudo systemctl restart ssh

5. 执行 SSH 连接

在 Ubuntu 上配置好 SSH 服务器后,您可以从客户端机器进行连接。本章节说明在端口被更改时的基本 SSH 用法和连接方式。

基本 SSH 连接命令

使用以下命令从 SSH 客户端连接到服务器:

ssh username@server-ip-address

例如,若服务器 IP 为 192.168.1.10,用户名为 ubuntu,则输入:

ssh ubuntu@192.168.1.10

首次连接时,服务器的指纹会显示。输入 yes 以接受并继续。

更改端口号后的连接方式

如果您更改了 SSH 端口——例如改为 2222——请使用 -p 选项:

ssh -p 2222 ubuntu@192.168.1.10

使用私钥进行连接

如果已配置公钥认证,请使用 -i 选项指定私钥:

ssh -i ~/.ssh/id_rsa ubuntu@192.168.1.10

通过 SSH 运行远程命令

您可以直接在远程服务器上运行命令,而无需交互式登录:

ssh ubuntu@192.168.1.10 "ls -lah /home/ubuntu"

此方式可实现脚本的高效自动化和远程操作。

使用 SCP 传输文件

您可以使用 SSH 在本地 PC 与远程服务器之间传输文件。

本地 → 远程

scp filename username@server-ip-address:/remote/directory

示例:

scp myfile.txt ubuntu@192.168.1.10:/home/ubuntu/

远程 → 本地

scp username@server-ip-address:/remote/filename /local/directory

示例:

scp ubuntu@192.168.1.10:/home/ubuntu/myfile.txt ./

使用 SFTP 管理文件

您也可以使用 SFTP 管理文件:

sftp ubuntu@192.168.1.10

连接后,您可以运行以下命令:

ls        # List files
cd        # Change directory
put filename   # Upload a local file to the remote server
get filename   # Download a remote file to the local machine
exit      # Exit the connection

6. 故障排除 SSH 连接

在使用 SSH 连接时遇到问题并不罕见。本章节描述常见问题及其解决方案。

SSH 连接错误的常见原因及解决方案

当 SSH 连接失败时,原因通常是以下之一:

1. SSH 服务器未运行

首先,确认 SSH 服务器是否正常运行:

sudo systemctl status ssh

解决方案:

  • 如果 SSH 服务器已停止,使用以下命令启动它:
    sudo systemctl start ssh
    
  • 要使 SSH 在重启后自动启动,运行:
    sudo systemctl enable ssh
    

2. 防火墙 (UFW) 阻止了 SSH

如果启用了 UFW(Uncomplicated Firewall),可能会阻止 SSH 访问:

解决方案:

  • 检查当前的 UFW 配置:
    sudo ufw status
    
  • 允许 SSH 访问:
    sudo ufw allow ssh
    

(如果使用自定义端口,运行 sudo ufw allow <port-number>

  • 重启 UFW:
    sudo ufw reload
    

3. 端口号已更改

如果 SSH 服务器未使用默认端口 22,连接时必须指定正确的端口:

解决方案:

  • 检查服务器上的端口号:
    sudo grep Port /etc/ssh/sshd_config
    
  • 在客户端上指定正确的端口:
    ssh -p 2222 username@server-ip-address
    

4. SSH 密钥权限不正确

如果您使用公钥认证,密钥权限不正确可能会阻止连接。

解决方案:

  • 设置私钥的权限:
    chmod 600 ~/.ssh/id_rsa
    
  • 设置公钥的权限:
    chmod 644 ~/.ssh/authorized_keys
    

5. 主机密钥不匹配

如果服务器上的 SSH 主机密钥已更改,客户端可能会显示错误,例如:“WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!”

解决方案:

  • 删除旧的主机密钥:
    ssh-keygen -R <server-ip-address>
    
  • 再次尝试连接:
    ssh username@server-ip-address
    

6. 检查 SSH 日志

要识别详细的 SSH 错误消息,请检查服务器日志文件:

sudo journalctl -u ssh --no-pager | tail -n 20

要实时监控日志,请运行:

sudo tail -f /var/log/auth.log

7. SSH 连接超时问题

如果 SSH 连接缓慢或意外断开,请审查以下要点:

解决方案:

  • 启用 KeepAlive 在客户端的 ~/.ssh/config 中添加以下内容:
    Host *
        ServerAliveInterval 60
    
  • 调整服务器上的超时设置/etc/ssh/sshd_config 中添加以下内容并重启服务:
    ClientAliveInterval 60
    ClientAliveCountMax 3
    
    sudo systemctl restart ssh
    

总结

SSH 连接问题通常源于以下要点。在大多数情况下,检查这些项目即可解决问题:

验证 SSH 服务是否正在运行
检查防火墙是否阻止连接
确认使用正确的 SSH 端口
确保 SSH 密钥权限设置正确
审查 SSH 日志以识别详细错误

7. 增强 SSH 安全性

SSH 是一种强大的远程访问工具,但如果没有适当的安全措施,它可能会成为未经授权访问或暴力破解攻击的目标。本章解释了加强 SSH 安全的推荐设置。

1. 禁用密码认证并使用公钥认证

默认情况下,SSH 允许密码登录,这会增加暴力破解攻击的风险。启用公钥认证并禁用密码认证可以提高安全性。

步骤

  1. 编辑 sshd_config
    sudo nano /etc/ssh/sshd_config
    
  1. 编辑或添加以下设置
    PasswordAuthentication no
    PubkeyAuthentication yes
    
  1. 重启 SSH 服务
    sudo systemctl restart ssh
    

应用此配置后,SSH 将仅接受公钥认证。请确保事先正确配置您的 SSH 密钥。

2. 更改 SSH 端口号

使用默认 SSH 端口 (22) 会使服务器更容易成为攻击者的目标。更改端口号有助于减少未经授权的访问尝试。

步骤

  1. 打开 sshd_config
    sudo nano /etc/ssh/sshd_config
    
  1. 修改以下行(示例:将端口更改为 2222)
    Port 2222
    
  1. 通过防火墙允许新端口
    sudo ufw allow 2222/tcp
    
  1. 重启 SSH 服务
    sudo systemctl restart ssh
    
  1. 使用新端口测试连接
    ssh -p 2222 username@server-ip-address
    

3. 禁用 Root 登录

默认情况下,SSH 允许 root 登录,这会带来严重的安全风险。建议仅通过普通用户帐户允许 SSH 访问,并在需要管理员权限时使用 sudo

步骤

  1. 打开 sshd_config
    sudo nano /etc/ssh/sshd_config
    
  1. 编辑以下行
    PermitRootLogin no
    
  1. 重启 SSH 服务
    sudo systemctl restart ssh
    

4. 使用 Fail2Ban 防止暴力破解攻击

Fail2Ban 检测未经授权的登录尝试,并自动阻止超过一定失败次数的 IP 地址。

安装和配置

  1. 安装 Fail2Ban
    sudo apt install fail2ban -y
    
  1. 复制默认配置文件
    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    
  1. 编辑 jail.local
    sudo nano /etc/fail2ban/jail.local
    
  1. 修改 [sshd] 部分
    [sshd]
    enabled = true
    maxretry = 5
    bantime = 600
    findtime = 600
    
  • maxretry : 允许的失败登录尝试次数
  • bantime : IP 封锁持续时间(秒)
  • findtime : 计数失败尝试的时间窗口(秒)
  1. 重启 Fail2Ban
    sudo systemctl restart fail2ban
    
  1. 检查当前的 Fail2Ban 状态
    sudo fail2ban-client status sshd
    

总结

为了增强 SSH 安全性,请应用以下措施:

禁用密码认证并使用公钥认证
更改 SSH 端口以减少攻击暴露
禁用 root 登录以最小化风险
使用 Fail2Ban 防止暴力破解攻击

8. 常见问题解答 (FAQ)

本节解答配置和使用 SSH 时常见的疑问和问题。

Q1: 为什么 SSH 显示“连接被拒绝”?

SSH 连接被拒绝可能有多种原因。

主要原因及解决方案:

  1. SSH 服务未运行
    sudo systemctl status ssh
    

解决方案: 如果服务已停止,请启动它。

sudo systemctl start ssh
  1. 防火墙 (UFW) 正在阻止 SSH
    sudo ufw allow ssh
    sudo ufw enable
    
  1. SSH 端口号已更改 如果 SSH 使用自定义端口,请在连接时指定它。
    ssh -p 2222 username@server-ip-address
    

Q2: 如何更改默认 SSH 端口?

端口 22 是常见的攻击目标,因此更改它可以提高安全性。

步骤:

  1. 编辑 SSH 配置文件
    sudo nano /etc/ssh/sshd_config
    
  1. 修改 Port 指令
    Port 2222
    
  1. 通过防火墙允许新端口
    sudo ufw allow 2222/tcp
    
  1. 重启 SSH 服务
    sudo systemctl restart ssh
    

进行这些更改后,使用新端口连接:

ssh -p 2222 username@server-ip-address

Q3: 如果公钥认证不起作用,应该检查什么?

如果 SSH 密钥认证失败,请验证以下内容:

  1. 确保公钥正确安装
    ls -l ~/.ssh/authorized_keys
    

确保 authorized_keys 存在并包含正确的密钥。

  1. 检查文件权限
    chmod 600 ~/.ssh/authorized_keys
    chmod 700 ~/.ssh
    
  1. 验证 SSH 是否允许公钥认证
    sudo nano /etc/ssh/sshd_config
    

确保以下条目存在:

PubkeyAuthentication yes
PasswordAuthentication no
  1. 重启 SSH 服务
    sudo systemctl restart ssh
    

Q4: 如何仅允许来自特定 IP 地址的 SSH 访问?

将 SSH 访问限制为特定 IP 地址可以显著提高安全性。

方法 1: 编辑 sshd_config

  1. 打开配置文件
    sudo nano /etc/ssh/sshd_config
    
  1. 添加 AllowUsers 条目
    AllowUsers username@192.168.1.100
    
  1. 重启 SSH 服务
    sudo systemctl restart ssh
    

方法 2: 配置防火墙 (UFW)

  1. 允许来自特定 IP 的访问
    sudo ufw allow from 192.168.1.100 to any port 22
    
  1. 拒绝其他来源的访问
    sudo ufw deny 22
    

Q5: 如何更改 SSH 会话超时时间?

如果您的 SSH 会话在空闲后断开,请修改以下设置。

客户端设置

  1. ~/.ssh/config 中添加以下内容:
    Host *
        ServerAliveInterval 60
    

服务器端设置

  1. 编辑 sshd_config
    sudo nano /etc/ssh/sshd_config
    
  1. 添加或修改:
    ClientAliveInterval 60
    ClientAliveCountMax 3
    
  1. 重启 SSH 服务
    sudo systemctl restart ssh
    

总结

本常见问题解答涵盖了最常见的 SSH 问题及其解决方案。出现问题时,请始终检查日志和配置设置,以定位原因。

如何解决“Connection refused”错误
如何更改默认 SSH 端口并正确连接
如何排查公钥认证失败
如何将 SSH 访问限制到特定 IP 地址
如何防止 SSH 会话超时

9. 结论

本文阐述了在 Ubuntu 上配置和使用 SSH 的方法,从基础概念到高级安全实践。让我们回顾关键要点。

关键要点

1. SSH 基础

  • SSH 通过加密通信实现安全的远程访问。
  • 比 Telnet 或 FTP 更安全。
  • 认证方式包括 密码认证公钥认证

2. 安装 SSH 服务器

  • 通过 sudo apt install openssh-server 安装 OpenSSH。
  • 使用 systemctl status ssh 验证服务状态。
  • 使用 sudo ufw allow ssh 通过 UFW 允许 SSH 访问。

3. 配置 SSH 访问

  • 使用 ssh username@server-ip-address 进行连接。
  • 使用公钥认证以提升安全性。
  • 如有需要,可在 sshd_config 中禁用密码认证。

4. 故障排查

  • 检查 SSH 是否在运行(systemctl status ssh)。
  • 如果更改了端口,请指定正确的端口(ssh -p 2222 username@IP)。
  • 验证 ~/.ssh/authorized_keys 中的密钥权限。

5. 安全增强

  • 禁用密码认证,改用公钥。
  • 更改 SSH 端口,以降低扫描攻击。
  • 使用 Fail2Ban 阻止重复的登录失败。
  • 在可能的情况下 将 SSH 访问限制到特定 IP 地址。

其他学习资源

要深入了解 SSH,请参考以下资源:

📚 官方文档

🛠 相关工具

🎥 推荐视频

  • 在 YouTube 上搜索 “Ubuntu SSH setup” 以查找适合初学者的教程。

作成した動画を友だち、家族、世界中の人たちと共有…

下一步

了解 SSH 工作原理后,探索更高级的用法:

使用 Ansible 通过 SSH 自动化服务器管理

  • 适用于高效管理多台服务器。

SSH 隧道和端口转发

  • 使用 SSH 保护远程桌面连接或创建类似 VPN 的隧道。

监控 SSH 日志并提升安全性

  • 使用 fail2banlogwatch 等工具监控可疑活动。

最后思考

感谢您阅读至本指南的结尾! 🎉
在 Ubuntu 上正确配置 SSH 能显著提升远程管理的效率和安全性。

在持续学习的过程中,探索诸如安全隧道和主动监控等高级技术,以构建更为稳健的系统。

祝您拥有安全高效的 SSH 使用体验! 🖥️🔐