EC2中Docker容器1880端口无法从公网访问的排查求助
根据你描述的情况——本地能通、22端口正常但1880端口无流量到达主机,咱们一步步拆解排查:
优先核查EC2安全组规则
网络ACL是无状态全允许,但安全组是状态化的,这是最容易疏漏的点。登录AWS控制台,找到你的EC2实例绑定的安全组,检查入站规则是否添加了允许TCP 1880端口的条目(测试阶段可以把来源设为0.0.0.0/0,之后再缩窄到指定IP)。注意别选错了实例对应的安全组,有时候会不小心关联到其他未配置的组。验证Docker端口映射是否生效
容器内部监听1880不代表EC2主机也在监听这个端口。在EC2本地执行:ss -tulpn | grep 1880如果没有输出,说明启动容器时缺少端口映射参数(比如
-p 1880:1880),需要重新启动容器,确保把容器的1880端口映射到EC2主机的1880端口。检查EC2本地防火墙规则
部分EC2镜像(比如Ubuntu、CentOS)自带防火墙工具,可能拦截了1880端口:- 对于Ubuntu的ufw:执行
ufw status,确认1880端口是否被允许; - 对于CentOS的firewalld:执行
firewall-cmd --list-ports,查看1880/tcp是否在允许列表中; - 对于原生iptables:执行
iptables -L -n | grep 1880,排查是否存在DROP或REJECT规则。
- 对于Ubuntu的ufw:执行
确认容器内服务的监听地址
如果容器里的服务只监听127.0.0.1,即使做了端口映射,外部也无法访问。进入容器执行:netstat -tulpn | grep 1880确保监听地址是
0.0.0.0(代表绑定所有网卡),而不是仅localhost。比如Node-RED默认是0.0.0.0,但如果自定义配置修改过就会出问题。修正tcpdump的捕获范围
你之前没抓到1880的数据包,可能是只监听了单个网卡。试试在EC2主机上执行:tcpdump -i any port 1880这个命令会捕获所有网卡的1880端口流量,之后再从公网发起请求,如果还是没抓到,说明流量根本没到达EC2主机,重点回到安全组和网络ACL的二次核查。
二次确认网络ACL的双向规则
虽然你说ACL是默认全允许,但还是要确认入站ACL允许TCP 1880,出站ACL允许所有响应流量(比如1024-65535端口的TCP)。ACL是无状态的,出站规则如果限制了响应端口,也会导致连接失败。
内容的提问来源于stack exchange,提问作者Mark Ryan

