改port不生效需先确认sshd是否监听新端口,常见原因有未重启服务、防火墙拦截、selinux拒绝;禁用密码登录后须确保authorized_keys权限为600且公钥完整;allowusers优先于permitrootlogin生效;减少扫描需配合listenaddress和addressfamily限制监听地址与协议。

直接改 Port 不生效?先确认服务是否在监听新端口
改完 /etc/ssh/sshd_config 里的 Port 后连不上,八成不是配置写错了,而是 sshd 根本没在新端口上监听。常见原因有三个:配置没重载、防火墙拦着、SELinux 拒绝新端口。
验证监听状态用这条命令:sudo ss -tulnp | grep sshd。如果输出里只有 :22,说明新端口没生效;如果看到 :2222(或你设的端口)但还是连不上,大概率是防火墙或 SELinux 挡住了。
- 必须执行
sudo systemctl restart sshd(不是 reload),否则改动不加载 - firewalld 用户要加规则:
sudo firewall-cmd --add-port=2222/tcp --permanent && sudo firewall-cmd --reload - SELinux 启用时(
sestatus显示 enforcing),得手动放行:sudo semanage port -a -t ssh_port_t -p tcp 2222
PasswordAuthentication no 启用后连不进去了?密钥没配全
禁用密码登录后,SSH 只认公钥。但很多人只生成了密钥,却漏了关键两步:把公钥放进服务器的 ~/.ssh/authorized_keys,且该文件权限不对。
典型错误现象是客户端报 Permission denied (publickey),而服务器日志(sudo tail -f /var/log/auth.log)里显示 Authentication refused: bad ownership or modes for directory /home/user/.ssh。
- 确保
~/.ssh目录权限是700:chmod 700 ~/.ssh - 确保
~/.ssh/authorized_keys权限是600:chmod 600 ~/.ssh/authorized_keys - 公钥内容必须完整复制,不能多空格、少换行;建议用
ssh-copy-id -p 2222 user@host自动完成
PermitRootLogin no 和 AllowUsers 冲突时以谁为准?
两者不冲突,但生效顺序有讲究:AllowUsers 是第一道门禁,它先过滤掉所有不在名单里的用户;之后才检查 PermitRootLogin。也就是说,如果你在 AllowUsers 里写了 alice,那即使 PermitRootLogin yes,root 也进不来。
反过来,如果 AllowUsers 为空或注释掉,PermitRootLogin no 才真正起作用——此时 root 被明确拒绝,其他普通用户仍可登录。
- 推荐组合:
PermitRootLogin no+AllowUsers alice bob,双重保险 - 注意语法:多个用户名用空格分隔,不能用逗号;支持
user@ip限定来源 IP - 修改后务必测试新用户能否登录,再登出当前会话,避免把自己锁在外面
为什么改了端口还被扫?ListenAddress 和 AddressFamily 得配合着调
只改 Port 不够,攻击者仍可能通过 IPv6 或特定网卡找到你。比如服务器有公网和内网双网卡,若 ListenAddress 没限制,默认 0.0.0.0 会监听所有 IPv4 接口,包括你不希望暴露的公网地址。
更隐蔽的做法是:指定只监听内网 IP,并关闭 IPv6(除非真需要):
- 在
sshd_config中设置:ListenAddress 192.168.1.100(替换成你的内网 IP) - 加上:
AddressFamily inet(强制只用 IPv4) - 然后重启
sshd,再用ss -tuln | grep :2222确认监听地址是否已变成192.168.1.100:2222
这一步容易被跳过,但对减少无效扫描量效果明显——很多自动化工具只扫默认网关段或 IPv6 地址,不会主动探测你内网段的非标端口。










