标签: ssh

  • 解决 Fedora 43 (GNOME 49) 远程 SSH 触发 “The system will suspend now!”

    我把家里的台式机升级到Fedora 43 ,GNOME49 用起来确实挺舒服,顺手将 Fedora 43 Workstation 作为远程开发机或服务器使用时,遇到一个特别烦的问题,SSH 连着连着突然断了,因系统自动进入休眠(Suspend)而中断。我在 GNOME 图形界面的电源设置中关闭了所有自动挂起选项,系统依然可能在远程操作期间弹出 The system will suspend now! 并强制断开连接。

    1. 常规配置(图形界面)

    我开始以为在 GNOME 桌面环境的电源管理中配置这样就可以正常解决这个问题但并没有解决,没用

    1. 打开 Settings (设置) -> Power (电源)
    2. Automatic Screen Blank (自动黑屏):设置为 Off (关闭)
    3. Automatic Suspend (自动挂起):确保设置为 Off (关闭)

    2. 禁用 systemd 休眠

    当 GUI 设置失效时,说明系统底层的 systemd 策略仍处于活跃状态。对于需要保持常开的远程机器,最稳妥的方法是屏蔽(Mask)相关的休眠单元。

    2.1 诊断休眠状态

    在操作前,你可以运行以下命令查看系统当前的休眠服务状态:

    sudo systemctl status sleep.target suspend.target hibernate.target hybrid-sleep.target

    2.2 执行屏蔽命令

    通过 mask 命令,我们将休眠相关的 Target 指向 /dev/null。这是一种比 disable 更强力的手段,能够防止任何物理按键、系统 API 或 GUI 插件触发休眠。

    # 一键禁用所有休眠模式
    sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

    执行效果: 系统将完全忽略所有的休眠请求,彻底终结 SSH 远程连接时的中断风险。

    2.3 恢复休眠(可选)

    如果你在未来需要恢复笔记本的合盖休眠或台式机的节能模式,可以使用以下命令解除屏蔽:

    sudo systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target

    3. 技术解析:为什么 GUI 设置后依然会断连

    在 Fedora 43 (GNOME 49) 中,这种情况通常由以下原因引起:

    • 多 Session 竞争: GNOME 的电源设置有时仅对当前的本地会话有效。如果系统停留在 GDM 登录界面,或者系统认为本地处于“无活动”状态,底层 systemd-logind 可能会接管电源策略。
    • SSH 会话识别: 系统默认可能不将纯远程 SSH 流量识别为“用户活动”,从而触发了全局的空闲休眠逻辑。

    追求“Vibe Coding”或需要高可用远程环境的开发者来说,单纯依靠 GNOME 的开关是不够的。“UI 辅助设置 + systemd 强制 Mask” 才是确保 Fedora 43 系统稳如磐石、SSH 永不断线的标准做法。

  • SSH 报错REMOTE HOST IDENTIFICATION HAS CHANGED解决方法

    一、问题背景

    重装服务器系统再次连接 SSH 连接时,会出现如下报错:

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    Host key verification failed.

    提示信息中可能还会包含:

    Offending ECDSA key in /Users/username/.ssh/known_hosts:26
    Host key for 192.168.XXX.XXX has changed

    二、为什么会发生

    SSH 通过 主机密钥(Host Key) 验证服务器身份:

    1. 第一次连接服务器时,SSH 会保存服务器的公钥指纹到本地:
    2. 后续连接时,会对比服务器发来的指纹与本地保存的指纹。
    3. 如果指纹不一致,SSH 会拒绝连接,防止中间人攻击。
    • 重装系统时,服务器会重新生成新的 SSH 主机密钥。
    • 因此,旧的指纹与新的不匹配。
    • SSH 就会报“REMOTE HOST IDENTIFICATION HAS CHANGED”。

    三、解决方法

    在本地终端执行:

    ssh-keygen -R <服务器IP>
    ssh root@<服务器IP>

    首次连接会提示:

    Are you sure you want to continue connecting (yes/no)?

    输入:

    yes
  • 使用 opkssh 实现 OpenID 身份验证与 SSH 连接

    opkssh 是一个结合 OpenID 身份验证和 SSH 连接的工具,它能简化 SSH 密钥的管理,并提升 SSH 连接的安全性。与传统的 SSH 密钥验证方式不同,opkssh 通过 OpenID 身份验证来生成 SSH 密钥,使得用户的身份验证更加灵活与安全。

    1. 安装 opkssh

    opkssh 可以在 Windows、macOS 和 Linux 系统上使用。下面是详细的安装步骤:

    在 Windows 上安装 opkssh

    1. 打开 PowerShell 或命令提示符。
    2. 执行以下命令,下载并安装 opkssh
    curl https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-windows-amd64.exe -o opkssh.exe
    1. 下载完成后,你将获得 opkssh.exe 文件。你可以将它放在任何你想要的目录下,并通过命令行运行它。

    在 macOS 上安装 opkssh

    1. 打开终端。
    2. 执行以下命令,下载并安装 opkssh
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-osx-amd64 -o opkssh; chmod +x opkssh
    1. 这将下载 opkssh 文件并授予执行权限。你可以将其移动到 /usr/local/bin/ 目录,方便在终端中全局使用。

    在 Linux 上安装 opkssh

    Linux 系统支持多种架构。根据你的系统架构(x86_64 或 ARM64),选择相应的安装命令。

    • 对于 x86_64 架构的 Linux 系统
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-linux-amd64 -o opkssh; chmod +x opkssh
    • 对于 ARM64 架构的 Linux 系统
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-linux-arm64 -o opkssh; chmod +x opkssh

    安装完成后,你可以将 opkssh 文件移动到 /usr/local/bin/ 目录,或将其保留在当前目录。

    2. 使用 opkssh 进行身份验证与 SSH 登录

    安装完成后,你可以开始使用 opkssh 进行身份验证和 SSH 连接。

    登录并生成 SSH 密钥

    1. 在终端或命令行中运行以下命令:
    opkssh login
    1. 该命令将打开一个浏览器窗口,要求你选择一个 OpenID 提供商并完成身份验证。你可以选择 Google、GitHub 等常见的 OpenID 提供商来进行登录。
    2. 登录成功后,opkssh 会在你的本地系统中生成一个 SSH 公钥文件,默认位置是 ~/.ssh/id_ecdsa。这个密钥对应的是你的 OpenID Token,凭此可以通过 SSH 连接到服务器。

    默认 SSH 密钥过期时间

    生成的 SSH 密钥默认会在 24 小时后过期。到期后,你需要重新运行 opkssh login 来生成新的密钥。

    使用 SSH 登录

    一旦密钥生成成功,你可以像使用传统 SSH 密钥一样使用它来登录到远程服务器。执行以下命令:

    ssh [email protected]

    使用 SFTP 进行文件传输

    你还可以使用 opkssh 生成的 SSH 密钥进行 SFTP 文件传输:

    sftp [email protected]

    3. 自定义 SSH 密钥名称

    opkssh 允许你为生成的密钥指定自定义名称,方便管理。

    登录时指定自定义密钥名称

    如果你希望使用特定名称的密钥,可以在执行 opkssh login 时指定密钥名称:

    opkssh login -i opkssh_server_group1

    使用自定义密钥进行 SSH 连接

    在使用 SSH 时,你可以通过 -i 参数指定自定义的密钥文件。假设你使用了 opkssh_server_group1 作为密钥名称,可以执行以下命令:

    ssh -o "IdentitiesOnly=yes" -i ~/.ssh/opkssh_server_group1.pub -i ~/.ssh/opkssh_server_group1 [email protected]

    这里的 -o "IdentitiesOnly=yes" 参数会确保 SSH 仅使用指定的密钥进行身份验证,避免使用其他默认密钥进行干扰。

    4. 在服务器端安装和配置 opkssh

    为了让你的服务器支持使用 opkssh 进行身份验证,你需要在服务器上安装并配置它。

    安装 opkssh 在服务器上

    1. 登录到你的服务器。
    2. 使用以下命令安装 opkssh
    wget -qO- "https://raw.githubusercontent.com/openpubkey/opkssh/main/scripts/install-linux.sh" | sudo bash

    这条命令会自动下载并安装 opkssh,并将其放置在 /usr/local/bin/ 目录中,同时配置 SSH 服务以支持 opkssh 作为附加的身份验证机制。

    允许单个用户使用 opkssh 登录

    如果你想允许某个用户(例如 [email protected])通过 OpenID 进行身份验证并作为 root 登录到服务器,可以执行以下命令:

    sudo opkssh add root [email protected] google

    允许用户组使用 opkssh 登录

    如果你希望允许某个用户组(例如 ssh-users)中的所有成员通过 OpenID 进行身份验证并作为 root 登录,可以使用以下命令:

    sudo opkssh add root oidc:groups:ssh-users google
  • Debian 12 上使用 Fail2Ban 来增强 SSH 的安全性

    使用 Fail2Ban 来增强 SSH 安全性是一个非常有效的选择,特别是针对暴力破解攻击。Fail2Ban 可以监控系统日志并自动封禁恶意 IP 地址,减少暴力破解的尝试。以下是配置 Fail2Ban 的步骤:

    1. 安装 Fail2Ban

    Debian 12 默认软件仓库中包含 Fail2Ban,可以通过以下命令安装:

    apt update
    apt install fail2ban

    安装完成后,Fail2Ban 会自动启动。你可以使用以下命令检查其状态:

    systemctl status fail2ban

    2. 配置 Fail2Ban

    Fail2Ban 的配置文件位于 /etc/fail2ban/ 目录下。默认的全局配置文件是 /etc/fail2ban/jail.conf,但建议不要直接修改该文件,而是创建一个本地配置文件 /etc/fail2ban/jail.local 或者在 /etc/fail2ban/jail.d/ 目录下添加自定义配置。

    创建本地配置文件

    首先,复制默认配置文件并编辑:

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

    配置 SSH 防护

    jail.local 文件中,找到 [sshd] 部分,或者添加以下内容:

    [sshd]
    enabled  = true
    port     = 22
    filter   = sshd
    logpath  = /var/log/auth.log
    maxretry = 5
    bantime  = 3600
    findtime = 600

    说明:

    • enabled = true:启用 SSH 防护。
    • port = 22:SSH 默认端口(如果更改过端口,请相应调整)。
    • filter = sshd:使用内置的 SSH 过滤器。
    • logpath = /var/log/auth.log:Debian 12 中 SSH 日志的默认路径。
    • maxretry = 5:如果超过 5 次登录失败,IP 将被封禁。
    • bantime = 3600:封禁时间为 1 小时(单位:秒,视情况调整)。
    • findtime = 600:统计失败登录尝试的时间窗口为 10 分钟。

    完成后保存并退出编辑器。

    3. 启动并测试 Fail2Ban

    配置完成后,重启 Fail2Ban 以应用配置:

    systemctl restart fail2ban

    检查 Fail2Ban 是否正常运行:

    fail2ban-client status

    查看 SSH 防护的具体状态:

    fail2ban-client status sshd

    4. 监控和解禁

    你可以随时查看被封禁的 IP 地址,并手动解禁:

    查看被封禁的 IP

    fail2ban-client get sshd banip

    手动解禁某个 IP(如果误封)

    fail2ban-client unban 目标IP

    注意事项

    • 确保 SSH 服务(sshd)已启用并正常运行。
    • 如果使用了非标准日志路径,需要调整 logpath
    • 定期检查日志文件 /var/log/fail2ban.log,确保规则已生效。
  • 使用 SSH 端口转发访问 Docker Hub 拉取镜像

    1. 原理解析

    SSH 端口转发(Port Forwarding)是一种将本地端口流量通过 SSH 连接重定向到远程服务器的方式。在本方案中,我们将本地端口映射到 Docker Hub 服务器(registry-1.docker.io),让本地 Docker 以为它正在直接访问 Docker Hub。

    示意图:

    [本地 Docker 客户端] → [SSH 隧道] → [远程服务器] → [Docker Hub]

    这样,本地 Docker 发送的请求会通过 SSH 隧道访问 Docker Hub 并返回数据。


    2. 使用条件

    • 一台可访问 Docker Hub 的服务器
    • 服务器上安装了 SSH
    • 本地设备(Windows/Linux/macOS)可通过 SSH 连接到服务器

    3. 配置 SSH 端口转发

    3.1 在本地终端运行 SSH 端口转发

    ssh -N -L 5000:registry-1.docker.io:443 user@your-server-ip
    • -N:不执行远程命令,仅进行端口转发
    • -L 5000:registry-1.docker.io:443:将本地 5000 端口映射到远程 registry-1.docker.io443 端口
    • user@your-server-ip:远程服务器的 SSH 账户

    保持这个 SSH 连接不关闭,否则端口转发会失效。


    4. 配置 Docker 访问代理

    4.1 在 daemon.json 中修改 Docker 配置

    编辑 Docker 的配置文件:

    nano /etc/docker/daemon.json

    添加以下内容:

    {
      "proxies": {
        "default": "http://127.0.0.1:5000"
      }
    }

    保存后,重启 Docker

    systemctl restart docker

    5. 测试 Docker 是否可以正常拉取

    执行拉取测试:

    docker pull ubuntu

    如果拉取成功,说明 SSH 端口转发生效。

  • SSH Config 别名配置让远程连接更便捷

    在日常的系统管理和开发工作中,每次远程连接服务器输入冗长的SSH命令,如ssh user@remote_host -p port -i ~/.ssh/private_key,既繁琐又容易出错。通过配置SSH配置文件,我们可以为常用服务器设置别名和默认参数,从而简化连接过程,提高工作效率。

    SSH 配置文件的位置:

    • Linux/macOS: ~/.ssh/config
    • Windows: 在使用Git Bash或者Windows自带的openssh客户端,在“~/.ssh/config”配置,如果不存在就创建一个。

    配置文件:

    Host my_server
        HostName 192.168.1.10  
        User liqixin  
        Port 22  
        IdentityFile ~/.ssh/key  
        Compression yes  
        ServerAliveInterval 60  
        ServerAliveCountMax 3  

    配置完成后,只需在终端输入ssh my_server,即可快速连接到远程服务器。

    参数说明:

    • Host ion:定义一个别名为 my_server,之后可以直接 my_server 连接服务器。
    • HostName 192.168.1.10:指定实际的服务器 IP 地址。
    • User liqixin:指定要使用的 SSH 用户名。
    • Port 22:指定 SSH 端口号,默认是 22,但如果服务器使用了不同的端口,可以在这里修改。
    • IdentityFile ~/.ssh/key:指定 SSH 私钥文件的位置,确保该私钥对应服务器上的公钥,才能成功登录。
    • Compression yes:开启 SSH 连接的压缩功能,提高低带宽环境下的传输效率。
    • ServerAliveInterval 60:每 60 秒发送一个心跳包,保持连接活跃,防止 SSH 连接因长时间不活动而断开。
    • ServerAliveCountMax 3:如果服务器没有响应心跳包 3 次,则自动断开连接。