无法通过公网IP建立SSH连接至Ubuntu服务器(端口22连接被拒绝)
我之前也碰到过几乎一模一样的问题,结合自己踩过的坑和服务器配置的常见误区,给你列几个按优先级排序的排查步骤,一步步来大概率能解决:
1. 先确认你的公网IP是否真的指向服务器
局域网内用本地IP能连,说明SSH服务本身没问题,但公网IP可能根本没走到你的服务器:
- 在Ubuntu服务器上执行
curl ifconfig.me(或者wget -qO- ifconfig.co),拿到服务器的公网IP并记下来 - 回到你的MacBook,执行
ping 刚才拿到的公网IP,看看能不能ping通。如果ping不通,要么是你的ISP给的是共享公网IP(CGNAT),这种情况没法直接用公网IP访问,得联系ISP要独立公网IP,或者用内网穿透工具;要么是路由器的WAN口没正确获取到公网IP
2. 检查路由器的端口转发配置(最容易踩坑的点)
公网流量要进到你的服务器,必须让路由器把22端口的请求转发到服务器的本地IP:
- 登录路由器管理后台(一般是192.168.1.1或者192.168.0.1),找到「端口转发」「虚拟服务器」这类选项
- 确认转发规则:外部端口填22,内部端口填22,内部IP填Ubuntu服务器的本地IP(比如192.168.1.100),协议选TCP(SSH用TCP协议)
- 注意有些路由器有多个WAN口,要确保规则应用到了你正在用的那个WAN口
- 别用DMZ主机(把整个服务器暴露在公网,不安全),老老实实配置端口转发就行
3. 重新核对服务器防火墙的规则
你说已经检查过防火墙,但可能漏了细节:
- 先看Ubuntu自带的ufw状态:
sudo ufw status verbose,确认有没有允许22端口的入站规则。如果规则是allow from 192.168.1.0/24 to any port 22,那只有局域网能连,公网会被挡住,得改成sudo ufw allow 22(或者更安全的,只允许你Mac的公网IP访问:sudo ufw allow from 你的Mac公网IP to any port 22) - 要是ufw没开,检查iptables:
sudo iptables -L -n,看有没有ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22这类规则,没有的话得手动添加
4. 排查ISP是否屏蔽了22端口
很多ISP会默认屏蔽22、80这类常用服务端口,防止用户搭建服务器:
- 先试试把SSH端口改成非标准端口,比如2222:
- 编辑SSH配置文件:
sudo nano /etc/ssh/sshd_config,找到Port 22改成Port 2222 - 重启SSH服务:
sudo systemctl restart sshd - 在ufw里添加新端口规则:
sudo ufw allow 2222 - 路由器端口转发也改成外部2222映射到服务器本地IP的2222
- 编辑SSH配置文件:
- 然后在Mac上用
ssh -p 2222 你的用户名@公网IP试试,如果能连,说明ISP确实屏蔽了22端口
5. 确认SSH服务监听的是所有网卡
有时候SSH可能只监听了本地回环或者局域网网卡,导致公网流量进不来:
- 执行
ss -tuln | grep ssh,看输出里有没有0.0.0.0:22(IPv4所有网卡)或者:::22(IPv6所有网卡) - 如果只有
127.0.0.1:22或者192.168.1.100:22,那得修改/etc/ssh/sshd_config,把ListenAddress改成ListenAddress 0.0.0.0,然后重启SSH服务
6. 其他小众排查点
- 看看服务器是不是开了VPN或者代理,导致公网路由异常,暂时关闭试试
- 有些路由器的「防DDOS」「入侵检测」功能可能误拦截SSH请求,暂时关闭测试
- Mac本地的防火墙也可能拦截出站SSH,去「系统设置-网络-防火墙」里确认有没有允许SSH出站
按这个顺序排查下来,应该能定位到问题。我当时是路由器端口转发把外部端口设成了80,改回22就立马连上了😂
内容的提问来源于stack exchange,提问作者wikninja




