vsftpd
FTP (File Transfer Protocol)
- FTP分为服务端和客户端,服务端提供数据共享,客户端用于下载。
- 服务端默认端口20、21,其中21为默认监听端口,20为主动模式的数据传输端口,如果是被动模式,则默认情况下随机开启一个大于1024的端口进行数据传输。
- 客户端也会开启两个大于1024的端口,先开启一个等待服务端的连接,相当于监听端口,连接成功后再动态开启另一个大于1024的端口用于数据传输。
PORT(主动)方式和PASV(被动)方式的区别
-
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。
当需要传送数据时,客户端在命令链路上用 PORT命令告诉服务器:“我打开了xxx(大于1024)端口,你过来连接我”。于是服务器从20端口向客户端的xxx(大于1024)端口发送连接请求,建立一条数据链路来传送数据。
-
PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。
当需要传送数据时,服务器在命令链路上用 PASV命令告诉客户端:“我打开了xxx(大于1024)端口,你过来连接我”。于是客户端向服务器的xxx(大于1024)端口发送连接请求,建立一条数据链路来传送数据。
关于防火墙的配置,不论主被动模式,服务端都需要开启21端口INPUT方向用于给客户端连接,主动模式则开启OUTPUT方向的20允许通过,被动模式则根据设置的端口范围允许OUTPUT方向。iptables的配置参考
安装
# 安装ftp服务端
yum -y install vsftpd
# 安装ftp客户端
yum -y install ftp
# 启动服务
systemctl start vsftpd
配置文件
/etc/vsftpd/vsftpd.conf
全局设置
# 是否允许登陆用户有写权限。属于全局设置,默认值为YES。
write_enable=YES
# 是否允许为目录配置显示信息,当用户用CMD模式首次访问服务器上某个目录时,显示每个目录下面的.message隐藏文件的内容,此文件保存自定义的欢迎信息,由用户自己建立
#dirmessage_enable=YES
# 可以自定义FTP用户登录到服务器所看到的欢迎信息
#ftpd_banner=Welcome to blah FTP service.
# 日志文件设置
# 是否让系统自动维护上传和下载的日志文件,默认情况该日志文件为/var/log/vsftpd.log
xferlog_enable=YES
# 设置日志文件名和路径,默认值为/var/log/vsftpd.log
/var/log/vsftpd.log
# 是否以标准xferlog的格式书写传输日志文件,默认值为NO
#xferlog_std_format=YES
# 如果启用此选项,所有的FTP请求和响应都会被记录到日志中,默认日志文件在/var/log/vsftpd.log。启用此选项时,xferlog_std_format不能被激活。这个选项有助于调试。默认值为NO。
log_ftp_protocol=YES|NO(NO)
# 超时时间设置
# 设置建立FTP连接的超时时间,单位为秒。默认值为60。
accept_timeout=60
# PORT(主动)方式下建立数据连接的超时时间,单位为秒。默认值为60。
connect_timeout=60
# 设置多长时间不对FTP服务器进行任何操作,则断开该FTP连接,单位为秒。默认值为300
idle_session_timeout=300
# 设置建立FTP数据连接的超时时间,单位为秒。默认值为120。
data_connection_timeout=120
# 是否允许递归查询。默认为关闭,以防止远程用户造成过量的I/O
#ls_recurse_enable=YES
# 访问速率设置
# 设置匿名登入者使用的最大传输速度,单位为B/s,0 表示不限制速度。默认值为0。
anon_max_rate=0
# 本地用户使用的最大传输速度,单位为B/s,0 表示不限制速度。预设值为0。
local_max_rate=0
# FTP的工作方式与端口设置,FTP有两种工作方式:PORT FTP(主动模式)和PASV FTP(被动模式)
# 设置FTP服务器建立连接所监听的端口,默认值为21。
listen_port=21
# 指定FTP使用20端口进行数据传输,默认值为YES。
connect_from_port_20=YES/NO
# 设置在PORT方式下,FTP数据连接使用的端口,默认值为20。
ftp_data_port=20
# 若设置为YES,则使用PASV工作模式;若设置为NO,则使用PORT模式。默认值为YES,即使用PASV工作模式。
#pasv_enable=YES/NO(YES)
# 在PASV工作模式下,数据连接可以使用的端口范围的最大端口,0 表示任意端口。默认值为0。
pasv_max_port=0
# 在PASV工作模式下,数据连接可以使用的端口范围的最小端口,0 表示任意端口。默认值为0。
pasv_min_port=0
# 与连接相关的设置
# 设置vsftpd服务器是否以standalone模式运行。以standalone模式运行是一种较好的方式,此时listen必须设置为YES,此为默 认值。建议不要更改,有很多与服务器运行相关的配置命令,需要在此模式下才有效。若设置为NO,则vsftpd不是以独立的服务运行,要受到xinetd 服务的管控,功能上会受到限制。
listen=YES/NO(YES)
# 设置vsftpd允许的最大连接数,默认值为0,表示不受限制。若设置为100时,则同时允许有100个连接,超出的将被拒绝。只有在standalone模式运行才有效。
max_clients=0
# 设置每个IP允许与FTP服务器同时建立连接的数目。默认值为0,表示不受限制。只有在standalone模式运行才有效。
max_per_ip=0
# 设置FTP服务器在指定的IP地址上侦听用户的FTP请求。若不设置,则对服务器绑定的所有IP地址进行侦听。只有在standalone模式运行才有效。
listen_address=IP地址
# 设置每个与FTP服务器的连接,是否以不同的进程表现出来。默认值为NO,此时使用ps aux |grep ftp只会有一个vsftpd的进程。若设置为YES,则每个连接都会有一个vsftpd的进程。
setproctitle_enable=YES/NO(NO)
# 数据传输模式设置,FTP在传输数据时,可以使用二进制方式,也可以使用ASCII模式来上传或下载数据。
# 设置是否启用ASCII 模式上传数据。默认值为NO。
ascii_upload_enable=YES/NO(NO)
# 设置是否启用ASCII 模式下载数据。默认值为NO。
ascii_download_enable=YES/NO(NO)
本地用户设置
# 是否允许本地用户(即linux系统中的用户帐号)登录FTP服务器,默认设置为YES允许
# 本地用户登录后会进入用户主目录,而匿名用户登录后进入匿名用户的下载目录/var/ftp/pub
local_enable=YES
# 当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录。
local_root=/home/username
# 是否允许登陆用户有写权限。属于全局设置,默认值为YES。
# write_enable=YES/NO(YES)
# 本地用户新增档案时的umask 值。默认值为077。
local_umask=022
# 本地用户上传档案后的档案权限,与chmod 所使用的数值相同。默认值为0666。
file_open_mode=0755
匿名用户设置
# 是否允许匿名登录FTP服务器,默认设置为YES允许
# 匿名用户使用的登陆名为ftp或anonymous,口令为空;匿名用户不能离开匿名用户家目录/var/ftp,且只能下载不能上传。
anonymous_enable=YES
# 若是启动这项功能,则使用匿名登入时,不会询问密码。默认值为NO。
# no_anon_password=YES/NO(NO)
# 定义匿名登入的使用者名称。默认值为ftp
ftp_username=ftp
# 使用匿名登入时,所登入的目录。默认值为/var/ftp。注意ftp目录不能是777的权限属性,即匿名用户的家目录不能有777的权限。
anon_root=/var/ftp
# 如果设为YES,则允许匿名登入者有上传文件(非目录)的权限,只有在write_enable=YES时,此项才有效。
# 当然,匿名用户必须要有对上层目录的写入权。默认值为NO。
#anon_upload_enable=YES/NO(NO)
# 如果设为YES,则允许匿名登入者下载可阅读的档案(可以下载到本机阅读,不能直接在FTP服务器中打开阅读)。默认值为YES。
# anon_world_readable_only=YES/NO(YES)
# 如果设为YES,则允许匿名登入者有新增目录的权限,只有在write_enable=YES时,此项才有效。
# 当然,匿名用户必须要有对上层目录的写入权。默认值为NO。
#anon_mkdir_write_enable=YES/NO(NO)
# 如果设为YES,则允许匿名登入者更多于上传或者建立目录之外的权限,譬如删除或者重命名。
#anon_other_write_enable=YES/NO(NO)
# 设置匿名登入者新增或上传档案时的umask 值。默认值为077,则新建档案的对应权限为700。
anon_umask=077
# 是否允许匿名用户上传文件,须将全局的write_enable=YES。默认为YES
#anon_upload_enable=YES
# 是否允许匿名用户创建新文件夹
#anon_mkdir_write_enable=YES
# 若是启动这项功能,则必须提供一个档案/etc/vsftpd/banner_emails,内容为email address。
# 若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入。默认值为NO。
deny_email_enable=YES/NO(NO)
# 此文件用来输入email address,只有在deny_email_enable=YES时,才会使用到此档案。
# 若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入。
banned_email_file=/etc/vsftpd/banner_emails
# 设定是否允许改变上传文件的属主,与下面一个设定项配合使用,不推荐使用root用户上传文件
#chown_uploads=YES
# 设置想要改变的上传文件的属主,如果需要,则输入一个系统用户名
#chown_username=whoever
控制用户是否允许切换到上级目录
# 在默认配置下,本地用户登入FTP后可以使用cd命令切换到其他目录,这样会对系统带来安全隐患。可以通过以下三条配置文件来控制用户切换目录。
# 设置是否启用chroot_list_file配置项指定的用户列表文件。默认值为NO。
chroot_list_enable=YES/NO(NO)
# 用于指定用户列表文件,该文件用于控制哪些用户可以切换到用户家目录的上级目录。
chroot_list_file=/etc/vsftpd.chroot_list
# 用于指定用户列表文件中的用户是否允许切换到上级目录。默认值为NO。
chroot_local_user=YES/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时,所有的用户均可以切换到其他目录。
访问控制设置
两种控制方式:一种控制主机访问,另一种控制用户访问。
①控制主机访问:
# 设置vsftpd是否与tcp wrapper相结合来进行主机的访问控制。默认值为YES。如果启用,则vsftpd服务器会检查/etc/hosts.allow 和/etc/hosts.deny 中的设置,来决定请求连接的主机,是否允许访问该FTP服务器。这两个文件可以起到简易的防火墙功能。
tcp_wrappers=YES/NO(YES)
# 比如:若要仅允许192.168.0.1—192.168.0.254的用户可以连接FTP服务器,则在/etc/hosts.allow文件中添加以下内容:
vsftpd:192.168.0. :allow
all:all :deny
②控制用户访问:
# 对于用户的访问控制可以通过/etc目录下的vsftpd.user_list和ftpusers文件来实现。
# 控制用户访问FTP的文件,里面写着用户名称。一个用户名称一行。
userlist_file=/etc/vsftpd.user_list
# 是否启用vsftpd.user_list文件。
userlist_enable=YES/NO(NO)
# 决定vsftpd.user_list文件中的用户是否能够访问FTP服务器。若设置为YES,则vsftpd.user_list文件中的用户不允许访问FTP,若设置为NO,则只有vsftpd.user_list文件中的用户才能访问FTP。
userlist_deny=YES/NO(YES)
/etc/vsftpd/ftpusers文件专门用于定义不允许访问FTP服务器的用户列表(注意:如果 userlist_enable=YES,userlist_deny=NO,此时如果在vsftpd.user_list和ftpusers中都有某个用户时,那么这个用户是不能够访问FTP的,即ftpusers的优先级要高)。默认情况下vsftpd.user_list和ftpusers,这两个文件已经预设置了一些不允许访问FTP服务器的系统内部账户。如果系统没有这两个文件,那么新建这两个文件,将用户添加进去即可。
虚拟用户设置
# 虚拟用户使用PAM认证方式。
# 设置PAM使用的名称,默认值为/etc/pam.d/vsftpd。
pam_service_name=vsftpd
# 启用虚拟用户。默认值为NO。
guest_enable= YES/NO(NO)
# 这里用来映射虚拟用户。默认值为ftp。
guest_username=ftp
# 当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限。默认情况下此参数是关闭的(NO)。
virtual_use_local_privs=YES/NO(NO)
FTP客户端命令
# 连接登录,直接ftp ip就行
ftp -v -d -i -n -g [主机名]
-v - 禁止显示远程服务器相应信息
-n - 禁止自动登录
-i - 多文件传输过程中关闭交互提示
-d - 启用调试,显示所有客户端与服务器端传递的命令
-g - 禁用文件名通配符,允许在本地文件和路径名中使用
# 登录以后的命令
# 显示该ftp服务器的部分信息,没啥用
ftp> status
# 结束FTP会话并退出
ftp> bye
# 设置文件传输类型为ASCII,默认类型
ftp> ascii
# 设置文件传输类型为binary(二进制传输)
ftp> binary
# 删除单个文件,需授权,否则报550 Permission denied.错误
ftp> delete [filename]
# 删除多个文件
ftp> mdelete [filename1] [filename2]
# 下载单个文件,该文件在服务端需具有其它用户读权限,类似chmod 444这种,如无权限报错:550 Failed to open file.
# 下载以后会存放在登录ftp时的当前目录
ftp> get [filename]
# 复制多个文件到本地
ftp> mget [filename1] [filename2]
# 复制一个本地文件到ftp服务器
ftp> put [filename]
# 复制多个本地文件到ftp服务器
ftp> mput [filename1] [filenam2]
# 向远程服务器追加本地文件
ftp> append [filename]
# 关闭多个文件操作时需挨个确认的交互提示
ftp> prompt