【问题标题】:Running an ftp server on nixos在 nixos 上运行 ftp 服务器
【发布时间】:2019-07-15 10:52:23
【问题描述】:

我想在 nixos 主机上运行一个 ftp 服务器。我正在使用 vsftpd,但如果这会有所作为,我可以使用其他东西。

ftp 在 localhost 上运行良好,但防火墙阻止我远程使用。我已经允许 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
  • 问题是关于使用 Nix 编程语言与 Nix 模块系统对话,这是一个用于表达、组合和内省系统配置等的库。
  • 感谢您的建议,我已将当前代码添加到问题中。
  • 如果您的活动模式有问题,那么是本地防火墙阻止了连接。同样,不是编程问题。或者使用更好的 FTP 客户端,它支持被动模式(除了 Windows 内置的ftp 之外,都支持)。
  • 很遗憾,被动模式也不起作用(上面添加的示例)

标签: ftp firewall nixos vsftpd


【解决方案1】:

在被动模式下,客户端将通过第二个连接连接到服务器,该连接用于传输“事物”(目录列表、文件)。在你的情况下:

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 中设置它们。您可能希望打开一小部分端口并在防火墙中打开这些端口。

【讨论】:

  • 宾果游戏,感谢您分享此内容。作为记录,我将extraConfig = "pasv_min_port=56250\npasv_max_port=56260";networking.firewall = { allowedTCPPortRanges = [ { from = 56250; to = 56260; } ]; }; 添加到我的配置中,这样就成功了。
【解决方案2】:

要在防火墙中打开端口,请使用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 似乎并不能解决它。我四处寻找其他人做同样事情的例子,但一无所获。
  • 端口 20 是传入端口(对于本地计算机)。它必须在本地机器上启用,而不是在服务器上。
  • 谢谢。我已经尝试过了(通过设置networking.firewall.allowedTCPPorts,在客户端主机上启用端口20,如上所述);还是没有骰子。
  • 你是怎么做到的?你甚至可以用你的 nixos 脚本控制本地防火墙吗?向我们展示问题中的完整脚本。
  • 您是在主动还是被动模式下开始传输。 FTP 需要两个连接。第一个连接是 controll 并使用端口 21。第二个连接使用不同的端口,并根据模式由客户端或服务器启动。 IE。在被动模式下,您必须打开服务器上的其他端口,在主动模式下,您必须在客户端打开端口。
猜你喜欢
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多