AWS添加安全组TCP 21规则后FTP端口仍关闭,求排查原因
我来帮你梳理下可能导致这个问题的几个常见原因,毕竟我之前也踩过类似的FTP端口开放但外部连不上的坑:
被动模式端口未开放(最常见原因)
FTP协议分主动和被动两种模式:21端口只是控制端口,被动模式下还需要额外的数据端口范围来传输文件/目录列表。FileZilla服务器默认会用被动模式,如果你只在安全组开了21端口,外部客户端发起被动连接时,数据端口的流量会被拦截。
解决步骤:- 打开FileZilla Server,进入「设置」→「被动模式设置」
- 勾选「使用自定义端口范围」,比如设置
49152-65535(常用的被动端口段) - 回到AWS安全组,添加一条入站规则:协议选TCP,端口范围填你刚才设置的
49152-65535,来源设为0.0.0.0/0(或你的客户端公网IP,更安全)
实例内部防火墙拦截
AWS安全组是实例级的防护,但实例本身的操作系统防火墙也可能会挡住流量:- 如果你用的是Linux实例:执行
sudo ufw status(如果用ufw)或sudo iptables -L检查是否放行TCP 21和被动端口的入站流量,没有的话添加对应规则。 - 如果你用的是Windows实例:打开「Windows Defender防火墙高级设置」,确认是否有允许FileZilla Server或TCP 21、被动端口的入站规则,没有的话手动创建。
- 如果你用的是Linux实例:执行
FileZilla服务器绑定地址错误
确认FileZilla服务器是否监听了实例的公网IP或0.0.0.0(所有网卡):
进入FileZilla Server的「设置」→「监听地址」,如果只绑定了localhost或内网IP,外部请求到公网IP时,服务器根本没在这个IP上监听,自然连不上。改成0.0.0.0就能监听所有网卡的请求。AWS子网网络ACL限制
安全组是实例级的,而网络ACL是子网级的防火墙,如果你的实例所在子网的网络ACL没放行入站的21端口和被动端口,也会导致连接失败:
进入AWS控制台的VPC服务,找到实例所在的子网,查看对应的网络ACL,确保入站规则允许TCP 21和被动端口的流量,出站规则允许对应的返回流量(网络ACL是双向的,不像安全组是状态化的)。ISP封禁21端口
有些家用ISP会默认封禁FTP的21端口(出于安全或带宽限制),可以试试用手机热点连接测试,或者临时把FileZilla服务器的控制端口改成非21的端口(比如2121),然后在安全组开2121端口,再用外部客户端连接这个新端口验证。
建议按上面的顺序排查,先从被动模式端口这个最常见的原因开始,一般就能解决问题。
内容的提问来源于stack exchange,提问作者Juan Carlos Oropeza

