FTP是(File Transfer Protocol )文件传输协议的缩写。 FTP会话时包含了两个通道,一个叫控制通道,一个叫数据通道。
控制通道:控制通道是和FTP服务器进行沟通的通道,连接FTP,发送FTP指令都是通过控制通道来完成的。 数据通道:数据通道是和FTP服务器进行文件传输或者列表的通道。FTP协议中,控制连接均由客户端发起,而数据连接有两种工作方式:PORT方式和PASV方式
PORT模式(主动方式)
FTP 客户端首先和FTP Server的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口(一个大于1024的端口)接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。PASV模式(被动方式)
在建立控制通道的时候和PORT模式类似,当客户端通过这个通道发送PASV 命令的时候,FTP server打开一个位于1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后FTP server 将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接传送数据。要在Linux/Unix服务器上搭建一个安全、高性能、稳定性好的FTP服务器,那么vsftpd是首选应用。vsftpd意思为“very secure FTP daemon(非常安全的FTP进程)”,是一个基于GPL发布的类UNIX类操作系统上运行的服务器的名字(是一种守护进程),可以运行在诸如Linux、BSD、Solaris、HP-UX以及Irix等系统上面。vsftpd支持很多其他传统的FTP服务器不支持的良好特性,比如:
非常高的安全性需求 带宽限制 良好的可伸缩性 创建虚拟用户的可能性 IPv6支持 中等偏上的性能 分配虚拟 IP 的可能性 高速vsFTPd运行有两种模式,在RPM包管理的系重审统,大多是由Fedora/Redhat 开发而来,对于这样的系统有xinted服务器一说;对于非RPM包管理的系统,一般没有xinted这一说。为了保证本文档的统一,我们都不要用xinetd模式,而用initd运行模式来启动和管理服务器,也就是独立运行模式。
相关阅读:什么是xinetd模式和initd模式
像其它守护程序一样,vsftpd提供了standalone和inetd(inetd或xinetd)两种运行模式。简单解释一下, standalone一次性启动,运行期间一直驻留在内存中,优点是对接入信号反应快,缺点是损耗了一定的系统资源,因此经常应用于对实时反应要求较高的专业FTP服务器。inetd恰恰相反,由于只在外部连接发送请求时才调用FTP进程,因此不适合应用在同时连接数量较多的系统。此外,inetd模式不占用系统资源。除了反应速度和占用资源两方面的影响外,vsftpd还提供了一些额外的高级功能,如inetd模式支持per_IP(单一IP)限制,而 standalone模式则更有利于PAM验证功能的应用。
1.xinetd运行模式
大多数较新的系统采用的是xinetd超级服务守护进程。使用“vi /etc/xinetd.d/vsftpd” 看一下它的内容,如下: disable = no socket_type = stream wait = no # 这表示设备是激活的,它正在使用标准的TCP Sockets。 如果“/etc/vsftpd.conf”中的有选项为“listen=YES”,注销它 最后,重启xinetd,命令如下: $ /etc/rc.d/init.d/xinetd restart 需要注意的是,“/etc/xinetd.d”目录中仅能开启一个FTP服务。2.standalone模式
standalone模式便于实现PAM验证功能。进入这种模式首先要关闭xinetd下的vsftpd,设置 “disable = yes”,或者注销掉“/etc/inetd.conf”中相应的行。然后修改“/etc/vsftpd.con f”中的选项为“listen=YES”。 如果是standlone模式,那么它是作为单独的一个服务启动的,不需要系统协作,不作为系统服务, 如果要是成为xinetd模式,那么它的服务就要受系统服务的限制,比如创建一个新的服务进程,但是也有缺点,如果xinetd服务本身出了问题,那么相关的服务也是会受到影响的。xinetd模式和standalone模式的区别
以xinetd模式运行的服务表示该服务进程并不以守护进程执行,以FTPD进程为例吧,以xinetd模式运行这个服务,情况是这样的,本身FTP服务是会监听21号端口的,但是以这种模式运行这个服务的话,21号端口则由xinetd进程来监听(此时FTPD服务并没有运行),如果你的网卡接收到有21号端口请求,则有xinetd进程会去调用FTPD程序,将在21号端口接收到的请求数据移交给FTPD进程去处理,处理完后FTPD进程退出,而xinetd进程继续监听21号端口,这有点类似windows的svhost进程;而以 standalone模式运行的服务则是服务进程,如ftpd以守护进程在内存中运行,接收到21号端口的请求后由FTPD进程fork出一个子进程进行处理,而原进程继续监听21号端口。基本知识和拓展知识完了我们来搭建FTP服务器了
1.使用yum工具安装vsftp服务,安装完成需要启动服务 2.使用yum工具安装lftp lftp命令是一款优秀的文件客户端程序,它支持ftp、SETP、HTTP和FTPs等多种文件传输协议。更多内容请阅读 Linux lftp命令
3.本机通过lftp命令连接ftp服务器 注意上面示例中本机连接ftp没有问题,但是其他主机连接不上!
4.设置ftp服务使得可达主机均可连接
如果要让外部能够访问那就需要设置防火墙策略或者直接关闭防火墙 firewall-config命令可以打开图形界面的防火墙配置 如下图右侧所选,然后在opiton选中中reload firewall即可 另外与进程有关的还有 SELinux 这个加强文件存取安全性的软件,需要disabled掉,可以使用命令system-config-selinux打开图形界面,也可以修改文件/etc/sysconfig/selinux!
vsftpd的主配置文件/etc/vsftpd/vsftpd.conf说明 和Linux系统中的大多数配置文件一样,vsftpd的配置文件中以#开始注释。
# 是否允许匿名登录FTP服务器,默认设置为YES允许 # 用户可使用用户名ftp或anonymous进行ftp登录,口令为用户的E-mail地址。 # 如不允许匿名访问则设置为NO anonymous_enable=YES # 是否允许本地用户(即linux系统中的用户帐号)登录FTP服务器,默认设置为YES允许 # 本地用户登录后会进入用户主目录,而匿名用户登录后进入匿名用户的下载目录/var/ftp/pub # 若只允许匿名用户访问,前面加上#注释掉即可阻止本地用户访问FTP服务器 local_enable=YES # 是否允许本地用户对FTP服务器文件具有写权限,默认设置为YES允许 write_enable=YES # 掩码,本地用户默认掩码为077 # 你可以设置本地用户的文件掩码为缺省022,也可根据个人喜好将其设置为其他值 #local_umask=022 # 是否允许匿名用户上传文件,须将全局的write_enable=YES。默认为YES #anon_upload_enable=YES # 是否允许匿名用户创建新文件夹 #anon_mkdir_write_enable=YES # 是否激活目录欢迎信息功能 # 当用户用CMD模式首次访问服务器上某个目录时,FTP服务器将显示欢迎信息 # 默认情况下,欢迎信息是通过该目录下的.message文件获得的 # 此文件保存自定义的欢迎信息,由用户自己建立 #dirmessage_enable=YES # 是否让系统自动维护上传和下载的日志文件 # 默认情况该日志文件为/var/log/vsftpd.log,也可以通过下面的xferlog_file选项对其进行设定 # 默认值为NO xferlog_enable=YES # Make sure PORT transfer connections originate from port 20 (ftp-data). # 是否设定FTP服务器将启用FTP数据端口的连接请求 # ftp-data数据传输,21为连接控制端口 connect_from_port_20=YES # 设定是否允许改变上传文件的属主,与下面一个设定项配合使用 # 注意,不推荐使用root用户上传文件 #chown_uploads=YES # 设置想要改变的上传文件的属主,如果需要,则输入一个系统用户名 # 可以把上传的文件都改成root属主。whoever:任何人 #chown_username=whoever # 设定系统维护记录FTP服务器上传和下载情况的日志文件 # /var/log/vsftpd.log是默认的,也可以另设其它 #xferlog_file=/var/log/vsftpd.log # 是否以标准xferlog的格式书写传输日志文件 # 默认为/var/log/xferlog,也可以通过xferlog_file选项对其进行设定 # 默认值为NO #xferlog_std_format=YES # 以下是附加配置,添加相应的选项将启用相应的设置 # 是否生成两个相似的日志文件 # 默认在/var/log/xferlog和/var/log/vsftpd.log目录下 # 前者是wu_ftpd类型的传输日志,可以利用标准日志工具对其进行分析;后者是vsftpd类型的日志 #dual_log_enable # 是否将原本输出到/var/log/vsftpd.log中的日志,输出到系统日志 #syslog_enable # 设置数据传输中断间隔时间,此语句表示空闲的用户会话中断时间为600秒 # 即当数据传输结束后,用户连接FTP服务器的时间不应超过600秒。可以根据实际情况对该值进行修改 #idle_session_timeout=600 # 设置数据连接超时时间,该语句表示数据连接超时时间为120秒,可根据实际情况对其个修改 #data_connection_timeout=120 # 运行vsftpd需要的非特权系统用户,缺省是nobody #nopriv_user=ftpsecure # 是否识别异步ABOR请求。 # 如果FTP client会下达“async ABOR”这个指令时,这个设定才需要启用 # 而一般此设定并不安全,所以通常将其取消 #async_abor_enable=YES # 是否以ASCII方式传输数据。默认情况下,服务器会忽略ASCII方式的请求。 # 启用此选项将允许服务器以ASCII方式传输数据 # 不过,这样可能会导致由"SIZE /big/file"方式引起的DoS攻击 #ascii_upload_enable=YES #ascii_download_enable=YES # 登录FTP服务器时显示的欢迎信息 # 如有需要,可在更改目录欢迎信息的目录下创建名为.message的文件,并写入欢迎信息保存后 #ftpd_banner=Welcome to blah FTP service. # 黑名单设置。如果很讨厌某些email address,就可以使用此设定来取消他的登录权限 # 可以将某些特殊的email address抵挡住。 #deny_email_enable=YES # 当上面的deny_email_enable=YES时,可以利用这个设定项来规定哪些邮件地址不可登录vsftpd服务器 # 此文件需用户自己创建,一行一个email address即可 #banned_email_file=/etc/vsftpd/banned_emails # 用户登录FTP服务器后是否具有访问自己目录以外的其他文件的权限 # 设置为YES时,用户被锁定在自己的home目录中,vsftpd将在下面chroot_list_file选项值的位置寻找chroot_list文件 # 必须与下面的设置项配合 #chroot_list_enable=YES # 被列入此文件的用户,在登录后将不能切换到自己目录以外的其他目录 # 从而有利于FTP服务器的安全管理和隐私保护。此文件需自己建立 #chroot_list_file=/etc/vsftpd/chroot_list # 是否允许递归查询。默认为关闭,以防止远程用户造成过量的I/O #ls_recurse_enable=YES # 是否允许监听。 # 如果设置为YES,则vsftpd将以独立模式运行,由vsftpd自己监听和处理IPv4端口的连接请求 listen=YES # 设定是否支持IPV6。如要同时监听IPv4和IPv6端口, # 则必须运行两套vsftpd,采用两套配置文件 # 同时确保其中有一个监听选项是被注释掉的 #listen_ipv6=YES # 设置PAM外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件 # 此文件中file=/etc/vsftpd/ftpusers字段,说明了PAM模块能抵挡的帐号内容来自文件/etc/vsftpd/ftpusers中 #pam_service_name=vsftpd # 是否允许ftpusers文件中的用户登录FTP服务器,默认为NO # 若此项设为YES,则user_list文件中的用户允许登录FTP服务器 # 而如果同时设置了userlist_deny=YES,则user_list文件中的用户将不允许登录FTP服务器,甚至连输入密码提示信息都没有 #userlist_enable=YES/NO # 设置是否阻扯user_list文件中的用户登录FTP服务器,默认为YES #userlist_deny=YES/NO # 是否使用tcp_wrappers作为主机访问控制方式。 # tcp_wrappers可以实现linux系统中网络服务的基于主机地址的访问控制 # 在/etc目录中的hosts.allow和hosts.deny两个文件用于设置tcp_wrappers的访问控制 # 前者设置允许访问记录,后者设置拒绝访问记录。 # 如想限制某些主机对FTP服务器192.168.57.2的匿名访问,编缉/etc/hosts.allow文件,如在下面增加两行命令: # vsftpd:192.168.57.1:DENY 和vsftpd:192.168.57.9:DENY # 表明限制IP为192.168.57.1/192.168.57.9主机访问IP为192.168.57.2的FTP服务器 # 此时FTP服务器虽可以PING通,但无法连接 tcp_wrappers=YES匿名登陆(ftp用户)通过改变文件组为ftp限制用户操作(local_umask=022)
例如匿名用户的上传限制修改
1.首先打开配置文件增加以下参数设置 write_enable=YES anon_upload_enable=YES 2.修改目录权限 chgrp ftp /var/ftp/pub chmod 775 /var/ftp/pub 3.重启服务 systemctl restart vsftpdlftp -u username 172.25.254.136 对应配置的各参数以及最终实现的作用
local_root=/lockey#设置用户家目录 chroot_local_user=NO#锁定用户到家目录中 chroot_local_user=YES#用户可以任意且话目录 chroot_list_enable=YES#开启用户黑白名单 chroot_list_file=/etc/vsftpd/chroot_list#用户访问白名单 chroot_list_enable=YES 是否将系统用户限制在自己的home目录下 chroot_list_file=/etc/vsftpd/chroot_list 如果chroot_list_enable=YES 那么在/etc/vsftpd/chroot_list 中列出的是被限制的用户的列表在虚拟用户使用vsftpd服务器之前,要对服务器进行配置,主要包括如下几个步骤:
(1)生成虚拟用户口令库文件。 (2)配置生成vsftpd的认证文件。 (3)建立虚拟用户访问所需要的目录并且设定相应的访问权限。 (4)建立配置文件。 (5)重新启动vsftpd服务器。1.首先创建用户密码表,添加用户及对应的密码,一行用户名一行密码
vim /etc/vsftpd/test user1#用户 123#密码 user2#用户 123#密码2.将用户密码表加密
db_load -T -t hash -f test login.db #转换 转换方式 哈希 文件3.编辑系统关于ftp登录检测的文件,格式如下
vim /etc/pam.d/virtual auth required pam_userdb.so db=/etc/vsftpd/login(后缀不需要,系统会自动检测) account required pam_userdb.so db=/etc/vsftpd/login4.修改配置文件
pam_service_name=vsftpd 改为pam_service_name=login(读取用户列表文件) 添加 guest_enable=YES(开启虚拟用户访问) guest_username=ftp(虚拟用户影射)systemctl restart vsftpd
0.firewalld策略 1.selinux : SELINUX=disable 2.vim /etc/vsftpd/vsftpd.conf anon_upload_enable=YES 3.给目录权限chmod 777 /var/ftp/pub chgrp ftp /var/ftp/pub 4.semanage fcontext -a -t public_content)rw_t ‘/var/ftp/pub(/.*)?’ restorecon -RvvF /var/ftp/pub/ getsebool -a | grep ftp setsebool -P ftpd_anon_write on 关于用户目录操作的一个常见错误及原因 例如用户要切换到一个指定目录下 原因:组用户对于目录的权限过大,需要执行以下命令 chmod g-w /test/ftp
