You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Spring Boot使用Apache Commons Net从FTP下载文件时遭遇“Changing source IP is not permitted by Firebox policy”错误的解决方案咨询

解决FTP下载时的"550 Permission denied (Changing source IP is not permitted by Firebox policy)"问题

这个错误的核心原因是FTP控制连接和数据连接的源IP不一致,触发了对方Firebox防火墙的策略限制。咱们一步步来解决:

1. 切换到FTP被动模式(PASV)

Apache Commons Net的FTPClient默认使用主动模式(PORT),这种模式下会出现源IP不一致的问题:

  • 你通过控制连接(21端口)登录FTP服务器时,源IP是Docker容器的出口IP
  • 下载文件时,客户端会通知服务器"来连接我的XX端口",服务器主动发起数据连接到该端口
  • 但Docker的NAT网络特性会让服务器看到的数据连接源IP变成宿主机IP,和控制连接的IP不一致,直接触发防火墙的"禁止源IP变更"策略

切换到被动模式就能解决这个问题——被动模式下是服务器打开一个端口,由客户端主动发起数据连接,此时数据连接的源IP和控制连接完全一致。修改你的代码:

FTPClient client = new FTPClient();
try (OutputStream os = new FileOutputStream(fileName)) {
    client.connect(url);
    boolean login = client.login(username, password);
    if (login) {
        System.out.println("Login success...");
        // 关键:切换到被动模式
        client.enterLocalPassiveMode();
        // Download file from FTP server.
        boolean status = client.retrieveFile(fileName, os);
        System.out.println("status = " + status);
        System.out.println("reply = " + client.getReplyString());
    }
} catch (IOException exception) {
    exception.printStackTrace();
}

2. 确认Docker网络的端口访问权限

如果切换被动模式后仍有问题,需要补充检查:

  • 确认FTP服务器的被动端口范围(通常是一段连续端口,比如21000-21999),确保Docker容器能正常访问这些端口
  • 避免使用会改变出口IP的网络配置,比如容器若使用代理,要保证代理不会修改FTP连接的源IP

3. 额外排查点

  • 可以通过client.getPassivePort()查看服务器返回的被动端口,验证容器是否能正常访问该端口
  • 若对方FTP服务器有IP白名单,确认Docker容器的出口IP在白名单内(登录成功说明控制连接的IP已被允许,被动模式下数据连接会复用该IP)

内容的提问来源于stack exchange,提问作者m3_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 18:12:49