Server

2026/06/03

sudo journalctl -u ssh -f

禁止 root 登录 编辑 /etc/ssh/sshd_config:PermitRootLogin no 必须 禁用密码认证 编辑 /etc/ssh/sshd_config:PasswordAuthentication no 必须 修改 SSH 端口 编辑 /etc/ssh/sshd_config:Port 2222(改为非标准端口) 强烈推荐 使用 AllowUsers 白名单 编辑 /etc/ssh/sshd_config:AllowUsers x3ea (只允许特定用户登录) 强烈推荐 安装 fail2ban sudo apt install fail2ban 并配置 强烈推荐

sudo systemctl restart sshd

记一次曲折的修改ssh 端口

配置 阿里云云服务器 ubuntu

起因是我用sudo journalctl -u ssh -f 查看了一下ssh记录? 然后心血来潮想改一下ssh 端口

1.怎么选新端口?

sudo ss -tulnp | grep 14374 来检查新端口是否被占用

2.sudo vim sshd_config ,加入了Port 14374 这时会发现sshd_config里,Prot 22是被注释掉的?

2.sudo systemctl reload sshd 这时报错了:Failed to reload sshd.service: Unit sshd.service not found

系统使用的是 ssh.service 而不是 sshd.service,所以正确命令为sudo systemctl reload ssh

4.除此之外,还需要开放防火墙+服务器安全组 sudo ufw allow 14374/tcp

5.这时还是不行,用sudo ss -tlnp | grep ssh ,输出为 LISTEN 0 4096 0.0.0.0:22 0.0.0.0:* users:((“sshd”,pid=1195,fd=3),(“systemd”,pid=1,fd=86)) LISTEN 0 4096 [::]:22 [::]:* users:((“sshd”,pid=1195,fd=4),(“systemd”,pid=1,fd=87)) 说明你的 SSH 配置没有生效。即使你改了 /etc/ssh/sshd_config 文件,SSH 服务并没有真正开始监听 14374 端口。

6.sudo journalctl -u ssh -n 50 –no-pager 再看一下日志 Jun 03 10:34:50 aliyun sshd[1195]: Server listening on 0.0.0.0 port 22. Jun 03 10:34:50 aliyun sshd[1195]: Server listening on :: port 22. Jun 03 10:39:15 aliyun sshd[1195]: Server listening on 0.0.0.0 port 22. Jun 03 10:39:15 aliyun sshd[1195]: Server listening on :: port 22. Jun 03 10:45:05 aliyun sshd[1195]: Server listening on 0.0.0.0 port 22. Jun 03 10:45:05 aliyun sshd[1195]: Server listening on :: port 22.

每次重启都只有 22,完全没有 14374。说明 配置文件中的 Port 14374 根本没有被 SSH 服务读取到

sudo grep -n “Port” /etc/ssh/sshd_config 15:# configuration must be re-generated after changing Port, AddressFamily, or 23:#Port 22 24:Port 14374 96:#GatewayPorts no

sudo grep -n “Include” /etc/ssh/sshd_config 12:Include /etc/ssh/sshd_config.d/*.conf

sudo systemctl cat ssh | grep -E “ExecStart|EnvironmentFile” EnvironmentFile=-/etc/default/ssh ExecStartPre=/usr/sbin/sshd -t ExecStart=/usr/sbin/sshd -D $SSHD_OPTS

sudo sshd -T | grep -E “port|config” port 14374 gatewayports no

ls -la /etc/ssh/sshd_config* -rw-r–r– 1 root root 3451 Jun 3 10:39 /etc/ssh/sshd_config -rw-r–r– 1 root root 3502 Apr 30 06:51 /etc/ssh/sshd_config.ucf-dist

/etc/ssh/sshd_config.d: total 8 drwxr-xr-x 2 root root 4096 Mar 16 10:24 . drwxr-xr-x 4 root root 4096 Jun 3 10:39 ..

配置是正确的:sshd -T 命令直接读取并应用了所有配置,它的输出 port 14374 是最高级别的证明。这强有力地说明 /etc/ssh/sshd_config 里的 Port 14374 语法没错,SSH 服务也确实“打算”监听这个端口。

Port 22 被正确注释掉了:#Port 22 确保了服务不会因为遗留配置而监听 22 端口。

Include 指令没有干扰:虽然引用了 /etc/ssh/sshd_config.d/*.conf 目录,但目前该目录为空,不存在其他配置文件覆盖 Port 指令的情况。

问题最可能出在服务启动的实际参数或启动过程中发生了错误上

sshd -T 显示配置正确,但实际运行的进程却没监听相应端口,通常是以下两个原因之一:

SSHD_OPTS 环境变量干扰:systemctl cat ssh 输出显示 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS。这个 $SSHD_OPTS 变量可能从 /etc/default/ssh 文件中加载,并包含了 -p 22 之类的参数,从而覆盖了配置文件里的 Port 14374 设置。

端口绑定失败(静默回退):SSH 服务在启动时,如果尝试绑定 14374 端口失败(比如权限不足、端口被其他进程占用、SELinux 阻止等),理论上会在日志里报错,然后继续监听 22 端口。但你的日志里没有出现错误,所以这个可能性较低。

8.sudo cat /etc/default/ssh # Default settings for openssh-server. This file is sourced by /bin/sh from

/etc/init.d/ssh.

Options to pass to sshd

SSHD_OPTS=

SSHD_OPTS 是空的,排除了环境变量覆盖的可能性

9.sudo systemctl stop ssh && sudo /usr/sbin/sshd -d -f /etc/ssh/sshd_config 2>&1 | head -50 Stopping ‘ssh.service’, but its triggering units are still active: ssh.socket debug1: sshd version OpenSSH_9.6, OpenSSL 3.0.13 30 Jan 2024 debug1: private host key #0: ssh-rsa SHA256:P7hrBl5uiQnS0Mru1RWFsrVUD+F769hF0z4Sbb5V938 debug1: private host key #1: ecdsa-sha2-nistp256 SHA256:L9+Esxp+q3B/k+P4lQGpaiYEz7VI2r2bxqd8DaF5dYk debug1: private host key #2: ssh-ed25519 SHA256:9gcLoXxQe8pryKRN7+LgwFR4OzTK/fUSoqn1/DFT0nk Missing privilege separation directory: /run/sshd

sudo lsof -i :14374 无输出

sudo systemctl status ssh –no-pager | grep -E “CGroup|Main PID” Main PID: 1195 (code=exited, status=0/SUCCESS)

sudo journalctl -u ssh –no-pager -n 30 Jun 03 10:38:36 aliyun sshd[43620]: Received disconnect from 218.104.71.178 port 53702:11: [preauth] Jun 03 10:38:36 aliyun sshd[43620]: Disconnected from authenticating user x3ea 218.104.71.178 port 53702 [preauth] Jun 03 10:38:41 aliyun sshd[43622]: dispatch_protocol_error: type 80 seq 2 [preauth] Jun 03 10:38:46 aliyun sshd[43622]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.104.71.178 user=x3ea Jun 03 10:38:47 aliyun sshd[43622]: Failed password for x3ea from 218.104.71.178 port 56608 ssh2 Jun 03 10:38:48 aliyun sshd[43622]: dispatch_protocol_error: type 80 seq 4 [preauth] Jun 03 10:38:48 aliyun sshd[43622]: Received disconnect from 218.104.71.178 port 56608:11: [preauth] Jun 03 10:38:48 aliyun sshd[43622]: Disconnected from authenticating user x3ea 218.104.71.178 port 56608 [preauth] Jun 03 10:39:15 aliyun systemd[1]: Reloading ssh.service - OpenBSD Secure Shell server… Jun 03 10:39:15 aliyun sshd[1195]: Received SIGHUP; restarting. Jun 03 10:39:15 aliyun sshd[1195]: Server listening on 0.0.0.0 port 22. Jun 03 10:39:15 aliyun sshd[1195]: Server listening on :: port 22. Jun 03 10:39:15 aliyun systemd[1]: Reloaded ssh.service - OpenBSD Secure Shell server. Jun 03 10:40:45 aliyun sshd[43806]: Received disconnect from 218.104.71.178 port 20409:11: [preauth] Jun 03 10:40:45 aliyun sshd[43806]: Disconnected from authenticating user x3ea 218.104.71.178 port 20409 [preauth] Jun 03 10:40:46 aliyun sshd[43810]: Received disconnect from 218.104.71.178 port 20773:11: [preauth] Jun 03 10:40:46 aliyun sshd[43810]: Disconnected from authenticating user x3ea 218.104.71.178 port 20773 [preauth] Jun 03 10:42:50 aliyun sshd[43882]: Connection closed by 8.139.112.115 port 26959 Jun 03 10:45:05 aliyun systemd[1]: Reloading ssh.service - OpenBSD Secure Shell server… Jun 03 10:45:05 aliyun sshd[1195]: Received SIGHUP; restarting. Jun 03 10:45:05 aliyun sshd[1195]: Server listening on 0.0.0.0 port 22. Jun 03 10:45:05 aliyun sshd[1195]: Server listening on :: port 22. Jun 03 10:45:05 aliyun systemd[1]: Reloaded ssh.service - OpenBSD Secure Shell server. Jun 03 10:47:41 aliyun sshd[44101]: Connection closed by 8.128.64.52 port 57381 Jun 03 10:52:35 aliyun sshd[44144]: Connection closed by 8.128.98.3 port 58777 Jun 03 10:57:29 aliyun sshd[44185]: Connection closed by 8.128.67.59 port 56795 Jun 03 11:07:06 aliyun systemd[1]: Stopping ssh.service - OpenBSD Secure Shell server… Jun 03 11:07:06 aliyun systemd[1]: ssh.service: Deactivated successfully. Jun 03 11:07:06 aliyun systemd[1]: Stopped ssh.service - OpenBSD Secure Shell server. Jun 03 11:07:06 aliyun systemd[1]: ssh.service: Consumed 1.632s CPU time.

Stopping ‘ssh.service’, but its triggering units are still active: ssh.socket

你的系统使用的是 ssh.socket 激活模式,而不是直接启动 ssh.service。 在 socket 激活模式下:

ssh.socket 监听端口(22)

当有连接进来时,ssh.socket 才启动 ssh.service 来处理

这意味着 sshd 进程本身不直接监听端口,而是由 ssh.socket 监听

所以你修改 sshd_config 中的 Port 是无效的,因为真正监听端口的不是 sshd,而是 systemd 的 socket 单元。

修改方案:修改 ssh.socket 监听的端口 (Drop-in 覆盖):另外写了一个补充协议(override.conf)

10.sudo systemctl edit ssh.socket

[Socket] ListenStream=14374

然后重载并重启

sudo systemctl daemon-reload sudo systemctl restart ssh.socket

验证端口

sudo ss -tlnp | grep 14374

1. 直接查看 socket 状态(最关键的)

sudo systemctl status ssh.socket

ssh.socket: Failed to create listening socket ([::]:14374): Address already in use

ssh.service 占用了端口

删除了原来sshd_config 中的 Port 14374,但是sudo systemctl start ssh.socket 还是失败了

根据我们之前的对话,我帮你总结一下修改 SSH 端口的完整操作流程,包括踩坑和解决方案。


📋 完整操作流程总结

一、初始目标

将阿里云 Ubuntu 服务器的 SSH 端口从默认的 22 改为 14374,提高安全性。


二、操作步骤与踩坑记录

第 1 步:修改 sshd_config(第一次踩坑)

操作

sudo vi /etc/ssh/sshd_config
# 将 #Port 22 改为 Port 14374

踩坑

发现过程

sudo systemctl status ssh
# 显示 TriggeredBy: ● ssh.socket
# 说明 ssh.service 是被 socket 触发的

解决方案


第 2 步:尝试配置 ssh.socket(第二次踩坑)

操作

sudo systemctl edit ssh.socket

在编辑器中添加:

[Socket]
ListenStream=14374

踩坑

错误日志

ssh.socket: Failed to create listening socket ([::]:14374): Address already in use
ssh.socket: Failed with result 'resources'

解决方案

正确位置

### Editing /etc/systemd/system/ssh.socket.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file

[Socket]
ListenStream=14374

### Edits below this comment will be discarded

第 3 步:端口冲突问题(第三次踩坑)

问题

ssh.socket: Failed to create listening socket ([::]:14374): Address already in use

原因分析

解决方案

# 1. 清理所有自定义配置
sudo rm -rf /etc/systemd/system/ssh.socket.d

# 2. 禁用自动生成器
sudo systemctl mask sshd-socket-generator

# 3. 清理自动生成的配置
sudo rm -rf /run/systemd/generator/ssh.socket.d

# 4. 重新创建干净的配置
sudo mkdir -p /etc/systemd/system/ssh.socket.d
echo -e "[Socket]\nListenStream=14374\nFreeBind=yes" | sudo tee /etc/systemd/system/ssh.socket.d/override.conf

# 5. 重载并启动
sudo systemctl daemon-reload
sudo systemctl start ssh.socket

第 4 步:只监听 IPv6 的问题(第四次踩坑)

问题

ssh -p 14374 localhost
# Connection refused

# 查看监听端口
sudo ss -tlnp | grep 14374
# 只显示 [::]:14374(IPv6),没有 0.0.0.0:14374(IPv4)

原因

解决方案

# 修改配置,同时监听 IPv4 和 IPv6
sudo systemctl edit ssh.socket

修改为:

[Socket]
ListenStream=0.0.0.0:14374
ListenStream=[::]:14374
FreeBind=yes
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket

验证

sudo ss -tlnp | grep 14374
# 应该看到两行:
# LISTEN 0 4096 0.0.0.0:14374 0.0.0.0:*
# LISTEN 0 4096 [::]:14374 [::]:*

三、最终成功状态

# 监听端口
$ sudo ss -tlnp | grep 14374
LISTEN 0 4096 0.0.0.0:14374 0.0.0.0:* users:(("systemd",pid=1,fd=72))
LISTEN 0 4096 [::]:14374 [::]:* users:(("systemd",pid=1,fd=72))

# SSH 服务状态(由 socket 触发)
$ sudo systemctl status ssh
○ ssh.service - OpenBSD Secure Shell server
     TriggeredBy: ● ssh.socket
     Active: inactive (dead)

# Socket 状态
$ sudo systemctl status ssh.socket
● ssh.socket - OpenBSD Secure Shell server socket
     Listen: 0.0.0.0:14374 (Stream)
             [::]:14374 (Stream)
     Active: active (listening)

四、阿里云安全组配置

在阿里云控制台添加入方向规则:


五、踩坑总结

序号踩坑内容原因解决方案
1修改 sshd_config 不生效系统使用 socket 激活模式改为修改 ssh.socket
2systemd edit 配置被忽略写在了 discard 注释后面确保配置写在注释之前
3Address already in use多个配置冲突清理所有配置,重新创建
4只能监听 IPv6ListenStream=14374 默认 IPv6明确指定 0.0.0.0:14374 和 [::]:14374
5ssh.service 占用端口两种模式同时启用确保 ssh.service 已停止和禁用

六、关键命令速查

# 查看 Socket 配置
sudo systemctl cat ssh.socket

# 编辑 Socket 配置
sudo systemctl edit ssh.socket

# 重启 Socket
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket

# 查看监听端口
sudo ss -tlnp | grep 14374

# 停止传统 SSH 服务(避免冲突)
sudo systemctl stop ssh
sudo systemctl disable ssh

# 测试连接
ssh -p 14374 localhost

七、与 22 端口相比的优势

修改完成后:


注意:以上流程基于 Ubuntu 系统的 socket 激活模式。如果你使用的是其他发行版或传统模式,步骤会有所不同。

当你有一台有静态ip的服务器时,最先需要做的:

1.禁止密码认证

2.改变ssh 端口

3.白名单用户登录