AWS EC2仅放行22与8000端口无法连接,开放全TCP出站才可访问?
嘿,这个问题其实是AWS NACL的「无状态」特性在搞鬼,我给你掰扯清楚:
问题根源:NACL是无状态的安全组件
和EC2的安全组不一样,NACL是无状态的——简单说就是它不认“这个数据包是之前某个入站请求的响应”这件事,每一个进出的数据包都得单独匹配规则,完全不管上下文关联。
为什么SSH连不上?
当你从本地SSH到EC2的22端口时:
- 入站流量:你本地电脑会用一个随机的高端口(比如12345)发请求到EC2的22端口,这刚好匹配你NACL入站放行22端口的规则,能顺利进入实例。
- 出站流量:EC2要给你回数据,是从22端口发回你本地的12345端口,但你NACL出站只放行了22和8000端口,12345不在允许列表里,所以这个响应包直接被拦截了,SSH自然连不上。
为什么curl 8000也失败?
道理和SSH一模一样:
- 入站流量:你本地用随机高端口(比如54321)请求EC2的8000端口,符合入站规则,能到达实例。
- 出站流量:EC2从8000端口回包到你本地的54321端口,这个54321属于高端口范围,不在你出站放行的22/8000里,所以回包被拦,curl拿不到结果。
解决办法
因为TCP通信是双向的,你需要在NACL的出站规则里加上TCP 1024-65535端口的放行规则——这是客户端发起请求时默认使用的随机高端口范围,这样EC2的响应包就能顺利回到你的本地设备了。
如果想更严谨,你可以把这个高端口的放行范围限制在你本地的公网IP段内,但测试阶段直接放行1024-65535是最省事有效的方式。
内容的提问来源于stack exchange,提问作者Aldy syahdeini
相关产品推荐
相关产品推荐

