搭建ftp服务过程记录

安装ftp服务器软件

sudo apt install vstfpd -y

修改配置文件

配置文件目录:/etc/vsftpd.conf , 也可以通过下面命令来查找:

sudo find /etc/ -name "vsftpd.conf"
sudo vi /etc/vsftpd.conf

具体的文件参照下面的

  • 值得注意的是这个配置文件是全局生效的,即不管你创建了多少个用户都只需要这一个文件即可
    • 同一个电脑处理安装docker类似的代理外,是不能开启多个ftp服务的
      • 问了chatgpt,让安装多个ftp服务工具,比如vsftpdproftpd,但是会存在文件冲突

配置文件

cat /etc/vsftpd.conf
# Example config file /etc/vsftpd.conf

# 如果打开ipv4,关闭ipv6,会出问题:端口不监听,服务无效,原因未深究

listen=NO

listen_ipv6=YES
#
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES

dirmessage_enable=YES
#
# If enabled, vsftpd will display directory listings with the time
# in  your  local  time  zone.  The default is to display GMT. The
# times returned by the MDTM FTP command are also affected by this
# option.
use_localtime=YES
#
# Activate logging of uploads/downloads.
xferlog_enable=YES
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES

chroot_local_user=YES
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd.chroot_list

secure_chroot_dir=/var/run/vsftpd/empty
#
# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd
#
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO

# Uncomment this to indicate that vsftpd use a utf8 filesystem.
#utf8_filesystem=YES

# 下面两句用于数据隔离,限制每个用户访问目录
user_sub_token=$USER
# 指定ftp登录后的根目录
local_root=/home/$USER/ftp

用户配置

创建用户

sudo adduser ftpuser
# 上面命令会自动创建/home/ftpuser,777可能报错,所以用755,试了下好像都可以
chmod 755 /home/ftpuser
# 限制用户username只能通过ftp登陆,而不能直接登陆服务器
# 网上看得,实际并没操作这一步
usermod -s /sbin/nologin ftpuser

添加ftp可访问的用户,一行一个用户名

需要先在/etc/vsftpd.conf文件中取消#chroot_list_file=/etc/vsftpd.chroot_list这一行的注释

sudo vim /etc/vsftpd.chroot_list

重启ftp服务

sudo /etc/init.d/vsftpd restart
# 或者
sudo service vsftpd restart

其它配置项解析

# 允许匿名用户登录
anonymous_enable=YES
# 允许本地用户登录
local_enable=YES
# 开启全局上传
write_enable=YES
# 允许匿名用户上传文件
anon_upload_enable=YES  
# 充许匿名用户新建文件夹
anon_mkdir_write_enable=YES

高级用法

数据隔离

为了实现数据隔离,需要为每个用户提供一个独立的访问目录

方法一:通过adduer命令添加用户,然后在/etc/vsftpd.conf文件中去做下面的配置
  • 已验证过
  • 每个用户下面需要有相同目录
# 在配置文件底部添加,如上面的文件示例
user_sub_token=$USER
local_root=/home/$USER/ftp
方法二:为每个用户创建一个独立的访问目录,不一定是该用户的~目录
  • 没有验证过,只做记录
# 例如3个用户
# 1.创建目录
sudo mkdir -p /ftp/user1
sudo mkdir -p /ftp/user2
sudo mkdir -p /ftp/user3

# 2.为每个用户分配相应的目录
sudo usermod -d /ftp/user1 user1
sudo usermod -d /ftp/user2 user2
sudo usermod -d /ftp/user3 user3

# 3.更改目录的所有者和权限
sudo chown user1: /ftp/user1
sudo chown user2: /ftp/user2
sudo chown user3: /ftp/user3

# 4.在/etc/vsftpd.conf文件中添加以下内容
chroot_local_user=YES

权限控制

  • user1:只读
  • user2:可读可写不可删除
  • user3:可读可写可删除
# 首先需要在/etc/vsftpd.conf文件中启用user_config_dir选项(不存在则新增字段即可)
# 为每个用户启动特定的配置
user_config_dir=/etc/vsftpd/user_conf

# 针对每个用户创建配置文件
# 在/etc/vsftpd/user_conf目录下创建一个与用户名同名的文件,比如user1
cd /etc/vsftpd/user_conf
sudo touch user1
sudo vim user1

# 在文件中添加以下内容以禁止写入和删除
cmds_denied=STOR,DELE,RMD

# 同理针对user2
sudo vim user2
cmds_denied=DELE,RMD

# user3不用特殊操作,修改完之后需要重启vsftpd服务
sudo service vsftpd restart

创建一个用户user4:可读、可删除但不可写

sudo vim /etc/vsftpd/user_conf/user4

# 允许下载和删除
cmds_allowed=RETR,DELE
# 禁用写入命令
cmds_denied=STOR,APPE,STOU

常用排查指令

如果ftp无法访问,优先有下面命令排查

查看vsftpd服务状态

sudo service vsftpd status

查看端口占用

sudo netstat -tulpn | grep vsftpd

查看本机是否可以登录ftp

ftp localhost

一些可能出现的问题

为了在服务器上部署,部署前先用vmware虚拟机做验证,发现以下问题

问题一:虚拟机需要设置端口转发

关闭虚拟机,在“虚拟机网络设置”里面找到NAT的网卡,点击NAT设置,添加端口转发

主机端口:21
类型:TCP
虚拟机ip:虚拟机NAT的ip地址
虚拟机端口:21
# 其它项不用管

问题二:在 /etc/vsftpd.conf文件中如果打开IPV4关闭IPV6会出现端口监听不了的问题

# 如果这么配置,sudo netstat -tulpn | grep vsftpd 命令看不到21端口监听,本身vsftpd服务正常
listen=YES
listen_ipv6=NO

# 改成这样配置没有问题
listen=NO
listen_ipv6=YES

问题三:用户名设置成ftp,可能会出现问题

自己最开始通过adduser创建了ftp的用户,但那时因为其它问题一直连不上,问chatgpt,说可能有问题,之后删除了该用户也同时解决了其它问题,之后用其它用户没问题了,但不确认本身这么操作有没有问题

END.

06-09 19:00