我最近尝试在我的其中一台 FreeBSD 服务器上设置 jail,并且在尝试通过 FTP 下载 FreeBSD 软件包时遇到了奇怪的错误。
我在 PF 防火墙中制定了这些规则以允许在主机上下载软件包,这些软件包在主机上运行良好:
ext_if = "bge0"
# Allow downloads
pass out log on $ext_if proto tcp to any port {20, 21, 22, 80, 443}
# Special exception for FTP.
pass out log on $ext_if proto tcp to any port > 49151 keep state
但是当我尝试从监狱内部安装软件包时,FTP 连接就会超时。
我收到的错误消息如下:
%pkg_add -vr bash
[snipped FTP connection setup]
>>> CWD pub/FreeBSD/ports/amd64/packages-8.1-release/Latest
<<< 250 CWD command successful.
>>> MODE S
<<< 200 MODE S accepted.
>>> TYPE I
<<< 200 Type set to I.
binding data socket
>>> PORT 82,103,140,25,229,3
<<< 200 PORT command successful.
initiating transfer
>>> RETR bash.tbz
<<< 425 Can't build data connection: Operation timed out.
Error: Unable to get ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8.1-release/Latest/bash.tbz: Can't open data connection
pkg_add: unable to fetch 'ftp://ftp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8.1-release/Latest/bash.tbz' by URL
pkg_add: 1 package addition(s) failed
我是不是漏掉了什么?我希望我可以配置 pkg_add 使用 HTTP 而不是 FTP(我不知道为什么 FreeBSD 仍然使用这个可怜的协议),但似乎需要 FTP 来操作 FreeBSD 的软件包系统,我不知道如何让它与防火墙一起工作。欢迎提出任何建议 :)
答案1
默认情况下,FTP 使用所谓的“主动”模式进行数据传输,这种模式对防火墙不太友好。在此模式下,FTP 服务器连接到客户端发送的 PORT 命令中指定的 IP:端口(在您的情况下为 82.103.140.25:58627)。
修复此问题最简单的方法是将 FTP 传输模式从“主动”切换到“被动”。对于使用 fetch(1) 进行文件检索的“pkg_add”,可通过设置环境变量 FTP_PASSIVE_MODE 来完成。
答案2
您可以尝试ftp-proxy(8)
使用anchor "ftp-proxy/*"