Ubuntu22.04修改ssh端口不生效

在 Ubuntu 22.04 中,传统的修改方式失效,是因为系统引入了 Systemd SSH 监听机制 (ssh.socket)。要成功修改端口,必须处理“大管家” Systemd 的配置。

第一步:修改 Systemd 监听配置(核心关键)

Ubuntu 22.04 默认由 ssh.socket 掌握端口监听权。

  1. 编辑套接字配置

    sudo systemctl edit ssh.socket
    
  2. 输入以下内容(以改为 2222 为例):

    [Socket]
    ListenStream=
    ListenStream=2222
    

    💡 注意:第一个空的 ListenStream= 至关重要!它负责清除系统默认的 22 端口监听,否则会造成双端口同时监听。

第二步:更新传统 SSH 配置文件

为了保持配置一致性,传统的配置文件也建议同步修改。

  1. 编辑文件sudo nano /etc/ssh/sshd_config
  2. 修改端口行:将 Port 22 改为 Port 2222

第三步:应用更改并重启

必须刷新 Systemd 管理器并重启套接字才能生效。

sudo systemctl daemon-reload      # 重新加载 Systemd 配置
sudo systemctl restart ssh.socket # 重启 SSH 套接字(接听权生效)
sudo systemctl restart ssh        # 重启 SSH 服务(处理逻辑生效)

第四步:验证状态

检查端口是否已经在预期的位置“营业”:

ss -tlnp | grep ssh

预期输出LISTEN 0 128 *:2222


🧠 深度解析:什么是 ssh.socket 机制?

1. 形象类比:保安 vs. 自动门

2. 为什么这样设计?(核心优势)

3. 为什么只改 sshd_config 会失效?

这是最容易踩坑的地方。权力不对等导致了连接失败:

  1. 你改了 sshd_config 的端口,只是告诉了保安去守 2222 号门。
  2. 但由于没改 ssh.socket大管家依然守在 22 号门。
  3. 结果
    • 外部访问 2222 端口:大管家没在听,连接被拒
    • 外部访问 22 端口:大管家接听并拉起保安,但保安一看:“我该守的是 2222 门啊,你给我 22 号门的客户干嘛?” -> 连接断开