前言
学技术,自己一向认为,一定不要不求甚解,尤其作为并未接受过相关知识系统教育的人,因为对知识体系缺乏系统全面的认识,故在平常自学中,更应该多动手实践,实践能亲手验证相关问题,获得成就感,同时也能加深理解,或获得意外收获。
自己对Linux 系统知之甚少,很多概念的东西也比较模糊,更多时候是针对某个具体知识点进行学习与实践,相信随着积累,自己学习的知识一定会慢慢系统化,这算是对自己的鼓励吧。
本来是要在虚拟机Linux系统中安装其他软件,但安装包在本机,故想通过FTP传入虚拟机进行安装,对Linux 中FTP服务也不太清楚,没办法,从基础开始实践咯。此日志关系FTP安装及配置。
一、环境准备
采用windows系统上安装虚拟机方式运行Linux系统。相关软件或系统如下:
虚拟机软件VMware workstation player16:https://www.vmware.com/cn/products/workstation-player/workstation-player-evaluation.html
Linux系统(Centos7):https://mirrors.aliyun.com/centos/
注:VMware 中试过暂时无法安装Centos8。
二、Centos 系统安装FTP服务
Linux系统中安装软件与windows系统不同,Linux中软件需从软件源下载,软件源相当于软件仓库。软件源并没有统一的由谁管理,只要你乐意,你也可以制作软件源并公开出来,为了更直观的感受,看看阿里云下载的Centos7中默认的软件源(网易软件源:http://mirrors.163.com/)。软件源相关的概念可从其他地方深入了解,此处仅关注如何在Linux 中安装软件。
已经知道软件存在于软件源,那么如下安装到本地Linux 系统呢?Linux系统中安装软件需用到软件包管理器,不同版本Linux系统中使用的软件包管理器是不太相同的,汇总起来一般是:yum、apt、rpm、dpkg,使用的Centos7中采用的是yum。
软件包管理器区别:https://blog.csdn.net/qq_26182553/article/details/79869666
Windows系统中,需要知道软件安装包下载地址,下载安装即可,Linux中需要知道需安装软件的名称,软件包管理器会自动从系统的软件源中查找并下载。下面开始安装FTP服务(软件名vsftpd)。
1、查看软件源
# 查看软件源
yum repolist
结果:
2、安装FTP服务
# 安装ftp服务
yum -y install vsftpd
3、查看FTP服务安装位置
# 查看ftp服务安装位置(需在/目录下执行)
find -name vsftpd
结果:
说明:此实践各项操作都是在超级管理员下进行。/etc 目录下一般放置的都是配置文件,从图中看出安装位置为/usr/sbin/vsftpd。
4、运行FTP服务
# 运行|重启ftp服务
service vsftpd start|restart
# 查看控制进程中运行中的vsftpd
top
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/0f7fc14352ea768426723db6148f0cca.png)
5、Windows中连接虚拟机ftp服务
打开Window cmd窗口,查看windows中ftp服务提供的各项命令:
基础命令:
# ftp基础命令
# 连接某域名ftp服务器
open 域名
# 关闭连接
close
# 退出ftp命令
bye
先查看虚拟机的ip地址(此实践中为:192.168.80.129):
# 虚拟机中查看主机ip信息
ip address show
window cmd窗口通过ftp工具连接虚拟机ftp服务:
可看到连接成功,但登陆失败了,说明FTP服务是正常的,后面就涉及到FTP服务的配置了。
三、FTP服务配置
1、默认配置文件配置内容
从前面通过find命令查看vsftpd 位置大概知道,ftp服务配置文件位置为:/etc/vsftpd。查看该目录/文件情况:
![](https://i-blog.csdnimg.cn/blog_migrate/89e9fff45f15cd83dd7d1ba9eaa966ba.png)
从文件列表大可知,ftpusers、user_list大概存放了ftp服务管理的用户信息,暂时不管,我们查看下配置文件vsftpd.conf 原内容。
翻译及整理后默认配置文件中所有配置项说明如下:
# 配置样例文件,/etc/vsftpd/vsftpd.conf
# 这份文件简化了ftp的部分配置,让ftp精灵进程更加有用。请查看vsftpd.conf.5以获取所有遵循的配置。
# 注意:这份文件中配置项并不是ftp的完整配置项清单,请查看vsftpd.conf.5手册以了解ftp的完整能力。
#
anonymous_enable=YES # 是否允许匿名FTP(默认开启,注释掉也将是开启)
local_enable=YES # 去注释以允许本地用户登录。在SELinux在为ftp_home_dir进行强制检查时,配置项有用
write_enable=YES # 去注释以允许所有写命令
local_umask=022 # 本地用户的默认umask端口是077,大多数ftpd服务是用的022端口,故根据需要设置此配置项值
#anon_upload_enable=YES # 是否允许匿名用户上传文件,为true时还需write_enable为YES时生效。在SELinux 对allow_ftpd_anon_write与allow_ftpd_full_access 布尔值进行强制检查时有用。
#anon_mkdir_write_enable=YES # 是否允许匿名用户创建新路径
dirmessage_enable=YES # 用户进入某目录时,是否将路径信息返回给访问用户
xferlog_enable=YES # 是否打开上传与下载日志记录功能
connect_from_port_20=YES # 是否确保从端口20(数据端口)进行连接(ftp一般用的20、21端口,21为控制端口即读写命令用)
#chown_uploads=YES # 是否让一个匿名文件(匿名用户上传)可被另一个用户拥有。建议不要用root用户上传文件!(chown即change own,为linux命令)
#chown_username=whoever
#xferlog_file=/var/log/xferlog # 用此配置项以重新制定日志文件位置
xferlog_std_format=YES # 是否以ftpd xferlog标准格式输出日志,记住默认日志文件位置为/var/log/xferlog
#idle_session_timeout=600 # 会话空闲多长时间后认为超时
#data_connection_timeout=120 # 数据连接多长时间后认为超时
#nopriv_user=ftpsecure # 定义一个唯一用户用于ftp server作为完全隔离及未授权的用户。建议定义
#async_abor_enable=YES # 定义此配置项后,服务器将能处理异步ABOR请求,处于安全考虑时不应开启,但若不开启,部分老的ftp客户端连接可能出问题(注ftp ABOR命令会中断正在进行的数据通道,但不会关闭控制通道,故开启时可能存在部分正在传输数据时传输中断的情况。ABOR用于开启紧急的连接。)
#ascii_upload_enable=YES # 默认情况下,ftp服务会假装允许ASCII模式但实际上忽略此请求。打开此选项以允许ftp服务在ASCII模式时对文件进行mangling操作。vsftpd.conf(5)人工手册解释了此选项关闭时的默认行为。请记住在一些ftp服务中,ASCII支持可通过“SIZE /big/file”命令来允许否定服务攻击(DoS,Denial # of service)。ASCII 模式是FTP协议中恐怖的特点。
#ascii_download_enable=YES
#ftpd_banner=Welcome to blah FTP service. # 可通过此配置项自定义登录banner 字符串
#deny_email_enable=YES # 你可以指定一个不允许匿名电子邮件地址的文件。对某些DoS攻击显然有用。
# (默认遵循)
#banned_email_file=/etc/vsftpd/banned_emails
#chroot_local_user=YES # 你可指定一个特定的本地用户清单,使其允许通过chroot() 到他们的home路径。如果chroot_local_user设置为YES,那么这个列表就变成不可chroot()的用户列表。(警告:chroot操作非常危险,如果使用chroot,请确保用户在chroot内没有顶级目录的写权限。)
#chroot_list_enable=YES
# (默认遵循)
#chroot_list_file=/etc/vsftpd/chroot_list
#list_recure_enable=YES # 你可能会激活内建的ls的“-R”选项。此选项默认关闭,主要为了防止远程用户可能导致的大量I/O,尤其在大型站点上。然而,一些中间件FTP客户端,如“ncftp”、“mirror”假定使用了“-R”,此时鼓励开启此选项。
#listen=NO # 当listen指令启用时,vsftpd运行在standalone模式并监听ipv4 socket。这个指令不能与listen_ipv6一起使用
listen_ipv6=YES # 监听ipv6 socket,与listen二选一,即不能同时监听ipv4与ipv6 socket
pam_service_name=vsftpd # PAM认证模块对应的文件,此配置即对应pam模块相应配置文件(/etc/pam.d/vsfpd)
userlist_enable=YES # 与登录相关,此配置为YES,不允许user_list 与ftpusers中用户登录,否则允许,默认YES
tcp_wrappers=YES # 作用暂未知,后面了解
查看FTP服务所有配置项文档 :1、http://vsftpd.beasts.org/vsftpd_conf.html ;2、https://linux.die.net/man/5/vsftpd.conf。
多读读配置项文档,理解能更上一个层次!
2、登录FTP服务
在使用默认配置情况下,登录FTP返回530,Permission Denied。根据此提示怀疑是权限问题,是否为user_list中配置问题呢?查看下配置文件中user_list文件(/etc/vsftpd/user_list):
此文件头部的说明中得知:
1)、当userlist_deny=NO时,仅允许此文件中列出的用户访问服务,当user_list=YES时(默认),从不允许此文件中列出的用户访问,甚至不会提示用户提交密码;
2)、vsftpd默认的PAM 配置也会检查"/etc/vsftpd/ftpusers"以决定不能访问的用户。
所以用户要能访问,至少需满足以上2点中的条件。故分别修改配置文件(/etc/vsftpd/vsftpd.conf)中配置项userlist_deny值为NO,并且修改ftpusers 中用户列表,去掉用户root,重启ftp服务:
service vsftpd restart
Windows cmd窗口再次测试连接ftp服务结果:
3、FTP资源文件管理
上一步中,用户root 已经可以通过ftp方式登录Linux系统访问ftp服务,执行ls命令后可见仅有一个文件anaconda-ks.cfg文件,问题在于,vsftpd.conf配置文件中并不能看出ftp服务的资源文件位置,或者说我们如何才能设置某个路径为我们的FTP服务工作路径呢?
此处对这个问题闲聊下。首先,在Linux了解上,不是小白,真问不出这个问题;其次,这个问题本身提问方式是不正确的。
这并非坏事,就如小朋友学东西是很快的,因为在这之前,他们对所学一无所知,此外,你看小朋友的某些问题,常常让你觉得不可思议:他们怎么会提出这样基础的问题?没错,在大人看来,很多东西理所当然,但在小朋友眼里,可能还只是一堆问号!
回到问题本身,第一个疑问,登录ftp服务位置,并不能看出资源文件位置。因为ftp登录成功,通过ls查看的到的文件列表并非绝对路径,所以考虑用find命令查看anaconda-ks.cfg文件位置,发现居然在/root下,而此目录特殊地方在于,它是我登录账号root的hom根路径,那么是否意味着登录ftp之后的资源位置其实就是用户的根目录呢?实际上,经过测试,确实如此,那么第二个问题也一同顺带解答了,也难怪实际工作中,为了文件统一管理,我们通常会新建一个用户,专用于登录ftp。
此处疑问从提出到解决过程中,自己最大的收获在于,自己对Linux 用户关于与FTP服务有了新的认识。
Linux 中所有操作都是通过用户登录账号后进行的,至于用户在访问上表现的差异性,则是通过权限控制,如用户可访问FTP服务,是因为用户具有登录FTP服务的权限,用户可通过SSH方式登录,则是用户具有SSH方式登录服务器的权限。此外,对于FTP服务的理解也发生些许变化,首先FTP登录后并不能像普通意义上登录服务器那样,可启动某服务或执行脚本等操作,这需回到FTP本质上理解,FTP是文件传输协议,所以登录后能进行的仅是ftp命令提供的与文件传输相关的操作。
理解上转变后,下面我们直接在Linux系统中root根目录创建文件,并通过window cmd连接ftp服务查看最新文件列表:
模拟实际应用中,业务服务通过ftp客户端连接服务器FTP服务,并使用同一个账号登录,我们假定账号为ftp,且文件资源统一放置于目录/home/ftp 中。
这个过程中容易踩坑,此处仅记录多次实践后得出的正确操作过程与相关配置。
步骤一:创建用户ftp,并指定用户更目录及初始密码
# 添加用户ftp并指定用户登录后路径为/home/ftp
-> useradd -d /home/ftp ftp
# 为用户设置初始密码
-> passwd ftp
步骤二:为使用户可通过登陆FTP服务,需配置将用户加入FTP用户列表配置文件
1)、/etc/vsftpd/vsftpd.conf 中检查并修改用户管理相关配置
userlist_enable=YES|NO #是否启用FTP用户管理
userlist_deny=YES|NO #userlist_enable为YES时,此配置生效,YES:用户列表不能登陆;NO用户列表可以登录,默认YES
userlist_file=/etc/vsftpd/user_list #用户列表文件,根据前面两配置项值决定是允许还是不允许登录,值即默认值
# 说明:样例配置文件中,可能并没有这三项,可编辑加上。此实践中,我们让用户列表文件中列出的用户可以登录FTP服务,配置值为:
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
2)、将ftp添加进user_list文件(此处即文件/etc/vsftpd/user_list)
3)、检查ftpusers文件中(PAM使用的不允许用户通过FTP方式登录的用户列表),不包含ftp用户
4)、重启服务(service vsftpd restart),打开windows cmd连接测试,结果如图:
错误提示:500 OOPS:vsftpd:refusing to run with writable root inside chroot()。
此错误看起来是因为ftp用户对其主目录(/home/ftp)具有写权限导致的,将主目录可写权限去掉确实能访问,也能执行ls 列出文件列表命令,但实践发现,此时ftp用户无法在自己目录手动进行写相关操作(如创建文件、删除文件等)。
也有的文章说在ftp配置文件中添加配置项 allow_writeable_chroot=YES,经过实践,此方法也不可行。另外,也尝试修改以下3个配置项:
chroot_list_enable=YES|NO #是否允许chroot()到用户home目录
chroot_list_file=/etc/vsftpd/chroot_list #启用chroot()时,可chroot()的用户列表,默认此值
chroot_local_user=YES|NO #用户列表“取反”操作,如果设置为YES,list文件中用户变成不可chroot()的用户列表
并创建chroot_list文件,并向文件中添加ftp用户名,再次连接也无果。经过反复尝试,最终也是发现,只需开启匿名上传及文件创建即可,相关配置(注意第一个配置项):
anon_upload_enable=YES #允许匿名用户上传文件,仅write_enable=YES时有用。此外,也是FTP用户需创建文件路径的开关(这点容易被忽略)
anon_mkdir_write_enable=YES #允许匿名FTP用户创建路径
修改后再次重启服务,再次测试登录,依旧提示相同错误。
此错误暂时未找到解决方法(且此错误只发生在帐号ftp上,其他用户能正常连接并进行文件上传下载操作),后面处理,为了上传文件,可临时将用户home目录权限改为不可写,待FTP登录成功后再改为可写,以便FTP客户端上传文件。
四、传输文件
此部分简要介绍ftp客户端部分常用命令。
1、文件查看:ls、dir
2、文件下载:recv
使用:recev 文件名 [保存路径]
3、文件上传:put
使用:put 本地文件路径 服务器上保存路径
4、路径创建:mkdir
使用:mkdir 相对路径
可见,部分命令与linux系统中是一致的。