FTP服务器地址

在PC的文件管理器下打开下面的URL:

1
ftp://192.168.1.1/

前言

尝试过在openwrt环境下使用Docker搭建Pure-FTPdvsftpd 的容器,但是都失败了,也试过不使用docker容器,而是直接把服务器软件安装在openwrt小主机上,也失败了,因为opkg insta vsftpdopkg insta Pure-FTPd都无法下载FTP服务器软件到小主机上,可能是因为openwrt是Linux的精简阉割版,很多Linux相关的程序和应用都被删去了以便减小系统体积,甚至连grep命令都没有。

docker搭建FTP服务器碰到的问题

1.无法登录FTP服务器

使用Pure-FTPdvsftpd成功搭建并运行过容器,但是总是出现问题。vsftpd的问题是无法登录ftp服务器,设置好用户名和秘密后登不上去,即使是匿名模式,登录上去也只能看到有什么文件,无法进行下载和上传。

2.无法上传或下载文件

Pure-FTPd能登录到FTP服务器,但是无法下载或者上传服务器上的文件,应该是服务器端的权限问题,但是即使把FTP服务器的存储目录/opt/docker/ftp权限改为777,当上传新的文件到FTP服务器存储文件夹下时,新文件的权限仍然不是777,而是rwxr--r--之类的,除非手动输入一遍chmod命令再次强制把存储目录下所有文件权限递归修改为777,但是之后上传新文件仍然会遇到无法复制下载的问题,无法从根本解决问题。

umask

出现上面各种权限问题的根本原因是umask。要在vsftpd中设置正确合理的umask才能使得匿名模式下大家都能上传或下载文件,才能正常使用FTP服务器。

什么是umask?

umask用户文件创建模式掩码)是一种权限控制机制,用于限制新建文件或目录的默认权限。系统在创建文件和目录时,会使用系统默认的最大权限减去 umask 的值,最终得到新文件的权限。

umask 的计算规则: 新文件的权限 = 最大默认权限 - umask

最大默认权限

  • 文件:666(可读可写,但无执行权限)
  • 目录:777(可读、可写、可执行)

umask

umask 的作用

  1. 控制新文件和目录的默认权限。
  2. 保护系统安全:通过限制新文件的权限,防止用户不小心创建了过于开放的文件(如 777)。
  3. 减少人为错误:确保文件默认不会对所有人开放写权限,避免意外篡改。

常见 umask 值和含义

  • 022:文件权限为 644,目录权限为 755(常用,组和其他用户无写权限)。
  • 002:文件权限为 664,目录权限为 775(组用户有写权限)。
  • 077:文件权限为 600,目录权限为 700(仅所有者有读写执行权限)。
  • 000:文件和目录都拥有最大权限(777 和 666)。

四位数的 umask 和三位数的区别

umask 有时候会显示为四位数,而有时候显示为三位数。两者的区别在于前导位(第一位)的含义。

三位数 umask(常见):用于控制文件的权限位

四位数 umask:第一位用于控制特殊权限位(如 SUID、SGID 和粘滞位)。

后面三位的数字作用是一样的,就是要减去的权限。不同点在于第一位数字是用于特殊权限位。

0:不设置任何特殊权限。

1:设置粘滞位。

2:设置 SGID 位。

4:设置 SUID 位。

配置FTP服务器

没必要自己费心费力去折腾Pure-FTPd或者vsftpd的docker容器或软件,openwrt本身自带FTP服务器功能!

打开网络存储选项即可看到FTP服务器,做好相应的配置即可。这个有UI界面的FTP服务器是通过openwrt的软件包luci-app-vsftpd实现的。

openwrt上的FTP服务器选项

自带的luci-app-vsftpd

openwrt小主机设置

通过xshell连接openwrt小主机,新建文件夹/opt/docker/ftp递归地(-R)将 ./ftp/ **目录及其所有子目录和文件的权限设置为 777**,当上传新文件后无法下载时可以重做这一步,如果已有的文件或文件夹权限不是777,做完这一步也会变为777

1
chmod -R 777 ./ftp/

新建ftp文件夹

vsftpd.conf配置

vsftpd的配置文件在openwrt的/tmp/run/vsftpd/vsftpd.conf 路径下,下面的配置是能正常使用匿名模式进行上传和下载的配置。

最重要的是下面几项:

  • local_umask=000 : 为本地用户创建的文件设置权限。000 表示文件将具有最大权限(666 文件权限或 777 目录权限)。
  • anon_umask=000 : 匿名用户的 umask,设置为 000 表示匿名用户上传的文件或目录拥有最大权限。
  • no_anon_password=YES : 匿名用户无需密码即可登录。
  • ftp_username=ftp : 默认的 FTP 用户名。
  • user_config_dir=/var/run/vsftpd/users :每个用户的配置文件所在目录。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
background=YES
listen_port=21
ftp_data_port=20
pasv_min_port=50000
pasv_max_port=51000
write_enable=YES
download_enable=YES
dirlist_enable=YES
ls_recurse_enable=YES
force_dot_files=NO
local_umask=000
ftpd_banner=Welcome
dirmessage_enable=NO
message_file=.message
port_enable=YES
pasv_enable=YES
ascii_download_enable=YES
ascii_upload_enable=YES
idle_session_timeout=1800
connect_timeout=120
data_connection_timeout=120
max_clients=0
max_per_ip=0
local_max_rate=0
max_login_fails=3
ftp_username=ftp
anon_world_readable_only=NO
anonymous_enable=YES
no_anon_password=YES
anon_root=/opt/docker/ftp
anon_umask=000
anon_max_rate=0
anon_mkdir_write_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES
syslog_enable=NO
xferlog_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
guest_enable=YES
guest_username=ftp
uci_config_name=vsftpd
user_config_dir=/var/run/vsftpd/users
allow_writeable_chroot=YES
secure_chroot_dir=/var/run/vsftpd/empty
local_enable=YES
seccomp_sandbox=NO
use_localtime=YES

UI页面设置

匿名用户设置

匿名用户设置

虚拟用户设置

虚拟用户设置

监听设置

监听设置

全局设置

全局设置

本地用户与连接设置

本地用户与连接设置

登录FTP服务器

成功配置好之后可以在文件管理器输入ftp://192.168.1.1/访问FTP服务器,然后就可以把FTP服务器上的文件下载到本地PC中或者上传本地文件到FTP服务器上。

整个FTP服务器是放在小主机上的,小主机是2.5G网口,直连路由器也是千兆的,所以下载上传速度都挺快的,不用受限于互联网带宽。

成功使用匿名模式登录到ftp服务器

如果是特定用户,也可以点击右键的登录按钮使用账号密码登录

使用账号秘密登录

防火墙

如果突然登录不上FTP服务器或者出现异常情况,可以检查一下是不是防火墙的问题,特别是有没有开放对应的端口。控制端口和数据传输端口是不一样的,数据传输端口可以打开多个端口,不过我好像没怎么设置过,也可能是之前部署容器的时候设置过了,反正有异常就检查一下防火墙吧。

总结

现在FTP服务器也就在局域网用下,配置起来还挺麻烦的,特别是在openwrt这种阉割版环境中更加难用。不过这次实在是要用到没办法了,本来openwrt用的是64GB的硬盘,现在剩余的空间只剩下20GB左右了,也存不了什么东西。

当前比较流行的解决方案是Samba了,不过没了解过Samba,不知道是啥东西,以后有机会再研究下。