~
user@blog:~/posts/ubuntu-modifying-ssh-port.mdx
vim ubuntu-modifying-ssh-port.mdx

Ubuntu 修改ssh端口

testuser_01
2 min read
380 words
Tags:
["Linux"]

从旧博客迁移,原文写于2025/12/16,ai润色

在 Ubuntu22 之后的版本中采用了 Systemd Socket Activation 来管理 ssh 端口,在这种模式下,Systemd 负责监听端口。只有当有连接请求到达端口时,Systemd 才会启动 SSH 服务进程来处理。这意味着空闲时 SSH 服务几乎不占内存。传统的修改 ssh 配置文件的方式并不会生效,本文将指导如何将 SSH 默认端口(22)修改为自定义端口(例如 2222)。

⚠️ 高危操作预警 (必读)

  1. 不要关闭当前窗口: 在整个配置过程完成并在新窗口验证成功之前,绝对不要关闭当前的 SSH 连接窗口。它是你唯一的救命稻草。
  2. 端口选择: 请选择 102465535 之间的端口,且避开常用端口(如 80, 443, 8080, 3306)。

第一阶段:配置防火墙 (UFW)

这是最关键的一步。 在修改 SSH 服务之前,必须先在防火墙放行新端口,否则重启服务后将立刻失联。

# 1. 放行新端口 (使用 limit 限制暴力破解频率)
sudo ufw limit 2222/tcp

# 2. 确认规则已生效
sudo ufw status
# 确保列表中能看到 2222/tcp


第二阶段:修改 SSH 端口 (二选一)

请根据您的偏好选择 方案 A方案 B不要同时混用。

🏛️ 方案 A:传统模式 (基于 sshd_config)

适用于习惯传统运维方式的用户,或旧版 Linux 系统。

  1. 禁用 Systemd Socket (针对 Ubuntu 22.04+): 为了确保 sshd_config 生效,必须先禁用 Socket 激活模式。

    sudo systemctl stop ssh.socket
    sudo systemctl disable ssh.socket
    
    
  2. 修改配置文件:

    sudo nano /etc/ssh/sshd_config
    

    找到 #Port 22,修改为:

    Port 2222
    
  3. 重启服务:

    sudo systemctl enable ssh.service
    sudo systemctl restart ssh
    
  4. 检查监听状态:

    sudo ss -tulpn | grep ssh
    # 应显示: sshd ... *:2222
    

🚀 方案 B:现代化模式 (基于 Systemd Socket Activation)

适用于 Ubuntu 22.04+,更节省资源,更推荐。

  1. 启用 Systemd Socket:

    sudo systemctl disable --now ssh.service
    sudo systemctl enable --now ssh.socket
    
  2. 创建覆盖配置 (Override): 不要直接修改原文件,创建一个 drop-in 配置文件。

    sudo systemctl edit ssh.socket
    
  3. 填入以下内容:

    [Socket]
    # 第一行必须为空,用于清空默认的 22 端口绑定
    ListenStream=
    # 第二行写入新端口
    ListenStream=2222
    

    (保存并退出:Ctrl+O -> Enter -> Ctrl+X)

  4. 应用更改:

    sudo systemctl daemon-reload
    sudo systemctl restart ssh.socket
    
  5. 检查监听状态:

    sudo ss -tulpn | grep ssh
    # 应显示: systemd ... *:2222
    

    (注:此时配置文件 /etc/ssh/sshd_config 中的 Port 设置将被忽略)


第三阶段:同步 Fail2Ban 配置

必做步骤。 如果不修改这里,Fail2Ban 依然会监控 22 端口,导致新端口的暴力破解无法被拦截。

  1. 修改 Jail 配置:

    sudo nano /etc/fail2ban/jail.local
    
  2. 更新 [sshd] 部分: 找到 [sshd] 区块,显式指定 port

    [sshd]
    enabled = true
    # 必须修改为新端口
    port    = 22333
    # 建议:如果使用方案 B,可显式指定 backend (通常自动识别,但指定更稳)
    # backend = systemd
    
  3. 重启 Fail2Ban:

    sudo systemctl restart fail2ban
    
  4. 验证状态:

    sudo fail2ban-client status sshd
    # 确保没有报错
    

第四阶段:生死验证 🕵️

  1. 保持当前的 SSH 窗口打开不要动。

  2. 新开一个终端窗口(或 Termius 新连接)。

  3. 尝试使用新端口连接:

    ssh -p 2222 root@你的服务器IP
    
  • 如果连接成功: 🎉 恭喜!配置完成。
  • 如果连接失败: 😰 别慌,回到旧窗口检查防火墙和配置,改回默认值复原。

第五阶段:收尾工作

确认新端口一切正常后,关闭旧端口以确保安全。

  1. 删除防火墙旧规则:

    # 如果之前是 limit ssh (默认22)
    sudo ufw delete limit ssh
    # 或者
    sudo ufw delete allow 22/tcp
    
  2. 更新本地配置 (可选): 修改本地电脑的 ~/.ssh/config,更新 Port 字段,方便以后连接。

    Host myvps
        HostName ...
        Port 2222
    

文档结束

cd ../ 返回列表