直接改port行不一定生效,需确保sshd_config中仅保留一条未注释的port指令,检查语法、防火墙、selinux、端口占用及客户端工具显式指定端口。

直接改 Port 行就能生效?别急,先看配置文件里有没有多个 Port
很多用户改完 /etc/ssh/sshd_config 里的 Port 22 为 Port 2222,重启后还是只能用 22 连——因为配置文件里可能已有另一条未注释的 Port 行,或者旧的 Port 22 没被注释掉。sshd 会监听所有未注释的 Port 行,不是只认最后一行。
正确做法是:
- 用
grep -v "^#" /etc/ssh/sshd_config | grep "Port "查出所有生效的端口行 - 确保只保留你想要的那一条,比如
Port 2222 - 如果想临时双端口过渡,可写两行:
Port 22和Port 2222,但确认新端口连通后再删掉Port 22 - 改完务必检查缩进和空格:
Port2222(没空格)是无效语法,必须是Port 2222
防火墙放行了,但连不上?检查 sshd 是否真在监听新端口
重启 sshd 后不等于它就绑定了新端口。常见原因是端口被占用、SELinux 拦截,或服务根本没起来。
验证方式:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 运行
sudo ss -tlnp | grep ':2222'(把 2222 换成你的端口号),看输出里是否有sshd进程 - 如果没有,查日志:
sudo journalctl -u sshd --since "1 minute ago",重点找bind: Permission denied或Address already in use - 若看到
Permission denied且系统启用了 SELinux(sestatus显示enabled),需补加端口上下文:sudo semanage port -a -t ssh_port_t -p tcp 2222 - 若提示地址已被占用,用
sudo ss -tulpn | grep ':2222'找出是哪个进程占的,再决定杀还是换端口
ufw / firewalld / iptables —— 该用哪个命令取决于你实际在跑的防火墙
不是所有系统都用同一套防火墙。硬套教程命令容易白忙活:
- Debian/Ubuntu 默认用
ufw:sudo ufw allow 2222/tcp,然后sudo ufw reload - RHEL/CentOS 7+ 默认用
firewalld:sudo firewall-cmd --permanent --add-port=2222/tcp+sudo firewall-cmd --reload - 老系统或手动配置的可能用
iptables:sudo iptables -I INPUT -p tcp --dport 2222 -j ACCEPT,但规则重启后丢失,需保存(如sudo iptables-save > /etc/iptables/rules.v4) - 云服务器(阿里云、腾讯云等)还有安全组一层,必须单独在控制台开放对应端口,否则本地防火墙再怎么配也没用
改完端口,scp、rsync、git 这些工具全连不上?记得加 -P 或 --port
SSH 端口改了,所有基于 SSH 协议的工具默认仍走 22。它们不会自动读取 sshd_config,得显式指定:
-
scp -P 2222 file user@host:/path(注意是大写P) -
rsync -e "ssh -p 2222" ...(小写p) - Git over SSH:在 remote URL 里写成
ssh://user@host:2222/path,或配~/.ssh/config:
Host myserver
HostName host.example.com
User user
Port 2222
配完之后 git clone myserver:/path 就能自动走 2222。
最容易被忽略的是:改端口后,~/.ssh/config 里已有的主机别名若没更新 Port 字段,后续所有通过该别名的操作都会失败,而且错误提示常是 “Connection refused”,而不是“端口不对”。










