VSFTPD搭建过程记录

〇、题外话

        对于萌新来说,寻找解决问题的道路,幸运时可能极为简单,不幸时可能就会比较困难。难而对于一个满脑袋过时知识的老萌新来说,寻找解决问题的道路,常常是从陈旧的经验起步,在网络信息爆炸的当下,往往不可能命中最为简便的道路,从而整个过程显得尤为艰难……

        问题的起因是打算打自己WIN10的主机,从部署CentOS的云端服务器上往回倒腾点儿数据文件,本来有个openssh的捷径。然而,在满脑子telnet、ftp、putty的老玩意儿下,老萌新选择了一条泛着古董包浆光芒的曲折之路。使用putty,构建到云服务器的SSH连接,在云服务器上搭建FTP服务器,然后使用CMD,以FTP方式去get文件(实际还失败了),又转向使用资源管理器达成目的……

        其实,这事真要简单起来,还真是简单得不得了——客户端WIN10自带,OpenSSH;服务端CentOS自带,SSHD:

        1. WIN10中的OpenSSH客户端

        在WIN10的设置中,选择应用和功能的“可选功能”,

         查看是否安装了OpenSSH 客户端,没有就添加功能即可。

         然后,在CMD控制台中,可以直接使用“SSH [用户名]@[云端服务器IP地址]”的方式来进行远程登陆和操作,压根儿不用putty。

         另外,基于OpenSSH提供的SCP,在CMD完全可以拷贝文件回来,也不用FTP什么的,只是目录得自己记熟一点,实际老萌新年龄大记性差,是开了两个CMD,一个登进去看到了目录,一个直接SCP拖文件。

        命令格式嘛,“SCP  [用户名]@[云端IP地址]云端绝对路径  本地路径”,除了多了个“S”,多了点奇怪的标识主机的字符串以外,和“cp”命令基本一样。

         所以说,每次倒腾点事总能跑偏,和“驴唇不对马嘴的DIY之旅”有得一比,且听下面细细分解:

一、参考环境

        玩了多少年Windows,近来随着大数据、云计算和人工智能等领域的开源世界越来越壮大,也被裹挟到Linux的世界来,捡起多少年都学得有一搭没一搭的Unix/Linux来。这天搭了一个应用,整出点数据,却被如何拉回本机来这点事给难住了。不想装一堆乱七八糟的工具,只好动手架一个FTP服务器,只当是熟悉Linux系统的操作了。

        环境如前所述,一台本地WIN10,一台腾讯云端CentOS 7.6,后期因为一系列搞不定的问题,不得已又加入一台华为云的CentOS 7.2。本地WIN10使用WIFI接入一台华三AP,华三AP基于账户名密码方式接入联通宽带路由,联通宽带路由被我装在墙中弱电盒里,弱电盒的门被丫头的钢琴死死顶着。

        所实话关于VSFTPD的安装指南,网上相关文章不少,但少有几篇精品,忒难找了。大多数的指南,都不会把自己安装的环境说得多清楚;而恰恰这个鬼东西,能不能搭得通,还就和环境有大大的相关性。所以,上一段尽量把环境交代清楚,一方面是不想误导他人,另一方面也是请大伙为后面最终没有在CMD里搞定做个见证——不是不想改配置,实在是不想搬钢琴……

二、安装与测试

        在CentOS里面安装vsftpd其实也挺方便的,就一行命令而已,yum install vsftpd,想省事加个-y:

         装好了可以使用systemctl start vsftpd启动一下,或者systemctl restart vsftp。

        然后使用systemctl status vsftpd查看一下daemon的状态,是否在后台处于激活状态:

        这里可以看到,当前yum install到的vsftpd版本为3.0.2。

        如果常用,可以chkconfig vsftpd on,设置为开机启动。

        保险起见,用netstat看看vsftpd是否打开了21端口,如果打开了,至少说明这货算是正常开始工作了:

         然后从华为这边的云端服务器尝试匿名登陆一下:

         没有问题。当然这里有三个需要关注的点:

        1.不是从WIN10终端上的CMD用ftp登陆的;那只会有“远程主机关闭连接”的错误;

        2.采用匿名和空密码(直接回车)登陆,因为vsftpd刚装好,啥都没整呢,现在让匿名就不错了;

        3.下一步还进行不了,比如如果这个时候ls一下,客户端会进入passive模式,然后就卡在那里了,必须Ctrl+C出来

         对于和我一样的新老萌新而言,上面不是废话!上面不是废话!上面不是废话!重要的事先说上三遍。因为对于vsftpd这样配置过程谜之散乱的货色来说,每做一步都要确认一步的效果是必要的。否则等摔倒的时候,可能完全记不起来真正的绊儿是在前几步踩到的。

三、禁用匿名访问

        现在的FTP服务器是允许匿名访问的,这从网络安全的角度来说本站当前是相当的风骚,完全属于招蜂引蝶的一把好手,全时求撩。搭完匿名访问的部分以后,出去办事一天没有打开服务器。再次登陆的时候被服务器弹出的信息吓着了,35684次失败的登录:

         嗯……浪了一天就被盯上了,没事爆破我口令做啥,一台啥都没有的服务器,都不够浪费你电费的,更何况写完这篇文章这服务器我就释放了,:P。查一下威胁情报,看起来这还是一个标准的有组织恶意IP。得,您先继续忙着吧,这点带宽我还能施舍得起。

        不过如果真想搭一个有用的服务器的话,匿名登陆还确实是要关掉的。打开“/etc/vsftpd”下的vsftpd.conf文件,找到“anonymous=YES”这一行,改成NO就可以了。

         然后需要重新启动一下vsftpd:

         如果没有报错,应该就可以了。如果报错……总之报错信息并不是特别友好,懒得去看。所以对vsftpd.conf这个文件,后面我们还会改动很多配置,并且这些配置的改动还可能会在不同的系统和网络配置环境下产生不同的效果,所以我建议,还是一次解决一个问题,一点一点步进式修改心里更有底一点。这样的话,一旦报错,仔细检查一下刚改动的配置,是否(一般都是)存在拼写错误就可以了。

        在我们华为的云服务器上登录一下,anonymous登录显然已经被关掉了,显示“530 Login incorrect”。

 四、设置登录用户

        关掉匿名登录以后,我们还能如何登陆FTP呢?这里需要先插入一点题外话,已避免后面出现问题的时候,因为不知其所以然而造成麻爪儿的情况。当然,因为老萌新一开始也不知道,掉了一路坑,所以来吃狗,一同学习一下。

       1.  PAM认证

        先注明引用一段来自其他博客的介绍。毕竟这不是本记录的重点。

        PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。

       简单点说,就是Linux中服务的认证依赖于PAM机制。vsftpd是以daemon的形式存在于系统中的,所以也采取了PAM机制来进行验证。

        2.PAM验证配置

        目前,在Linux系统中,对应某服务的验证配置存储于"/etc/pam.d"目录下,以服务名为名称的文件中。打开这个文件如下:

         这里面有两行是比较重要的,如果不弄清楚,很可能以后就只能和“530 Login incorrect”错误为伍了。

        (1)不被允许的用户

        auth required pam_listfile.so这一行,后面有一个"sense = deny file = /etc /vsftpd /ftpusers" 的指示。基本能够猜出来,也就是ftpusers列表中的用户都是不被允许登录ftp服务的。比如说,在这个文件里面,可以看到root是不被允许访问ftp的。试一把root如下:

         删掉root是不是就可以用root登录呢?比如把ftpusers改成如下:

        

         照样不行。因为vsftpd还使用了另外一个列表来设置禁止访问的用户。这个列表在ftpusers文件的同目录下,名字是user_list:        

         这个文件的头部说明了user_list和ftpuser之间的联系。也说明vsftpd默认采取了userlist_deny = YES的配置,并且也提醒了,即使取消这个设置,pam.d下的那个vsftpd文件也设置了禁止,禁止列表文件就是ftpusers。所以,这两个文件都是要处理的。比如上面,我们都删掉了root用户。然后再试一下:        

         看,果然就可以了。不过这样的危险性更大,还是不要这么玩吧。

        (2)配置允许访问的用户

        按照上面的方法,默认情况下,user_list和ftplist都默认被用于禁止用户访问。但是我们的vsftpd.conf文件最后是这样的:        

         这里明明白白写着,userlist_enable=YES。也就是说,user_list应该是被当白名单用的啊?实际上,这里userlist_enable和userlist_deny都是显示的,并且采用的是“有罪推定”模式,总之能不让你用就不让你用。如果要详细了解,可以参考这篇博客

        也就是说,其实我们只需要明确禁用掉userlist_deny,user_list就是白名单,否则它就是和黑名单;当然,如果我们把usetlist_enable和userlist_deny都禁用,user_list名单就失效了。

        试一试在ftpusers中去掉boot,增加userlist_deny=NO:

         再从华为云这边以root方式登录,是完全可以的。

五、创建专用用户

        所以,以默认的配置,网上大多数的教程,都是建议创建一个新的专用用户以提供访问渠道。此时默认的,userlist_deny=YES,userlist_enable=YES,ftpusers中列表禁用。直接的效果,就是对一个新建的用户来说,只要系统的权限够用,是不在vsftpd的禁止访问之列的。

        1. 新建用户

        创建一个名为ftper的用户,给改用户分配在ftp组,初始登录目录为/home/ftper,初始可用的shell为/sbin/nologin(注意这个shell环境,可能会造成后面登录时的530错误):        

         2. 设置用户权限

        设置/home/ftper目录的所有者为ftper,ftper需要具有这个目录的读写执行权限。

        3. 设置密码

        设置ftper的登录密码:

        两遍无误设置成功。

        通过查看/etc/passwd文件,我们可以在末端发现这么一行:

        其中的50,代表ftper用户属于ftp这个群组,这个可以通过查看/etc/group文件看到:

         然而直接登录并不能成功:

        4. 加入初始shell的位置到合法shell列表

         登录失败的原因,在于类似vsftpd的服务在运行时,回去检查属于该用户的shell是否在系统允许的合法shell列表中,而我们在创建ftper的时候指定的/sbin/nologin这个shell,是不在系统的合法shell列表里面的,所以,需要编辑/etc/shells文件,在其最后加入这个shell。

         重启vsftpd后,再行登录试一下,就可以了。

        至于为什么要这么做,可以参考以下两篇博客:《shell与/etc/shells功能》《对/sbin/nologin的理解(转)》

        总之就是,这是Linux中为了让用户使用服务端的一些服务,又不愿意用户具有登录服务器可能的一种通用做法。

六、启用被动模式

        以上配置成功以后,通过华为云登录这个在腾讯云上的ftp服务器,基本可以通过鉴权,并且一些简单的命令(如pwd)也可以执行了。然而使用ls指令时,客户端会报告进入被动模式,然后就陷入漫长的等待。如果不希望等到超时,那就必须使用Ctrl+C退出了:

        关于FTP主动模式和被动模式的讨论,并非本记录的主要内容,有兴趣的话可以参考《FTP协议主动模式和被动两种模式详解》。这里我们就说明一个问题,如果是主动模式,则服务器和客户端两边都需要开高端口,这对于防火墙配置来说,尤其是对大多数蹲在NAT后面的家用终端设备来说,简直是个灾难。

        云端的客户端使用主动模式,也基本会遇到Illegal port的问题,网上众说纷纭,咱这边也没有找到很好的解法,哪怕是把两边的防火墙都完全放开也照样报错:

        所以,我们还是主要讨论如何建立被动模式下的ftp服务,这样要简单很多。在客户端陷入被动连接时,使用netstat查看一下vsftpd相关的端口。可以看到建立的连接不止21端口上的那一个。这是ftp主动模式的特点,服务器端会开放高端口进行监听,等待客户端的数据连接。  

         然而,这些端口多是服务端动态选择,对于防火墙来说,仍然是个麻烦。因此,需要在vsftpd.conf文件中进行进一步限定:

         在末尾加入pasv_**的相关描述,表示启动被动模式,并且将端口范围限定在30000-30100之间。同时进入腾讯云的防火墙配置管理,增加这么对应的一条规则:        

             重启vsftpd服务,然后从华为云端再登录试一下,基本可以顺利进行各种操作了:    

 七、禁用目录漫游

        到这里,ftp服务器基本有了一个可用的状态,然而我们还疏漏了一点,即上图中,我们登录进入到服务器后,还进行了一步转移目录的操作,成功的ls了ftper上层home用户的内容。从安全的角度看,这显然时不被允许的。所以我们还需要禁止用户转换目录,这可以通过进一步配置vsftpd.conf来实现。       

         事实上,这两个选项在文件里存在,只不过是被注释掉了,找到,打开,然后在/etc/vsftpd目录下,使用vim chroot_list文件(默认情况下这个文件不存在),将ftper加入到文件的第一行就行了。

        如果这是就兴奋地去重启vsftpd然后登录一试的话,等待你的是vsftpd的一个相当幽默的警告。OOPS :)。大意就是chroot限制了用户的内部写权限,导致用户鉴权失败。        

         回到vsftpd.conf,在末尾添加一句允许写chroot的配置如下:

         重启vsftpd,至此一个被动模式的ftp服务器基本就算配置好了。 

         可以看到这是无论如何cd..,vsftpd都会说你成功了,因为你只有这一个目录而已,已经到顶了。但是如果你想cd /home的话,不好意思,目录跳转是被拒绝的。

        重要的PS:以上两个云服务器firewalld都是默认关闭的,所以并不需要使用iptable什么的来设置,只需要把云服务控制台上的防火墙设置弄好就行。但如果不是这样的环境,请上来先关闭防火墙,全部配好以后,再对应性的打开并设置iptable。

八、Windows下的访问

        虽然在云之间使用ftp客户端访问vsftpd的配置是成功的。但是在windows上,使用cmd终端,ftp连接仍然会失败。

         网上教程的说法多指这是主被动模式的原因,以及NAT使然(因为家里的windows蹲在宽带路由器的后面。但家用的路由设置能力有限,除了勾选一个NAT FTP模式允许外,基本没有别的什么设置方法。所以当我把所有的防火墙都打开,主机防护软件禁用,NAT设置允许后,仍然是这么一个德行……就彻底不知道解法了。

        但是在云端的客户端能够访问服务端的情况下,在Windows终端上,是可以通过文件浏览器和ie来访问vsftpd的。比如:        

         我特意放了两个文件在/home/ftper目录下面,以免这玩意看起来像个白页面:P

        得益于我们在Windows下有了浏览器这样一种成功的方法,所以可以对比一下CMD+ftp及浏览器访问的不同,以探讨一下CMD+ftp失败的原因:

        1.CMD+FTP

        使用CMD+FTP终端,wireshark截获的通信过程是这样的:

        2.IEXPLORE

        使用IE,截获的通信过程是这样的:

         两下一对比,显然问题出在“OPTS UTF8 ON”这么一个从CMD+FTP发往服务器的命令上,服务器似乎并不认识,于是直接无视了,然后开始傻傻等……。而客户端因为没有等到标准的ALWAYS UTF8应答,于是不停发、不停发……

        因为在这一阶段,服务器和客户端仍然实在21端口上进行交互,并且和前面握手啊什么的操作连对端端口都没有变过,所以可以肯定的是和鉴权啊、防火墙啊什么主被动模式啊没有啥关系,纯粹就是服务器和客户端没对上暗号……这个就很尴尬了。

        完事我查了一下,貌似vsftpd是支持OPTS UTF8 ON命令的,那这个……无语无解,有大神知道烦请指教一二,不甚感激!

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值