You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无法通过公网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:
    1. 编辑SSH配置文件:sudo nano /etc/ssh/sshd_config,找到Port 22改成Port 2222
    2. 重启SSH服务:sudo systemctl restart sshd
    3. 在ufw里添加新端口规则:sudo ufw allow 2222
    4. 路由器端口转发也改成外部2222映射到服务器本地IP的2222
  • 然后在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

火山引擎 最新活动