本文主要讲解Linux系统下vsftp常见的一些知识点
安装
Vsftp的安装比较简单,Linux系统使用yum直接就能安装完成,因此安装步骤基本不必要担心,最重要也是最必要的就是配置文件,在编辑配置文件之前,首先你要确定选用的模式、用户的登录方式,这将有助于后续进行正确的配置。
模式选择
Ftp服务器有两种模式:主动(port)模式和被动(pasv)模式,两种模式你可以理解为相对于ftp服务器,ftp服务器主动去连接客户端的数据端口则为主动模式,ftp服务器被动接受客户端的数据连接则为被动模式,两种模式均有命令链路和数据链路。
主动模式
下面这张图将有助你进一步理解主动模式(绿色为命令链路,红色为数据链路)
整个流程可以理解为如下步骤:
- 客户端使用端口N连接FTP服务器的命令端口21,建立连接并告诉服务端自己开启的数据端口为N+1;
- 服务端使用数据端口20,主动连接客户端的N+1端口以建立数据连接并进行数据传输
主动模式开启的端口
角色 | 端口 | 备注 |
---|---|---|
客户端 | N | 命令端口, N>1024 |
客户端 | N+1 | 数据端口,N+1与N可能是相近的两个端口 |
服务端 | 21 | 命令端口 |
服务端 | 20 | 数据端口 |
被动模式
下面这张图将有助你进一步理解被动模式(绿色为命令链路,红色为数据链路)
整个流程可以理解为如下步骤:
- 客户端命令端口N连接服务端命令端口21,并发送PASV命令,告诉服务端用“被动模式”,服务端开启一个数据端口P,通过命令链路将P端口返回客户端
- 客户端的数据端口N+1连接服务器的数据端口P,并建立数据连接
被动模式开启的端口
角色 | 端口 | 备注 |
---|---|---|
客户端 | N | 命令端口, N>1024 |
客户端 | N+1 | 数据端口,N+1与N可能是相近的两个端口 |
服务端 | 21 | 命令端口 |
服务端 | P | 数据端口,随机端口 |
1、主动模式对服务端的管理有利,对客户端的管理不利,服务端只需要管理20、21端口,服务端试图主动连接客户端的数据端口N+1时,可能会被客户端的防火墙拦截掉,因此客户端的防火墙也需要作相应的管理
2、被动模式对服务端的管理不利,对客户端的管理有利,服务端需要管理21、P端口,而P端口是随机端口,此时相对于客户端就不需要作端口管理
如果你是一个生产系统管理员,我建议你选择被动模式,因为此时的你对服务端的管控可能会更强
用户登录
Ftp的登录方式主要有如下三种模式,包括匿名用户、本地用户、虚拟用户方式,三种用户的选择也需要你格外注意,不同的选择将直接影响配置文件的配置项与后续用户的管控方式
匿名用户
匿名用户的登录方式实际就是不需要密码直接就能登录,生产环境不建议选择此种模式
本地用户
主机的系统用户,存在于/etc/passwd文件中的用户,用户比较少且不涉及到强相关的上传下载权限时使用本地用户是一种好的选择
虚拟用户
通过一个系统账号进行映射,虚拟用户不存在/etc/passwd文件中,相对于本地用户更安全,适用于用户比较多且权限控制比较复杂的情况
配置项
通过前面的讲解,我相信你一定选定了服务器模式与用户登录模式,接下来就需要编辑ftp的配置项进行配置文件的生成了,因此各配置项你必须了解他们都代表着什么含义
参数 | 含义 | 默认值 | 备注 |
---|---|---|---|
write_enable | 是否对登录用户开启写权限 | NO | |
local_enable | 是否允许本地用户登录FTP服务器 | NO | |
anonymous_enable | 是否允许匿名用户登录FTP服务器 | YES | |
anon_upload_enable | 是否允许匿名、虚拟用户上传文件 | NO | |
anon_mkdir_write_enable | 是否允许匿名、虚拟用户创建目录 | NO | |
anon_other_write_enable | 是否允许匿名、虚拟用户除了上传、创建权限外,还有删除、更名权限 | NO | |
local_root | 设置本地用户登录后所在的目录 | ||
local_umask | 设置本地用户新增文档的umask | 022 | |
chroot_list_enable | 是否启用chroot_list_file配置项指定的用户列表文件 | NO | |
chroot_list_file | 指定用户列表文件,用于控制哪些用户可以切换到FTP站点根目录的上级目录 | ||
chroot_local_user | 指定用户列表文件中的用户,是否允许切换到上级目录 | NO | |
tcp_wrappers | 是否与tcp wrapper相结合 | YES | |
userlist_enable | user_list文件是否生效 | ||
userlist_deny | user_list文件中的用户是否允许访问 | ||
userlist_file | 指定user_list文件路径 | ||
pam_service_name | PAM所使用的名称 | ||
pasv_enable | 是否启用PASV工作模式 | YES | |
pasv_max_port | 被动模式下,数据连接的上限端口 | 0 | |
pasv_min_port | 被动模式下,数据连接的下限端口 | 0 | |
anon_world_readable_only | 是否允许匿名用户下载可读文件 | YES | |
anon_upload_enable | 是否允许匿名用户上传文件 | NO | |
anon_mkdir_write_enable | 是否允许匿名用户创建目录 | NO | |
anon_other_write_enable | 是否允许匿名用户除了上传文件、创建目录,还有删除和更改权限 | NO |
说在配置前
最后还有一点,我觉得你需要关注,在配置完并兴奋的启动成功后,发现跟想的不太一样,用户登录不了,那么下面的内容很可能就是你需要关注的
白名单与黑名单
[root@localhost vsftpd]# ll
total 40
-rw-------. 1 root root 125 Oct 30 2018 ftpusers
-rw-------. 1 root root 302 Mar 30 05:37 user_list
-rw-------. 1 root root 599 Mar 30 05:41 vsftpd.conf
在ftp的主目录下,你会发现有ftpuser和user_list两个文件,当你好奇的打开时,会发现里面都是一大堆的用户,那么这两个文件你就可以理解为白、黑名单了
- ftpuser永远都是黑名单,存在于ftpuser文件中的用户不被允许登录,黑名单的优先级比白名单要高
- userlist_enable配置项被设置为YES,user_list文件才会被激活
- userlist_enable=YES,userlist_deny=YES,user_list文件是个黑名单
- userlist_enable=YES,userlist_deny=NO,user_list文件是个白名单
配置
被动模式&&本地用户
配置文件参考
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
ftpd_banner=This Is A FTP service
chroot_local_user=YES
chroot_list_enable=NO
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
pasv_min_port=40000
pasv_max_port=40088
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
tcp_wrappers=YES
local_root=/data/ftpdata
被动模式&&虚拟用户
虚拟用户的设置可以按照下面的步骤进行:
- 创建本地用户用于虚拟用户映射
虚拟用户文件采用用户名+密码的方式填入
[root@localhost vsftpd]# useradd -s /sbin/nologin virtual
[root@localhost vsftpd]# vim vftpuser
zhagnsan
111111
lisi
111111
- 将虚拟用户文件转换为数据库加密文件
[root@localhost vsftpd]# db_load -T -t hash -f vftpuser vftpuser.db
[root@localhost vsftpd]# ll vftpuser.db
-rw-------. 1 root root 12288 Mar 30 11:14 vftpuser.db
- 新建PAM认证文件
[root@localhost pam.d]# vim /etc/pam.d/vftpuser
account required pam_userdb.so db=/etc/vsftpd/vftpuser //此处的vftpuser是vftpuser.db,.db可以省略,而非vftpuser
auth required pam_userdb.so db=/etc/vsftpd/vftpuser
- 配置文件
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
ftpd_banner=This Is A FTP service
chroot_local_user=YES
chroot_list_enable=NO
listen=NO
listen_ipv6=YES
pam_service_name=vftpuser
pasv_min_port=40000
pasv_max_port=40088
guest_enable=YES
guest_username=virtual
anon_world_readable_only=NO
user_config_dir=/etc/vsftpd/vftpuser_dir
- 虚拟用户的权限
[root@localhost vftpuser_dir]# vim zhangsan
write_enable=YES
anon_world_readable_only=no //设置为YES表示文件的其他人必须有读的权限才允许下载,设置为NO,表示映射用户(属主)对文件有读权限即可下载
anon_upload_enable=YES //上传权限
anon_mkdir_write_enable=YES //创建目录权限
anon_other_write_enable=YES //删除更名权限
anon_umask=022
local_root=/data/dataftp/zhangsan
每个虚拟用户一个权限文件,文件名为虚拟用户名,单独设置虚拟用户的各项配置与权限
防火墙设置
完成上面的配置后,作为生产系统的ftp服务器,你可能还需要完成防火墙的设置,以确保ftp能够被授权的主机访问,以下在centos6和7上测试通过,其他系统未作测试
centos6
centos6中有两种配置方法:
- 使用PASV端口设置
iptables -A INPUT -s source_ip -p tcp -m state --state NEW -m multiport --dports 21,pasv_min_port:pasv_max_port -j ACCEPT
- 使用防火墙自带的ftp模块
1)、手动装载模块
modprobe nf_conntrack_ftp
2)、配置防火墙,不需要指定PASV端口
iptables -A INPUT -s source_ip -p tcp -m state --state NEW -m multiport --dports 21 -j ACCEP
centos7
[root@localhost zones]# vim /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
<service name="ftp"/> //新增ftp配置
</zone>
上面的步骤引用了centos 7系统已经定义好的ftp.xml 文件
最后,我想说上面的内容也没能面面俱到,只是总结了一些容易犯迷糊的地方,希望对你有帮助,如果有什么不对,欢迎热心的你批评指正。