Raspbian Stretch远程SSH连接(端口转发)无法正常工作
哇,花了10小时折腾这个确实够头疼的——我之前帮朋友排查过几乎一模一样的问题,咱们一步步来拆解,大概率能找到症结所在:
第一步:先确认你有没有真正的公网IP
很多运营商现在给家庭用户用CGNAT(Carrier-Grade NAT),也就是多个用户共享一个公网IP,这种情况下你自己做端口转发完全没用。
- 在树莓派上跑
curl ifconfig.me记下输出的IP - 切换到手机4G网络(别连家里WiFi),打开浏览器访问同一个地址,看两个IP是否一致
- 如果不一样,说明是CGNAT,得联系Telenor客服申请独立公网IP,或者用FRP、Ngrok这类内网穿透工具绕过去
第二步:核对路由器端口转发规则的细节
Belkin的路由器有时候规则设置容易踩坑:
- 确认你填的内网IP和树莓派的实际IP完全一致:在树莓派上跑
ip a看eth0(网线接口)的inet地址,别用WiFi的IP(你用的网线,所以看eth0) - 端口转发的协议必须选TCP,SSH只用TCP,选UDP的话肯定连不上
- 规则要确保是“启用”状态,有些路由器默认添加后是禁用的,得手动勾上
- 如果你改了公网端口(比如3322),测试的时候要指定端口:
ssh pi@你的域名 -p 3322或者ssh pi@公网IP -p 3322
第三步:检查树莓派的防火墙设置
Raspbian Stretch默认没开ufw,但万一你之前装了或者改了iptables:
- 先看ufw状态:
sudo ufw status - 如果显示
active,那得允许SSH端口:sudo ufw allow 22/tcp和sudo ufw allow 3322/tcp,然后重启ufw:sudo ufw reload - 要是用的原生iptables,跑
sudo iptables -L INPUT看有没有REJECT或者DROP规则挡住22端口,有的话得添加允许规则:sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
第四步:确认SSH服务配置和状态
你已经加了Port配置,但再核对一遍:
- 打开sshd_config:
sudo nano /etc/ssh/sshd_config,确保Port 22和Port 3322前面没有#注释,保存后重启服务:sudo systemctl restart sshd - 检查SSH服务是否在运行:
sudo systemctl status sshd,输出里应该有active (running),如果是failed,看日志找问题:sudo journalctl -u sshd
第五步:正确测试端口是否开放
别在自家WiFi下测试!很多路由器不支持NAT loopback(内网用公网IP访问自己会失败),必须用外部网络:
- 用手机4G,或者找朋友在外面的网络帮你测,比如用Linux/Mac终端跑
nc -zv 你的公网IP 22或者nc -zv 你的域名 3322,如果显示succeeded就是通的,失败的话继续排查 - 要是没有外部设备,也可以用手机上的端口扫描APP(比如Port Scanner)来测你的公网IP和端口
第六步:检查DNS解析是否同步
你用了domainnameshop的DNS,要确保域名解析的IP是当前的公网IP:
- 在外部网络(比如手机4G)跑
nslookup 你的域名,看返回的IP和树莓派上curl ifconfig.me的结果是否一致 - 如果不一致,可能是DNS缓存,或者你的DDNS(动态域名解析)没配置好——得确认路由器或者树莓派有没有在IP变化时自动更新域名解析,domainnameshop应该有对应的DDNS设置选项,你可以在路由器里找DDNS入口,填对服务商的信息
第七步:排查运营商端口封锁
Telenor可能会封锁常见端口(比如22),哪怕你做了转发也没用:
- 换个冷门端口试试,比如公网2222转发到树莓派22,然后用
ssh pi@你的域名 -p 2222测试 - 如果还是不行,直接联系Telenor客服,问他们是否封锁了你的端口,能不能解锁
先从公网IP和端口转发规则这两个最常见的坑查起,大概率能解决问题。如果还是卡壳,咱们再细化排查。
内容的提问来源于stack exchange,提问作者Fluesopp
相关产品推荐
相关产品推荐

