Linux运维之 vsftpd 服务及常见的四种错误
一、实验环境(rhel7.0版本)
主机环境:rhel7.0
各主机信息
主机名 | IP |
---|---|
server | 172.25.254.1 |
client | 172.25.254.2 |
物理机 | 172.25.254.7 |
二、FTP 的介绍
1、FTP 服务器的用途
文件传输协议(英文:File Transfer Protocol,缩写:FTP)是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式。它属于网络传输协议的应用层。文件传送(file transfer)和文件访问(file access)之间的区别在于:前者由FTP提供,后者由如NFS等应用系统提供。FTP 最主要的功能是在服务器与客户端之间进行文件的传输,这个协议使用的是明文传输方式。FTP 的传输使用的是 TCP 数据包协议。
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。
2、FTP 的工作原理
FTP 服务器使用了两个连接,分别是命令通道(使用 21 端口)与数据流通道(使用 20 端口)。
针对 FTP 的服务端,有两种连接模式:
- 主动式连接
- 被动式连接
(1)主动式连接的工作原理
1、建立命令通道的连接:
客户端会随机取一个大于 1024 以上的端口(port AA)来与 FTP 服务器端的 port 21 实现连接,这个过程当然需要三次握手。实现连接后客户端便可以通过这个连接来对 FTP 服务器执行命令,查询文件名、下载、上传等等名利都是利用这个通道来执行的。
2、通知 FTP 服务器端使用 Active 且告知连接的端口号
FTP 服务器的端口 21 号主动用在命令的执行,但是当牵涉到数据流时,就不是使用这个连接了。客户端在需要数据的情况下,会告知服务器端用什么方式来连接,如果是主动式(Active)连接时,客户端会随机启用一个端口(Port BB)且通过命令通道告知 FTP 服务器这两个信息,并等待 FTP 服务器的连接。
3、FTP 服务器主动向客户端连接
FTP 服务器由命令通道了解客户端的需求后,会主动地由 Port 20 向客户端的 port BB 连接,这个连接当然也会经过三次握手。此时 FTP 的客户端与服务器端会建立两条连接,分别用在命令的执行与数据的传递。而默认 FTP 服务器端使用的主动连接端口就是 port 20。
值的注意的是:
- 数据传输通道是在有数据传输的行为时才建立的通道,并不是一开始连接到 FTP 服务器就立刻建立的通道。
- 两者的连接发起端是不一样的。首先 port 21 主要接受来自客户端的主动连接,至于 port 20 则为 FTP 服务器主动连接至客户端。
那如何客户端是在防火墙后端,或者是 NAT 服务器后端呢?又会发生什么问题呢?
1、客户端与服务器间命令通道的建立
客户端会随机取一个大于 1024 以上的端口(port AA)来与 FTP 服务器端的 port 21 实现连接,这个过程当然需要三次握手。实现连接后客户端便可以通过这个连接来对 FTP 服务器执行命令,查询文件名、下载、上传等等名利都是利用这个通道来执行的。
因为 NAT 会主动记录由内部送往外部的连接信息,而由于命令通道的建立是由客户端向服务器端连接的,因此这一条连接是可以顺利建立起来的。
2、客户端与服务器间数据通道建立时的通知
FTP 服务器的端口 21 号主动用在命令的执行,但是当牵涉到数据流时,就不是使用这个连接了。客户端在需要数据的情况下,会告知服务器端用什么方式来连接,如果是主动式(Active)连接时,客户端会随机启用一个端口(Port BB)且通过命令通道告知 FTP 服务器这两个信息,并等待 FTP 服务器的连接。
3、服务器主动连到 NAT 等待转递至客户端的连接问题
但是由于通过 NAT 的转换后,FTP 服务器只能得知 NAT 的IP 而不是客户端的 IP,因此 FTP 服务器会以 port 20 主动向 NAT 的 Port BB 发送主动连接的要求。但 NAT 并没有启动 Port BB 来监听 FTP 服务器的连接。
从上面的过程,我们可以发现,在 FTP 的主动式连接当中,NAT 将会被时为客户端,但 NAT 其实并非客户端,这就造成问题了,这就造成问题了。
如果你曾经在 IP 路由器后面连接某些 FTP 服务器时,可能偶尔会发现明明已经连接上 FTP 服务器了(命令通道已建立),但就是无法取得文件名的列表,而是在超过一端时间后显示“Cant't buld data commection: Connection refused,无法进行数据传输”之类的信息,那肯定就是这个原因所造成的问题。
那如何解决上面的问题呢?
方法一:使用 iptables 所提供的 FTP 检测模块
其实 iptables 早就提供了许多好用的模块了,FTP 当然不会被错过。你可以使用 modeprobe 这个命令来加在 ip_conntrack_ftp 及 ip_nat_ftp 等模块,这几个模块会主动地分析目标是 port 21 的连接信息,所以可以得到 Port BB 的资料,此时若接收到 FTP 服务器的主动连接,就能够将该数据包导向正确的后端主机了。
不过,如果你链接的目标 FTP 服务器的命令同大批默认端口号并非标准的 21 端口号时(例如某些地下 FTP 服务器),那么这两个模块就无法顺利解析出来。
方法二:客户端选择被动式(Passive)连接模式
除了主动式链接之外,FTP 还提供一种称为被动式连接接的模式。
(2)被动式连接的工作原理
1、用户与服务器建立命令通道
客户端会随机取一个大于 1024 以上的端口(port AA)来与 FTP 服务器端的 port 21 实现连接,这个过程当然需要三次握手。实现连接后客户端便可以通过这个连接来对 FTP 服务器执行命令,查询文件名、下载、上传等等名利都是利用这个通道来执行的。
2、客户端发出 PASV 的连接要求
当使用数据通道的命令时,客户端通过命令通道发出 PASV 的被动式连接要求(Passive),并等待服务器的回应。
3、FTP 服务器启动数据端口,并通知客户端连接
如果你使用的 FTP 服务器是能够被动式连接的,此时 FTP 服务器会先启动一个监听端口(port PASV)。这个端口号码可以是随机的,也可以自定义某一范围的端口,这要看 FTP 服务器软件而定。然后 FTP 服务器会通过命令通道告知客户端该已经启动的端口(port PASV),并等待客户端的连接。
4、客户端随机取用大于 1024 的端口进行连接
然后你的客户端会随机取用一个大于 1024 的端口号来进行对主机的 port PASV 连接。
那如何服务端是在防火墙后端,或者是 NAT 服务器后端呢?又怎么解决呢?
牵涉到更深入的 DMZ 技巧。这里不再介绍。
3、FTP 开放什么身份的用户登录
- 实体用户(系统上真实存在的用户)
- 访客身份(guest)
- 匿名登录用户(anonymous)——匿名用户使用的身份就是 ftp 。
三、vsftpd 服务器端的配置
1、所需软件与文件结构
(1)所需软件
这个软件名称就是 vsftpd,使用 yum 安装即可。
(2)文件结构
安装完毕之后,使用【rpm -ql vsftpd】来看看这个软件提供了哪些文件。基本上,比较重要的配置文件如下:
- /etc/vsftpd/vsftpd.conf
这个文件是最主要的配置文件。使用“参数=设置值”来设置的,注意,等号两边不能有空白。至于详细的 vsftpd.conf 可以使用【man 5 vsftpd.conf】来查看。
- /etc/pam.d/vsftpd
这个是 vsftpd 使用 PAM 模块时的相关配置文件。主要用来作为身份认证只用,还有一些用户身份的功能,也是通过这个文件来实现的。你可以查看一下该文件:
[root@server ~]# cat /etc/pam.d/vsftpd #%PAM-1.0 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
上面 file 后面接的内容是“限制用户无法使用 vsftpd”之意,也就是说其实你的限制文件不见需要使用系统默认值,也可以在这个文件里面进行修改。
- /etc/vsftpd/ftpusers
与上一个文件有关系,也就是 PAM 模块(/etc/pam.d/vsftpd)所指定的那个无法登录的用户配置文件。这个文件的设置很简单,你只要将不相让它登录的 FTP 账号写入这个文件即可。一行一个账号,看起来像这样:
[root@server ~]# cat /etc/vsftpd/ftpusers # Users that are not allowed to login via ftp root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
- /etc/vsftpd/user_list
这个文件是否能够生效与 vsftpd.conf 内的两个参数有关,分别是 userlist_enable 和 userlist_deny。如果说 /etc/vsftpd/vsftpd.conf 是 PAM 模块的阻挡访问设置项目,那么 /etc/vsftpd/user_list 则是 vsftod 自定义的阻挡访问项目。事实上这个文件与 /etc/vsftpd/ftpusers 几乎是一模一样的,在默认的情况下,你可以将不允许登录 vsftpd 的账号写入这里。不过这个文件是否会发生作用由 vsftpd.conf 配置文件内的 userlist_deny=[YES|NO] 决定。
[root@server ~]# cat /etc/vsftpd/user_list # vsftpd userlist # If userlist_deny=NO, only allow users in this file # If userlist_deny=YES (default), never allow users in this file, and # do not even prompt for a password. # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers # for users that are denied. root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
- /usr/sbin/vsftpd
这就是 vsftpd 的主要执行文件。
- /var/ftp
这是 vsftpd 默认匿名用户登录的根目录。
- /etc/vsftpd/chroot_list
这个文件默认是不存在的,所以你必须要手动自行建立。这个文件的主要功能是可以将某些账号的用户 chroot 建立在他们的默认用户主目录下。但这个文件要生效与 /etc/vsftpd.conf 内的 chroot_list_enable、chroot_list_file 两个参数有关。如果你想要将某些实体用户限制在他们的用户主目录下而不许到其他目录去,可以启动这个设置项目。
2、主要配置文件 /etc/vsftpd/vsftpd.conf 的语法
(1)与服务器环境设置有关的设置值
- connect_from_port_20=YES
这就是前面提到的 ftp-data 的端口号。即支持主动式连接功能。
- dirmessage_enable=YES
当用户进入某个目录时,会显示该目录需要注意的内容。
- message_file=.message ——该参数默认是没有的
当 dirmessage_enable=YES 时,可以设置这个项目让 vsftpd 寻找该文件显示的信息
- listen=NO
若设置为 YES,表示 vsftpd 是以 stand alone 的方式来启动。默认是 NO
- connect_timeout=60 ——该参数默认是没有的
单位是秒,在数据连接的主动式连模式下,我们发出的连接信息在 60 秒内得不到客户端的响应,则不等待并强制断线。
- #data_connection_timeout=120
如果服务器与客户端的数据已经成功建立(不论主动还是被动链接),但是可能由于线路问题导致 120 秒内还是无法顺利地完成数据地传送,那客户端地连接就会被我们地 vsftpd 强制踢除。
- #idle_session_timeout=600
如果用户在 300 秒内都没有命令操作,强制脱机!避免无用占用空间。
- max_clients= ——该参数默认是没有的
限制同一时间最多有多少 client 可以同时连上 vsftpd ,限制使用 FTP 的用量。
- max_per_ip= ——该参数默认是没有的
与上面 max_clients 类似,这里是同一个 IP 同一时间可允许多少连接。
- usese_localtime=YES|NO ——该参数默认是没有的
是否使用本地时间,vsftpd 默认使用 GMT 时间(格林尼治时间),所以默认的 FTP 内的文件日期会比中国晚 8 消失,建议修改设置为 YES 。
- pasv_enable= ——该参数默认是没有的
是否支持数据流的被动式连接模式。该参数的默认值是 YES。
- pasv_min_port= pasv_max_port= ——该参数默认是没有的
上面两个是与被动连接模式使用的端口号有关,如果你想要使用 65400 到 65410 这 11 个 pot 来进行被动式连接模式的连接,可以这样设置:pasv_min_port=65400 及 pasv_max_port=65410。如果是 0 的话,表示随机取用而不限制。
- #ftpd_banner=Welcome to blah FTP service
当用户连接进入到 vsftpd 时,在 FTP 客户端软件上会显示的说明文字。不过,这个设置值数据比较少。
- banner_file=/path/file ——该参数默认是没有的 ,在客户端使用 ftp 命令登录时,才能看出效果。
这个项目可以指定某个纯文本文件作为用户登录 vsftpd 服务器时所显示的欢迎字眼。同时,,也能够放置一些用户知道本 FTP 服务器的目录架构
(2)与实体用户较相关的设置值
- local_enable=YES
这个设置值必须要为 YES,在 /etc/passwd 内地账号才能以实体用户地方式登录我们的 vsftpd 服务器。
- local_max_rate=0
实体用户的传输速度限制,单位为 bytes/second,0 为不限制
- write_enable=YES
如果你允许用户上传数据时,就要启动这个设置值
- #chroot_local_user=YES
在默认的情况下,是否要将用户限制在自己的用户主目录之内(chroot)?如果是 YES 代表用户默认就会被 chroot,如果是 NO,则默认是没有 chroot。
- #chroot_list_enable=YES
是否启用 chroot 写入列表的功能?与下面的 chroot_list_file 有关,这个项目需要开启,否则下面的列表文件会无效。
- #chroot_list_file=/etc/vsftpd/chroot_list
如果 chroot_list_enable=YES,那么就可以设置这个项目了。这个项目与 chroot_local_user 有关。
- userlist_enable=YES
是否借助 vsftpd_enable 的阻挡机制来处理某些不欢迎的账号,与下面的参数设置有关。
- userlist_deny=YES|NO ——该参数默认是没有的
当 userlist_enable=YES 时才会生效的设置,若此设置值为 YES 时,则当用户账号被列入某个文件时,在该文件内的用户将无法登录 vsftpd 服务器。该文件的文件名与下列设置项目有关。
- userlist_file=/etc/vsftpd/user_list ——该参数默认是没有的
若上面 userlist_deny = YES 时,则这个文件就有用处了。在这个文件内的账号都无法使用 vsftpd。
(3)匿名用户登录的设置值
- anonymous_enable=YES
设置允许 anonymous 登录 vsftpd 主机。默认是 YES,下面的所由相关设置都需要将这个设置为 anonymous_enable=YES 之后才会生效。
- anon_world_readable_ONLY=YES|NO ——该参数默认是没有的
仅允许 anonymous 具有下载可读文件的权限。
- anon_other_write_enable=YES|NO ——该参数默认是没有的
是否允许 anonymous 具有除了写入之外的权限,包括删除与修改服务器上的文件及文件名的权限。如果要设置为 YES,那么开放给 anonymous 写入的目录亦即需要调整权限,让 vsftpd 的PID 拥有者可以写入才行。
- #anon_mkdir_write_enable=YES
是否让 anonymous 具有建立目录的权限,如果要设置为 YES,那么 anon_other_write_enable=YES 必须设置。
- #anon_upload_enable=YES
是否让 anonymous 具有上传数据的功能,如果要设置为 YES,那么 anon_other_write_enable=YES 必须设置。
- anon_umask=077 ——该参数默认是没有的
限制 anonymous 上传文件的权限。如果是 077 则 anonymous 传宋过来的文件权限会是 -rw-------。
- anon_max_rate=0 ——该参数默认是没有的
这个设置值后面接的数值单位为 bytes/秒,限制 anonymous 的传输速度,如果是 0 则不限制(由最大带宽所限制),
如果你想让 anonymous 仅有 30KB/s 的速度,可以设置为 anon_max_rate=30000。
- anon_root= ——该参数默认是没有的
修改匿名用户的默认家目录(默认家目录是 /var/ftp)
chown_uploads=YES|NO ——该参数默认是没有的
是否要修改匿名用户使用的身份,如果是 YES ,那么指定的用户身份由下面那一个参数来决定
- chown_username= ——该参数默认是没有的
如果上面那个参数(chown_uploads)的值是 YES,那么,这个参数就是在指定使用的用户的身份。
- #deny_email_enable=YES
将某些特殊的 Email-address 阻挡住,不让那些 anonymous 登录。需与下个设置项目配合。
- #banned_email_file=/etc/vsftpd/banned_emails
如果 deny_email_enal=YES 时,可以利用这个设置项目来规定哪个 E-mail address 不可登录我们的 vsftpd。在上面设置的文件内,一行输入一个 Email-address 即可。
- no_anon_password= ——该参数默认是没有的 , 在客户端使用 ftp 命令登录时,才能看出效果。
当设置为 YES 时,表示 anonymous 将会略过密码检验步骤,而直接进入 vsftpd 服务器内。所以一般默认都是 NO(登录时会检查输入的 E-mail)
(4)访客用户登录的设置值
- guest_enable=YES|NO ——该参数默认是没有的
若这个值设置为 YES,那么任何实体账号,均会被假设成为 guest(所以默认时不开放的)。至于访客在 vsftpd 当中,默认会取得 ftp 这个用户的相关权限。但可以通过 guest_username 来修改。
- guest_username= ——该参数默认是没有的。若该值是 ftp ,则获取的是匿名用户的身份。
在 guest_enable=YES 时才会生效,指定访客的身份。
(5)与系统安全方面的一些设置值
- #ascii_download_enable=YES
如果设置为 YES,那么 client 就优先(默认)使用 ASCII 格式下载文件
- #ascii_upload_enable=YES
如果设置为 YES,那么 client 就优先(默认)使用 ASCII 格式上传文件
- tcp_wrappers=YES
当然我们都习惯支持 TCP Wrappers 的防火墙机制(即可以利用 /etc/hosts.allow 或 /etc/hosts.deny 来作为基础防火墙) ,所以设置为 YES
- xferlog_enable=YES
当设置为 YES 时,用户上传与下载文件都会被记录下来。记录的文件与下一个设置项目有关
- #xferlog_file=/var/log/xferlog
如果上一个设置项目 xferlog_enable=YES 的话,这里就可以设置了。这个是日志文件的文件名
- xferlog_std_format=YES
是否设置为 wu-ftp 相同的日志文件格式。
- #nopriv_user=ftpsecure
我们的 vsftpd 默认以 ftpsecure 作为此服务执行者的权限。
- pam_service_name=vsftpd
这个是 PAM 模块的名称,我们放置在 /etc/pam.d/vsftpd 中的即是这个。
3、Redhat 7.x 的 vsftp 默认值
Redhat 7.x 的默认值当中, vsftpd 是同时开放实体用户与匿名用户的,Redhat 7.x 的默认值如下:
[root@server ~]# cat /etc/vsftpd/vsftpd.conf | grep -v ^#
1、与匿名用户有关的信息
anonymous_enable=YES # 支持匿名用户的登录使用 FTP 功能
2、与实体用户有关的功能
local_enable=YES # 支持本地端的实体用户登录
write_enable=YES # 允许用户上传数据(包括文件与目录)
local_umask=022 # 建立新目录(755)与文件(644)的权限
3、与服务器环境有关的设置
dirmessage_enable=YES # 若目录下有 .nessage 则会显示该文件的内容
xferlog_enable=YES # 启动日志文件记录,记录于 /var/log/xferlog
connect_from_port_20=YES # 支持主动式连接功能
xferlog_std_format=YES # 支持 WuFTP 的日志文件格式
listen=NO # 不能使用 stand alone 方式启动 vsftpd
listen_ipv6=YES # 启动 ipv6 对应的端口
pam_service_name=vsftpd # 支持 PAM 模块的管理
userlist_enable=YES # 支持 /etc/vsftpd/user_list 文件内的账号登录控制
tcp_wrappers=YES # 支持 TCP Wrappers 的防火墙机制(即/etc/hosts.allow 或 /etc/hosts.deny)
通过上述的设置值,我们的 vsftpd 可以实现如下的功能:
- 对于匿名用户:
- 只能登录 FTP,不能进行上传/下载/创建目录/删除;
- 只能在 anonymous 用户的主目录/var/ftp下,已经被 chroot了。
- 对于实体用户:
- 可以登录 FTP,可以在自己的主目录下上传/下载/创建目录/删除。
- 没有被 chroot,可前往任何有权限可进入的目录中,但是在非自己的主目录下,不能进行任何操作。
- 任何于 /etc/vsftod/ftpusers 内存在的账号均无法使用 vsftpd (PAM)。
- 可利用 /etc/hosts.allow 或 /etc/hosts.deny 来作为基础的防火墙。
- 当客户端有任何上传/下载的信息时,该信息被记录到 /var/log/xferlog 中。
- 主动式连接的端口为 port 20。
- 使用格林尼治时间(GMT)。
四、四种常见的报错
500报错:权限过大
530报错:认证失败
550报错:服务本身不允许
553报错:文件系统权限过小
五、vstpd 服务器的配置
1、对于服务端——172.25.254.1
(1)安装vsftpd
(2)启动vsftpd服务
命令通道对应的端口为 21。
(3)关闭防火墙
(4)关闭内核级的防火墙(selinux)
显示Disabled,代表selinux设置成功
2、对于客户端——172.25.254.2
(1)安装lftp
(2)进行测试:
能够成功连接,表成功
六、vsftpd 服务器的配置参数
在服务端
编辑vsftpd的配置文件:/etc/vsftpd/vsftpd.conf,即vim /etc/vsftpd/vsftpd.conf
因为修改的是配置文件,所以要重启vsftp服务,即systemctl restart vsftpd
在客户端
利用lftp命令进行测试
1、针对匿名用户
(1)匿名用户的设定
anonymous_enable=YES|NO 匿名用户登陆的限制
【1】、
当服务端为YES时
客户端测试结果如下:
【2】、
当服务端为NO时
客户端测试结果如下:
(2)匿名用户上传文件
anon_upload_enable=YES
write_enable=YES
修改匿名用户登陆的默认目录的权限:chmod 775 /var/ftp/pub + 修改匿名用户登陆的默认目录的所属组:chgrp ftp /var/ftp/pub 或 chown ftp.ftp /var/ftp/pub..
服务端:
客户端:
这里需要注意的是:只能在pub目录里面上传文件
(3)匿名用户上传文件/创建目录默认权限的修改
anono_umask=022
服务端:
客户端:
(4)匿名用户下载自己上传的文件/ pub 目录下的文件
anon_world_readable_only=NO(NO表示匿名用户可以下载自己上传的文件)
服务端:
客户端:
(5)匿名用户建立目录
anon_mkdir_write_enable=YES
服务端:
客户端:
这里需要注意的是:只能在pub目录里面建立目录,并且没有创建文件这个选项
(6)匿名用户删除自己上传的文件/自己建立目录/pub 目录下的文件或目录
anono_other_write_enable=YES
服务端:
客户端:
(7)匿名用户上传文件时,使用身份的修改
chown_uploads=YES
chown_username=student
值的注意的是:上传文件使用的身份仍然是 ftp 这个用户,只是上传之后的文件的拥有者发生了变化。即 ftp 用户对目录有 w 的权限即可。而 student 这个用户对目录可以没有 w 的权限。
服务端:
客户端:
在服务端看到文件的拥有者变为了我们所指定的用户student用户
(8)匿名用户家目录的修改
anon_root=/mnt 指定匿名用户的家目录为/mnt
服务端:
为了能够看到效果,在服务端的/mnt目录下创建一些文件以便区分
客户端:
看到的是/mnt目录中的文件,代表成功
(9)匿名用户的最大上传/下载速率
anno_max_rate=100000 # 限速为 100000Bytes (100KBytes)
服务端:
为了能够看出效果,在客户端创建一个较大的文件
客户端:
2、针对实体用户
(1)本地用户家目录的修改
local_root=/jiao
服务端:
在服务端创建目录 /xjj,为了能够看到效果,在/xjj目录下创建一些文件以便区分
客户端:
使用命令:lftp 172.25.254.1 -u student 或 lftp 172.25.254.1 -u student,student # 第一个 studnet 表示用户名,第二个 student 表示 student 这个用户名对应的密码是 student。
在客户端看到的是/xjj目录中的文件,代表修改成功
(2)本地用户上传文件/创建目录的默认权限的修改
local_umask=066
服务端:
为了使的用户能够上传文件,在服务端需要修改权限
客户端:
(3)限制本地用户浏览根目录
chroot_local_user=YES
chmod u-w /home/student
服务端:
为了排除影响,指定用户家目录的代码注释掉,即使得用户登陆之后是自己的家目录
客户端:
我们发现,必须修改权限,否则会报500(权限过大)的错误
在服务端修改 /home/student 目录的权限
客户端:
(4)用户黑名单的建立(黑名单中的用户不能访问根目录)
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
vim /etc/vsftpd/chroot_list
服务端:
在服务端修改 /home/chen 、/home/xin 目录的权限
客户端:
(5)用户白名单的建立(只有白名单中的用户可以访问根目录)
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
vim /etc/vsftpd/chroot_list
服务端:
客户端:
(6)限制本地用户登陆
vim /etc/vsftpd/ftpusers 永久黑名单
vim /etc/vsftpd/user_list 临时黑名单
/etc/vsftpd/ftpusers为永久黑名单
/etc/vsftpd/user_list为临时黑名单,通过设定可以变为白名单
(7)用户白名单的设定(只有白名单中出现的用户才能通过lftp远程连接)
userlist_enable=YES
userlist_deny=NO
/etc/vsftpd/user_list 上面两个参数设定好之后,此文件变成用户白名单,名单中出现的用户可以登陆ftp
服务端:
客户端:
(8)用户黑名单的设定(黑名单中出现的用户不能通过lftp远程连接)
userlist_enable=YES
userlist_deny=YES
/etc/vsftpd/user_list 此参数设定,此文件变成用户黑名单,黑名单中出现的用户不可以登陆ftp
服务端:
客户端:
3、针对访客用户
(1)ftp 访客用户的设定
服务端:
【1】、步骤一:编辑配置文件,用来存放访客用户的用户名和密码
vim /etc/vsftpd/xinfile 文件名称任意
【2】、步骤二:为了安全,将用户名和密码进行加密
db_load -T -t hash -f /etc/vsftpd/xinfile /etc/vsftpd/xinfile.db
【3】、步骤三:查看是否安装pam ps aux | grep pam
【4】步骤四:编辑解析文件 vim /etc/pam.d/xin
【5】、步骤五:修改vsftpd的解析文件 vim /etc/vsftpd/vsftpd.conf
pam_service_name=xin #这里的 xin 指的是 /etc/pam.d/xin
guest_enable=YES
为了防止影响,将/etc/vsftpd/user_list 文件中的 student 那行去掉
客户端:
此时,访客用户登陆的效果和匿名用户一样(因为还没有设置guest_username),登入之后默认的时pub目录
(2)访客用户家目录的统一指定
服务端:
步骤同(1),除了 步骤五
对于步骤五:修改vsftpd的解析文件 vim /etc/vsftpd/vsftpd.conf
pam_service_name=xin
guest_enable=YES
guest_username=student
chmod u-w /home/student
客户端:
值得一提的是:此时访客用户获得的身份是 student 用户的,那么 student 用户所具有的权限,访客用户应该都有(但是 没有对 /home/student 目录写的权限,因为有写的权限,会报 550 的错误。)
(3)访客用户家目录独立设定
服务端:
mkdir /ftphome/user1/user1dir -p
mkdir /ftphome/user2/user2dir -p
guest_username=ftp
local_root=/ftphome/$USER
user_sub_token=$USER
客户端:
可见:访客用户登陆之后是各自的家目录,表示设置成功
值得一提的是:此时访客用户获得的身份是 anoymous 用户的,那么 anoymous 用户所具有的权限,访客用户应该都有。
(4)访客用户独立配置
服务端:
user_config_dir=/etc/vsftpd/userconf
chmod 775 /ftphome/user1/user1dir
chmod 775 /ftphome/user2/user2dir
chgrp ftp /ftphome/user1/user1dir
chgrp ftp /ftphome/user2/user2dir
mkdir /etc/vsftpd/userconf
vim /etc/vsftpd/userconf/user1
示例:anon_upload_enable=YES
需要把anon_upload_enable=YES注释,否则相当于没有限制
客户端:
user1可以上传,user2不可以上传,表示对访客用户的独立设置实验成功。
4、服务端的最大连接数
max_clients=1
服务端:
客户端:
5、显示的时间问题
有个比较大的问题是,因为 vsftpd 默认使用 GMT 时间,所以你在客户端使用 fto 软件连接到 FTP 服务器时,会发现每个文件的时间都慢了 8 小时。
那怎么办呢?使用 use_localtime 这个参数。
服务端:
客户端:
6、限制同一个 ip 的连接数
max_per_ip=1
服务端:
客户端:
7、用户登录时显示一些欢迎信息的信息:
banner_file=/etc/vsftpd/welcome.txt
服务端:
客户端:
8、补充:
当selinux状态是enforcing ,且 firewalld 状态是 active 时,如何使得匿名用户可以登录 ftp 服务器,并且上传文件和下载文件呢?
(1)设置 防火墙允许 ftp 服务通过 ——使得匿名用户可以登录 ftp 服务器。
(2)查看安全上下文,并设定sebool值——使得匿名用户可以上传和下载文件
(3)修改/var/ftp/pub目录的权限和所属组
(4)编辑ftp服务的配置文件
(5)测试
9、通过浏览器取得 FTP 连接
FTP 协议在浏览器的地址栏中可以这样输入:
- ftp://username@your_ip
要记得,如果你没有输入 username@ 的字样时,系统默认会以匿名登录来处理这此连接。因此如果你想要使用实体用户连接时,就需在 IP 或主机名之前填写你的账号。举例来说,我的 FTP 服务器(172.25.254.1)若有 student 这个用户,那我启动浏览器后,可以这样做:
- ftp://student@172.25.254.1
然后在出现的对话框当中输入 student 的密码,就能够使用浏览器来管理我在 FTP 服务器内的文件系统了。设置,你连密码都想要写在网址中,那就更厉害了。
- ftp://student:yourpassword@172.25.254.1
七、让 vsftpd 增加 SSL 的加密功能——只有在图形界面(FileZilla 软件)才能看到效果
1、检查 vsftpd 有无支持 SSL 模块
2、建立证书
3、修改 vsftpd.conf 这个配置文件
[root@server vsftpd]# vim /etc/vsftpd/vsftpd.conf
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
require_ssl_reuse=NO
ssl_ciphers=HIGH
rsa_cert_file=/etc/vsftpd/.sshkey/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/.sshkey/vsftpd.pem
八、常见问题与解决之道
1、如果在 client 端上面发现无法连接成功,请检查:
- firewalld 防火墙的规则当中,是否开放了 client 端的 port 21 登录?
- 在 /etc/hosts.deny 当中,是否设置错误,导致 client 的登录权限被取消了?
2、如果 client 已经连上 vsftpd 服务器,但是却显示 “xxx file can't be open” 的字样,请检查:
- 最主要的原因还是在于在 vsftpd.conf 当中设置了检查某个文件,但是你却没有将该文件设置起来,所以,请检查 vsftpd.conf 里面所有设置的文件名,使用 touch 这个命令将该文件建立起来即可。
3、如果 client 已经连上 vsftpd 服务器,却无法使用某个账号登录,请检查:
- 在 vsftpd.conf 里面是设置了使用 PAM 模块来检验账号,以及利用 userlist_file 来管理账号?
- 请检查 /etc/vsftpd/ftpusers 以及 /etc/vsftpd/user_list 文件内是否将该账号写入了?
4、如果 client 无法上传文件,该如何操作?
- 最可能发生的原因就是在 vsftpd.conf 里面忘记加上 “write_enable=YES” 这个设置,请加入。
- 是否所要上传的目录权限不对,请以 chmod 或 chown 来修改。
- 是否 anonymous 的设置里面忘记加上了下面这个参数:
- anon_upload_enable=YES
- 是否因为设置了 E-mail 阻挡机制,又将 Email address 写入该文件中了,请检查。
- 是否设置了不许 ASCII 格式传送,但 Client 端却以 ASCII 传送。请在 client 端以 binary 格式来传送文件
- 检查一下 /var/log/messages,是否被 SELinux 所阻挡了。
如果上面的解决反感还是无法解决你的问题,请你务必分析一下这两个文件:/var/log/vsftpd.log 与 /var/log/messages ,里面有相当多的重要资料,可以提供进行排错。不过 /var/log/vsftpd.log 却默认不会出现,只有 /var/log/xferlog 而已。如果你想要加入 /var/log/vsftpd.log 的支持,可以这样做:
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
这样,未来有新连接或者是错误时,就会额外写一份到 /var/log/vsftpd.log 去。
九、sftp 与 ftps(通过 SSL 加密的 ftp)之间的区别
问题:想一想,既然有了 sftp 可以进行加密的 ftp 传输,那为何需要 ftps 呢?
答:因为既然要开放 sftp 的话,就需要同时放形 sshd 亦即 SSH 的连接,如此依赖,port 22 很可能会常常常被检测。若是 openssl、openssh 出问题,恐怕你的系统就会被绑架。如果 ftp 真的有必要存在,那么 通过 ftps 以及利用 vsftpd 这个较为安全的服务器软件来假设,理论上,是要比 sftp 来的安全些,至少对 Internet 放行 ftps 是这样。
十、FTP 连接软件:ftp、lftp
1、ftp 命令
ftp [host|IP] [port]
[root@client ~]# ftp 172.25.254.1
Connected to 172.25.254.1 (172.25.254.1).
220-hello <==之前配置的欢迎信息
220-你好 <==之前配置的欢迎信息
220
Name (172.25.254.1:root): anonymous <==输入用户名
331 Please specify the password.
Password: <==输入密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> help <==输入 help 来查看有哪些可以使用的命令
Commands may be abbreviated. Commands are:
! debug mdir sendport site
$ dir mget put size
account disconnect mkdir pwd status
append exit mls quit struct
ascii form mode quote system
bell get modtime recv sunique
binary glob mput reget tenex
bye hash newer rstatus tick
case help nmap rhelp trace
cd idle nlist rename type
cdup image ntrans reset user
chmod lcd open restart umask
close ls prompt rmdir verbose
cr macdef passive runique ?
delete mdelete proxy send
ftp>
2、lftp 命令
lftp [-p port] [-u user[,password]] [host|IP]
lftp -f filename
lftp -c commands
选项与参数:
-p:后面可以直接接上 FTP 主机提供的 port
-u:后面则是接上账号与密码,就能够连接上远程主机了
如果没有账号密码,lftp 默认会使用 anonymous 尝试匿名登录
-f:可以将命令写入脚本中,这样可以帮助进行 shell script 的自动处理
-c:后面直接加上所需要的命令
更多推荐
所有评论(0)