在Linux中使用的FTP是vsftp,Ubuntu中安装vsftp:
bash
apt install vsftpd
配置文件在/etc路径下,会出现两个配置文件:
/etc/vsftpd.conf :主配置文件
/etc/ftpusers:指定那些用户不能访问FTP服务器,这里的用户包括root在内的一些重要用户。
这里需要对配置文件 /etc/vsftpd.conf 做一些修改:
登录权限
anonymous_enable=YES #允许匿名登录
local_enable=YES #允许本地用户登录
登录用户黑白名单
首先,前面提到的配置文件 /etc/ftpusers 中配置的用户都无法访问ftp服务器,这相当于是一个黑名单。除此之外,还可以通过配置项 userlist_deny,userlist_enable,userlist_file 组合使用,来另外配置黑白名单。
其中,userlist_enable 标识是否使用启用黑白名单( userlist_file 标识名单文件),当userlist_enable=YES时生效。而 userlist_deny 用于指示该名单为黑名单还是白名单,当userlist_deny=YES时,userlist_file中的名单为黑名单,而当 userlist_deny=NO 时,userlist_file中的名单为白名单。
综合来说,当开启黑名单时(userlist_deny=YES,userlist_enable=YES),既不在/etc/ftpusers中,又不在 userlist_file 所指向名单文件中的用户可以登录FTP;当开启白名单(userlist_deny=NO,userlist_enable=YES),仅在userlist_file 所指向名单文件中且不在/etc/ftpusers 中的用户可以登录FTP;当关闭黑白名单(userlist_enable=NO),不在/etc/ftpusers中的用户都可登录。
掩码权限
umask是在linux中常见的一个东西,它其实是一个掩码。当然,也有umask这样一个命令,它是对用户建立的文件的默认属性的定义。该 定义为:
假设umask为022,则对于一个文件夹的话,它的默认属性为 777-022=755,这也就是我们平时建立文件夹的权限。而对于一般的文件的话,则是用 666-022=644。
local_umaks=022 #本地用户掩码权限
anon_umask=000 #匿名用户掩码权限
文件目录权限
local_root=/srv/ftp #本地用户的FTP根目录,这是ftp访问的根目录
chroot_local_user=YES #是否将所有用户限制在主目录,YES为启用 NO禁用.(该项默认值是NO,即在安装vsftpd后不做配置的话,ftp用户是可以向上切换到要目录之外的)
chroot_list_enable=NO #是否启动限制用户的名单(由chroot_list_file 所指向的用户名单) YES为启用 NO禁用
这里的 chroot_local_user、chroot_list_enable、chroot_list_file 等参数有点类似上面的用户登录黑白名单的配置,这里建议将chroot_local_user配置为YES,并将chroot_list_enable配置为NO,以达到将所有用户限制在根目录。
write_enable=YES #启用任何形式的FTP写命令(全局写)
allow_writeable_chroot=YES #允许写入用户主目录,当然需要主目录是可写的。
这里需要注意的是,当用户主目录对ftp用户是可写时,且chroot_local_user=YES,ftp用户会登录失败。在配置是建议设置为对ftp用户不可写,仅对本地用户配置可写权限。如果希望为ftp用户提供上传文件权限,可以在根目录下另外创建一个子目录为其提供可写权限。
anon_upload_enable=YES #允许匿名FTP用户上传文件(这只有在上述全局写启用被激活时才有效果。此外,您显然还需要创建一个可供FTP用户写入的目录):
anon_mkdir_write_enable=YES #允许匿名FTP用户创建文件夹:
dirmessage_enable=YES #激活目录消息------当远程用户进入某个目录时发给他们的消息
配置模式
FTP有两种模式,称为主动模式(PORT)和被动模式(PASV)。
主动模式:客户端随机打开一个大于1024的端口N向服务器的21端口发起连接,同时开放N+1端口,并向服务器发出 "port N+1" 命令,由服务器的20端口主动连接到客户端 N+1 端口。
注意,FTP客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。对于客户端的防火墙来说,这是从外部到内部的连接,可能会被阻止。
配置主动模式:
bash
pasv_enable=NO #Passive模式关闭
port_enable=YES #active模式开启
connect_from_port_20=YES #默认情况下,FTP PORT主动模式进行数据传输时使用20端口
被动模式:客户端打开两个随机端口N和N+1,客户端的N端口连接服务器的21端口,提交PASV命令,然后,服务器会开启一个随机端口,返回如 "227 entering passive mode (127,0,0,1,4,18)"。它返回了227开头的信息,在括号中有以逗号隔开的六个数字,前面四个指服务器地址,最后两个指端口,计算端口值的方式:倒数第二个数字 * 256 + 最后一个数字,客户端收到命令并取得服务器的数据端口P之后,会通过N+1端口连接服务器的P端口,然后进行数据传输。
配置被动模式:
bash
pasv_enable=YES #passive模式开启
#在PASV模式下,建立数据传输可使用的端口范围的下界和上界,这里给的数值仅供参考,可根据实际需求修改,注意到防火墙里面将这段端口放开
pasv_min_port=40000
pasv_max_port=40100
查看当前所有配置项:
bash
cat /etc/vsftpd.conf |grep -v '^#'
bash
listen=NO
listen_ipv6=YES
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=200
anon_umask=000
anon_upload_enable=YES
anon_mkdir_write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=NO
chroot_local_user=YES
chroot_list_enable=NO
allow_writeable_chroot=YES
chroot_list_file=/etc/vsftpd/chroot_list
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
local_root=/srv/ftp
anon_root=/srv/ftp/Sams
userlist_deny=NO
userlist_enable=NO
userlist_file=/etc/vsftpd/user_list
user_config_dir=/etc/vsftpd/userconfig
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
测试FTP服务
可以通过在windows文件夹输入 ftp://192.168.9.108/ 这样格式的地址来登录,记得把IP替换为你的服务器IP。更好的测试工具是使用 FileZilla软件来测试,这个FTP工具能够列出命令详情,响应及错误信息,方便排查问题。