FTP 客户端在 Docker 容器内不起作用

FTP 客户端在 Docker 容器内不起作用

我正在尝试让我的应用程序在 Docker 中正常运行,但遇到了麻烦。

该应用程序使用 PASV 模式连接到远程 FTP 服务器,并 PUT 文件。非常简单,无需 docker 即可正常工作。FTP 服务器和客户端都不在任何 NAT 后面;但由于我使用的是 Docker 桥接网络,因此客户端变成了 NAT。(使用默认桥接配置http://pastie.org/10954592

如果我在运行客户端应用程序时查看 FTP 服务器上的 tshark,它会交换大量数据包,因此它正在“连接”到服务器,但应用程序没有收到任何回复。这让我假设,当 FTP 服务器尝试在该经验端口上响应时,它不会被从主机操作系统路由回 Docker 容器。

因此,希望总结一下,有没有什么好的方法可以让这些 pasv 端口正确转发到 docker 桥?约束:我无法控制生产中的 FTP 服务器,所以我不能简单地为 iptables 硬编码一个 pasv 端口列表。

感谢您的任何想法!

答案1

PASV FTP 在 Docker 容器内运行良好。

使用 Docker Swarm 变得更加困难,但使用单个副本或mode:global使用端口映射进行部署是可能的mode:host

由于 PASV 模式是有状态的,因此后续请求需要路由到集群中的同一个节点。

使用主机模式的示例堆栈

services:
  ftp:
    image: vendor/vsftpd
    ports:
      - { target: 20,    published: 20, mode: host }
      - { target: 21,    published: 21, mode: host }
      - { target: 21100, published: 21100, mode: host }
      - { target: 21101, published: 21101, mode: host }
      - { target: 21102, published: 21102, mode: host }
    deploy:
      mode: global

答案2

我已经测试了您的方案并且它在我这边没有任何问题。

root@testapp-ftp-6b66556854-fdgvs:/# ftp -p 172.21.131.137   
Connected to 172.21.131.137.
220 Welcome to XXX FTP K8s service.
Name (172.21.131.137:root): testuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (172,21,131,137,39,115).
150 Here comes the directory listing.
drwxrwxrwx    2 ftp      ftp             0 Jul 24 08:25 FTP
226 Directory send OK.

你能分享一下你的连接字符串吗?也许你忘了切换到被动模式。

相关内容