亚马逊云32核账号 AWS亚马逊云端口不通排查
你盯着终端里那行刺眼的 Connection refused 或干脆卡在 Connecting to xxx... 半分钟不动,手边咖啡凉了三轮,心里默念八百遍“我明明开了80端口”,然后默默打开AWS控制台——恭喜,你正式加入「AWS端口不通排查者联盟」,会员证是黑眼圈,入会仪式是反复刷新安全组页面。
别急,这不是玄学,是逻辑链。AWS端口不通,从来不是“它不让我通”,而是“某处悄悄拦了你一道”。今天咱不画架构图、不背术语定义,就按你真实排查顺序,一层一层扒开,像剥洋葱——辣眼睛但管用。
第一层:安全组(Security Group)——最常被误杀的“守门员”
90%的端口不通,死在这儿。安全组不是防火墙,是“有状态的虚拟守门员”:它只管进(Inbound),不管出(Outbound);只检查连接发起方的IP和端口,不关心你本地有没有防火墙。
查法直给:
- 进EC2控制台 → 找到你的实例 → 点“安全组”标签页 → 看关联的安全组名;
- 点进去 → 切到“Inbound rules” → 检查有没有规则允许你的访问源(比如你的办公室IP、跳板机IP、或干脆
0.0.0.0/0)访问目标端口(比如TCP 80、22、3306); - 重点陷阱:规则里写的“Source”是谁来连你,不是“你连谁”;端口填的是你要暴露的端口,不是你本地的源端口;协议选TCP别错成UDP(HTTP/SSH/MySQL全是TCP)。
顺手验证:用 curl -v http://你的公网IP 或 telnet 你的公网IP 22(Linux/macOS)试试。如果秒拒,大概率就是这关没过。
第二层:网络ACL(Network ACL)——那个沉默的“双刃剑”
安全组管实例,网络ACL管子网。它无状态、规则按序号执行、默认拒绝所有——而且进出都要配!很多人只配了Inbound,忘了Outbound回包规则,结果SYN发出去了,SYN-ACK卡在半路。
查法直给:
- 进VPC控制台 → 左侧“Network ACLs” → 找到你实例所在子网关联的ACL;
- 点开 → 看“Inbound Rules”和“Outbound Rules”两栏;
- 确认:Inbound里有允许你源IP访问目标端口的规则(如100号规则:TCP 80,源IP段,ALLOW);
- 同样,Outbound里必须有允许响应流量返回的规则(如110号规则:TCP 1024-65535,目标IP段,ALLOW——因为客户端用随机高端口接收响应)。
小技巧:临时把Outbound全设成 0.0.0.0/0 ALLOW,如果通了,就是Outbound漏规则。别长期这么干,但排查时很灵。
第三层:实例本身——它醒着吗?监听吗?
安全组放行了,ACL也点头了,但实例可能正睡着、挂了、或压根没跑服务。
三步速检:
- 状态检查:EC2控制台看实例状态是否为“running”,系统状态检查(System Status Check)是否绿色。黄色?重启试试(不是终止!);
- 登录验证:用SSH(Linux)或RDP(Windows)连上去。连不上?先回头再看前两层;能连上?继续;
- 服务监听:Linux下敲:
sudo ss -tuln | grep :80(看80端口是否LISTEN)
或sudo netstat -tuln | grep :3306
Windows用:netstat -ano | findstr :80。没输出?服务根本没启动,或者绑错了IP(比如只绑了127.0.0.1,没绑0.0.0.0)。
常见坑:Web服务器配置里写了 Listen 127.0.0.1:80 —— 这等于“只欢迎localhost敲门”,公网IP敲门直接无视。改成 Listen 0.0.0.0:80 或删掉IP段即可。
第四层:VPC网络路径——流量走对路了吗?
公有子网没配Internet Gateway?私有子网想直连公网却没走NAT网关?路由表写错了?这些会让流量在VPC里迷路。
查法直给:
- 进VPC控制台 → “Route Tables” → 找到你实例所在子网关联的路由表;
- 看“Routes”标签页:公有子网必须有
0.0.0.0/0 → igw-xxxxx(指向Internet Gateway); - 私有子网必须有
0.0.0.0/0 → nat-xxxxx(指向NAT网关); - 确认子网确实关联了这张路由表(Subnet Associations里有你子网ID)。
额外检查:Internet Gateway是否已附加到VPC?NAT网关是否处于“available”状态?它的弹性网卡是否在公有子网?—— NAT网关自己得能上网,才能帮你转发。
第五层:IP地址与DNS——你以为的IP,可能不是它
实例有公网IP吗?是自动分配的还是Elastic IP?DNS解析对了吗?
避坑清单:
- EC2实例若在私有子网,默认没有公网IP,即使你开了安全组也没用;
- 公有子网实例若没勾选“Auto-assign Public IP”,启动后也不会有公网IP;
- 用了Elastic IP?确认它已正确关联到实例(不是关联到网卡ID,是实例ID);
- 用域名访问?
nslookup your-domain.com看解析的IP是不是你刚配的EIP;ping一下,看通不通——别信浏览器缓存。
第六层:操作系统防火墙——Linux的iptables / Windows Defender
AWS不管你系统里装没装防火墙,但你的OS会拦。
Linux(CentOS/RHEL):sudo iptables -L -n 看规则;若看到REJECT链,临时清空:sudo iptables -F(重启后恢复,仅用于测试);
Ubuntu用 sudo ufw status,若active,sudo ufw allow 80。
Windows:
进“高级安全Windows Defender防火墙” → 入站规则 → 确认对应端口(如TCP 80)规则是“已启用”且“配置文件”包含你当前网络类型(域/专用/公用)。
终极组合技:抓包定位
亚马逊云32核账号 以上全过?还通不了?祭出tcpdump:
sudo tcpdump -i any port 80 -nn(Linux)
然后另开终端,从外面 curl http://你的IP。
如果tcpdump没抓到任何SYN包 → 流量根本没到实例(前五层问题);
如果抓到了SYN但没SYN-ACK → 实例没响应(服务没监听/OS防火墙拦了);
如果SYN-ACK发出了但你收不到 → 网络路径或客户端问题。
最后送一句大实话:AWS控制台刷新三次,比读十页文档更接近真相。排查时,别猜,动手——敲命令、点按钮、看日志。端口不通不是故障,是AWS在温柔提醒你:“嘿,朋友,咱们一起把这条数据流的通关文牒,一关一关盖完章。”

