ftp
1.ftp简介
ftp是一种较为古老的文件传输服务,可实现文件的共享以及传输。其服务器端有两个端口,一个是控制端口(默认21),控制端口负责ftp的连接控制,还有一个端口是传输端口,其主动模式时,传输端口默认为20端口,在其为被动模式时,默认为1000以后的大端口号。ftp服务的版本服务很多,vsftp是其中一个分支,译为非常安全的文件服务。
2.主动模式与被动模式
ftp其运行时有两种工作模式,主动模式与被动模式。
(1) PORT(主动模式)
PORT中文称为主动模式,工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据,原理如下图:
(2) PASV(被动模式)
PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输,原理如下图:
3.两种模式对于防火墙的影响
主动模式之所以称为主动模式,是因为在两端传输端口通道建立时,是服务器端(21端口)主动与客户端(1024+随机端口)请求建立连接。这其中可能出现的问题是,我们都知道,防火墙是有入口和出口的,通常客户端的入端口在防火墙策略里面是关闭的,故也无法成功连接客户端的传输接口。而在被动模式中,是服务器端开放一个大于1024的随机接口,然后通过控制接口告知客户端,让客户端来主动请求建立连接。在这里,客户端的防火墙不会是问题所在,因为客户端出端口一般默认不会做限制,而两个连接请求也都是客户端发起的,但此时,服务器端除了开放自己21的控制端口以外,还需要特别开放一个随机端口范围(这个范围由ftp启动被动模式时定义的范围)。
综上所述,在服务器端需要面对大量客户端时,最好选择被动模式,这样不会让客户端因为自己的防火墙入口关闭而受到影响。
4.vsftpd
vsftpd安装很简单 redhad 或centos直接使用
1 | |
rpm -ql vsftpd #查看vsftpd安装的所有文件
4.1配置文件
vsftpd配置文件目录:/etc/vsftpd/vsftpd.conf
1 | |
VSFTPD登录方式:
vsftpd的配置项较多,但都是”配置项”=”xx”这种格式,其本身有三种登录方式
:匿名用户登录,本地用户登录,虚拟用户登录
1.匿名用户登录
anonymous_enable=YES
只要设置这行就表示允许匿名用户登录了
匿名用户使用的登陆名为ftp或anonymous,口令为空
匿名用户(anonymous)设置
1 | |
匿名登录最重要的还是anonymous_enable=YES这个配置,表示启用了匿名
下面是我配置好的匿名登录配置文件:vsftpd.conf
allow_writeable_chroot=YES
anonymous_enable=YES
no_anon_password=YES
ftp_username=ftp
anon_root=/var/ftp
anon_upload_enable=YES
anon_world_readable_only=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
chown_uploads=YES
chown_username=nobody
anon_umask=077
#local_enable=YES
#write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
其中local_enable表示的是本地用户登录,no表示本地用户不能登录,需要注意的是ftp服务的读写权限首先是配置文件里面定义的权限,然后是本地文件夹本身的权限。我这里发现一个问题是这个报错:500 OOPS: vsftpd: refusing to run with writable root inside chroot(),我去网上搜索了一下,网上基本都说是这个问题:
从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。要修复这个错误,可以用命令chmod a-w /home/user去除用户主目录的写权限,注意把目录替换成你自己的。或者你可以在vsftpd的配置文件中增加下列两项中的一项:allow_writeable_chroot=YES
但根据我测试,只能将根目录取消写权限。加这一行配置并没用,但根目录里面的文件或文件夹加上写权限并不会影响使用。
如测试连接出现这个报错,去掉tcp_wrappers配置重启即可:
500 OOPS: tcp_wrappers is set to YES but no tcp wrapper support compiled in
2.本地用户登录
本地用户设置
local_enable=YES/NO****(YES)
控制是否允许本地用户登入,YES 为允许本地用户登入,NO为不允许。默认值为YES。
local_root=/home/username
当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录。
write_enable=YES/NO****(YES)
是否允许登陆用户有写权限。属于全局设置,默认值为YES。
local_umask=022
本地用户新增档案时的umask 值。默认值为077。
file_open_mode=0755
本地用户上传档案后的档案权限,与chmod 所使用的数值相同。默认值为0666
目录锁定配置:
在默认配置下,本地用户登入FTP后可以使用cd命令切换到其他目录,这样会对系统带来安全隐患。可以通过以下三条配置文件来控制用户切换目录。
chroot_list_enable=YES/NO****(NO)
设置是否启用chroot_list_file配置项指定的用户列表文件。默认值为NO。
chroot_list_file=/etc/vsftpd.chroot_list
用于指定用户列表文件,该文件用于控制哪些用户可以切换到用户家目录的上级目录。
chroot_local_user=YES/NO****(NO)
用于指定用户列表文件中的用户是否允许切换到上级目录。默认值为NO。
通过搭配能实现以下几种效果:
①当chroot_list_enable=YES,chroot_local_user=YES时,在/etc/vsftpd.chroot_list文件中列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录。
②当chroot_list_enable=YES,chroot_local_user=NO时,在/etc/vsftpd.chroot_list文件中列出的用户,不能切换到其他目录;未在文件中列出的用户,可以切换到其他目录。
③当chroot_list_enable=NO,chroot_local_user=YES时,所有的用户均不能切换到其他目录。
④当chroot_list_enable=NO,chroot_local_user=NO时,所有的用户均可以切换到其他目录。
控制用户访问:
对于用户的访问控制可以通过/etc目录下的vsftpd.user_list和ftpusers文件来实现。
userlist_file=/etc/vsftpd.user_list
控制用户访问FTP的文件,里面写着用户名称。一个用户名称一行。
userlist_enable=YES/NO****(NO)
是否启用vsftpd.user_list文件。
userlist_deny=YES/NO****(YES)
决定vsftpd.user_list文件中的用户是否能够访问FTP服务器。若设置为YES,则vsftpd.user_list文件中的用户不允许访问FTP,若设置为NO,则只有vsftpd.user_list文件中的用户才能访问FTP。
/etc/vsftpd/ftpusers文件专门用于定义不允许访问FTP服务器的用户列表(注意:如果userlist_enable=YES,userlist_deny=NO,此时如果在vsftpd.user_list和ftpusers中都有某个用户时,那么这个用户是不能够访问FTP的,即ftpusers的优先级要高)。默认情况下vsftpd.user_list和ftpusers,这两个文件已经预设置了一些不允许访问FTP服务器的系统内部账户。如果系统没有这两个文件,那么新建这两个文件,将用户添加进去即可。
下面是我配置好的本地用户登录配置文件 vsftpd.conf:
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
chroot_local_user=YES
local_root=/home/ftp/static
userlist_enable=YES
userlist_deny=YES
这个配置文件匿名用户无法登录,切user_list和ftpusers里面的用户不能登录 user_list是userlist_enable启用的,ftpusers这个配置文件我没找到其定义的配置项,我怀疑应该是/etc/pam.d/vsftpd里面定义的,但这个不用深究。local_root锁定了用户家目录。
记得做完mkdir /home/ftp/static
3.虚拟用户登录
虚拟用户登录其登录的验证文件是/etc/pam.d/vsftpd,与本地登录不同的是,虚拟用户其本身也需要映射到一个本地用户,以本地用户来做为其权限载体,但可将多个虚拟用户映射为一个本地用户,然后在pam.d/vsftpd里面指定其用户账号密码文件,还需单独指定其虚拟用户配置文件,定义其ftp权限,ftp文件路径等。
虚拟用户设置
虚拟用户使用PAM认证方式。
pam_service_name=vsftpd
设置PAM使用的名称,默认值为/etc/pam.d/vsftpd。
guest_enable= YES/NO****(NO)
启用虚拟用户。默认值为NO。
guest_username=ftp
这里用来映射虚拟用户。默认值为ftp。
virtual_use_local_privs=YES/NO****(NO)
当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限。默认情况下此参数是关闭的(NO)。
首先把虚拟用户的配置文件配置好/etc/vsftpd/vsftpd.conf:
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
chroot_local_user=YES
local_root=/home/ftp/static
userlist_enable=YES
userlist_deny=YES
guest_enable=YES
guest_username=vsftpd
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
user_config_dir=/etc/vsftpd/vusers
guest_enable启用虚拟用户,guest_username是虚拟用户映射到本地用户的用户名,anon的三个配置项代表匿名用户与虚拟用户的权限,因每个虚拟用户权限不一致,所以先关闭权限。user_config_dir表示虚拟用户的配置文件夹,这里需要注意的是:
/etc/vsftpd/vusers里面一个配置文件代表一个虚拟用户,且文件名需以虚拟用户名称来表示。
/etc/vsftpd/vusers/ftpuser:
local_root=/home/ftp/static
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
虚拟用户配置文件有了以后,就可以生成虚拟用户认证文件了,首先上面vsftpd.conf里面guest_username=vsftpd代表虚拟用户映射为vsftpd,pam_service_name=vsftpd表示其登录认证文件为/etc/pam.d/vsftpd这个认证文件,首先先创建虚拟用户账号密码文件,然后再用pam.d/vsftpd配置文件中指定这个虚拟用户文件。
配置完的/etc/pam.d/vsftpd:
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtualusers
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtualusers
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
上面两行为指定的虚拟用户认证文件,所以接下来需要创建virtualusers
echo -e “ftpuser\n123456” > /etc/vsftpd/virtualusers
db_load -T -t hash -f /etc/vsftpd/virtualusers /etc/vsftpd/virtualusers.db
chmod 600 /etc/vsftpd/virtualusers*
mkdir /home/ftp/static;chown -R vsftpd.vsftpd /home/ftp/static
这个时候用ftp测试工具测试一下可以登录就OK了。

容易出现的报错:

在ftp根目录如果用户拥有写权限的话便会报错
421 Service not available, remote server has closed connection
目前最容易遇到的坑:
1.文件夹加了写权限导致ftp账号无法登录
2.虚拟用户的配置文件得在user_config_dir=/etc/vsftpd/vusers指定文件夹下面且每个虚拟用户一个配置文件,其文件名为自己的虚拟用户用户名
3.无法启动vsftpd,基本上都是配置文件文件,建议用vsftpd默认自带的来进行修改,或者复制文中已经写好的配置文件。
4.测试ftp连接性时尽量使用linux下的ftp工具:yum -y install ftp即可安装,因其出错时报错信息都比较准确,如果在windows直接测试的话可能直接就是无法登录,但没有对应的报错信息。
5.vsftpd主动模式与被动模式
这里主要是讲主动模式与被动模式的实现,首先是最常用的被动模式
1.被动模式
1 | |
被动模式为这三个选项,因pasv默认为yes,所以在vsftpd中,默认也是使用被动模式来运行的。

定义好最大最小端口后重启并测试
systemctl restart vsftpd
然后找一个windows或linux的ftp客户端进行测试(浏览器也行):

服务器中ftp没连接时的信息
然后用浏览器去访问ftp时的端口情况

可以知道,此时vsftpd开启了1408来作为传输端口,与我们配置的无异,被动模式成功运行。
2.主动模式
pasv_enable=NO #关闭被动模式
port_enable=YES #启用主动模式
connect_from_port_20=YES #主动式连接使用的数据通道
#Ftp_date_port=%portnumber% 上一选项使用NO参数是 指定数据传输端口
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
#connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
chroot_local_user=YES
local_root=/home/ftp/static
userlist_enable=YES
userlist_deny=YES
guest_enable=YES
guest_username=vsftpd
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
user_config_dir=/etc/vsftpd/vusers
#pasv_min_port=1380
#pasv_max_port=1500
pasv_enable=NO
port_enable=YES
connect_from_port_20=YES
下面是测试:

可以看到20端口启用了,所以主动模式成功运行了。但像浏览器,ftp命令行工具默认会使用被动模式进行连接,启用主动模式后便无法连接
所以最好用ftp工具连接,连接时还需指定用主动模式连接

当然,如不关闭被动模式,则主动模式将于被动模式共存。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!