在NixOS上运行FTP服务器

3

我想在NixOS主机上运行FTP服务器。我使用vsftpd,但如果有其他更好的选择也可以考虑。

本地主机上的FTP正常工作,但防火墙阻止我进行远程使用。我已允许TCP端口21,但这还不够。

我应该如何配置防火墙以允许FTP连接(包括向FTP服务器写入)?

以下是我目前的代码:

{
networking.firewall = { allowedTCPPorts = [ 20 21 ];
#                        connectionTrackingModules = [ "ftp" ];
                      };

  services.vsftpd = {
    enable = true;
#   cannot chroot && write
#    chrootlocalUser = true;
    writeEnable = true;
    localUsers = true;
    userlist = [ "martyn" "cam" ];
    userlistEnable = true;
  };
}

由此可知,任何远程主机使用ftp均失败:

ftp> put dead.letter
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.

使用被动模式(例如ftp -p)似乎对此没有帮助:

ftp> put dead.letter
227 Entering Passive Mode (192,168,0,7,219,202).
ftp: connect: Connection timed out

在禁用防火墙的一台临时主机上进行测试

networking.firewall.enable = false;

允许使用ftp -p命令;当然,关闭防火墙并不是一个理想的选择。

感谢任何帮助和指导。


NixOS 在这里被用作配置管理工具,类似于 chef - Robert Hensing
这个问题涉及使用 Nix 编程语言与 Nix 模块系统进行交互,后者是一个用于表达、组合和检视系统配置等功能的库。 - Robert Hensing
谢谢您的建议,我已经将我的当前代码添加到问题中。 - user3416536
如果您在使用主动模式时遇到问题,那么这是本地防火墙阻止了连接。再次强调,这不是编程问题。或者使用更好的FTP客户端,支持被动模式(除了Windows内置的ftp之外,所有客户端都支持)。 - Martin Prikryl
遗憾的是,被动模式也不起作用(示例已添加在上面)。 - user3416536
为了使被动模式正常工作,您需要在服务器上允许被动端口。 - Martin Prikryl
2个回答

5
在被动模式下,客户端将使用第二个连接与服务器连接,用于传输“东西”(目录列表,文件)。在您的情况下:
227 Entering Passive Mode (192,168,0,7,219,202)

服务器请求客户端在端口219 * 256 + 202 = 56266上连接。 该端口由vsftpd动态选择,并且未在防火墙中打开。您需要将vsftpd设置为固定端口以进行被动连接,并在防火墙中打开此连接。 vsftpd有两个配置选项可用于设置此内容:pasv_max_portpasv_min_port。您应该能够在services.vsftpd.extraConfig中设置它们。您可能希望打开一小段端口并在防火墙中开放这些端口。

1
非常感谢您的分享。为了记录,我在我的配置中添加了extraConfig = "pasv_min_port=56250\npasv_max_port=56260";networking.firewall = { allowedTCPPortRanges = [ { from = 56250; to = 56260; } ]; };,这样就解决了问题。 - user3416536

4
要在防火墙中打开端口,请使用networking.firewall.allowedTCPPorts。例如:
networking.firewall.allowedTCPPorts = [ 21 ];
services.vsftpd.extraConfig = ''
  pasv_enable=Yes
  pasv_min_port=51000
  pasv_max_port=51999
'';
networking.firewall.allowedTCPPortRanges = [ { from = 51000; to = 51999; } ];

防火墙配置在NixOS中不是自动的,因为这样会破坏对允许流量的控制的目的。
一些服务有一个openFirewall选项,以使此过程更容易,但vsftpd模块似乎没有提供此便利。
编辑:20是针对客户端的。只需要打开21。 编辑:还需要打开一系列用于被动模式连接的端口范围。

感谢 @robert-hensing。不幸的是,在添加20号端口似乎没有解决问题。我搜索了其他人做同样事情的示例,但没有找到任何东西。 - user3416536
1
端口20是一个传入端口(位于本地机器上)。它必须在本地机器上启用,而不是在服务器上。 - Martin Prikryl
谢谢。我已经尝试过了(通过设置networking.firewall.allowedTCPPorts来启用客户端主机上的20号端口),但仍然不行。 - user3416536
你是如何做到的?你能否使用你的nixos脚本控制本地防火墙?请在问题中展示完整的脚本。 - Martin Prikryl
1
你是在主动模式还是被动模式下开始传输?FTP需要两个连接。第一个连接是控制连接,使用21号端口。第二个连接使用不同的端口,根据模式由客户端或服务器启动。例如,在被动模式下,您必须在服务器上打开其他端口,在主动模式下,您必须在客户端侧打开端口。 - Matthias Wimmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接