我正在尝试让我的应用程序在 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.
你能分享一下你的连接字符串吗?也许你忘了切换到被动模式。