FTP服务器

FTP文件共享基于TCP/IP协议,目前绝大多数系统都会有支持FTP的工具存在,FTP是一种通用性比较强的网络文件共享方式。

提示:在配置FTP之前最好先禁用SELinux、防火墙,或者为它们添加合适的规则,否则会导致失败。另一个小技巧是在安装服务软件之前,先用命令yum update -y更新系统,以减少BUG出现的可能。

FTP服务概述

FTP方便地解决了文件的传输问题,从而让人们可以方便地从计算机网络中获得资源。FTP已经成为计算机网络上文件共享的一个标准。FTP服务器中的文件按目录结构进行组织,用户通过网络与服务器建立连接。FTP是仅基于TCP的服务,不支持UDP。与众不同的是FTP使用两个端口,一个数据端口和一个命令端口,也可以叫做控制端口。通常来说这两个端口是21(命令端口)和20(数据端口)。由于FTP工作方式的不同,数据端口并不总是20,分为主动FTP和被动FTP

1.主动FTP

主动方式的FTP客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口21,然后客户端开始监听端口N+1,发送FTP命令“port N+1”到FTP服务器。接着服务器会从自己的数据端口(20)连接到客户端指定的数据端口(N+1)。主动模式下,服务器端开启的是20和21端口,客户端开启的是1024以上的端口。

2.被动FTP

为了解决服务器发起到客户的连接问题采取了被动方式,或叫做PASV,当客户端通知服务器处于被动模式时才启用。在被动方式FTP中,命令连接和数据连接都由客户端发起,当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N>1024和N+1)。第1个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连接它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P>1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器端口P的连接用来传送数据,此时服务器的数据端口不再是20端口。此时服务端开启的是21命令端口和大于1024的数据连接端口,客户端开启的是大于1024的两个端口。

主动模式是从服务端向客户端发起连接;而被动模式是客户端向服务端发起连接。两者的共同点是都使用21端口进行用户验证及管理,差别在于传送数据的方式不同。

vsftp的安装与配置

在Linux系统下,vsftp是一款应用比较广泛的FTP软件,其特点是小巧轻快,安全易用。目前在开源操作系统中常用的FTP软件除vsftp外,主要有个proftpdpurefrpdwu-ftpd等,各个FTP软件并无优劣之分,读者可以选择熟悉的FTP软件。

1.安装vsfptd

安装此FTP软件可以采用rpm包或源码的方式,rpm包可以在系统安装盘中找到。安装过程如【示例1-1】所示。

【示例1-1】

#使用yum工具安装vsftp软件
[root@node1 ~]# yum install -y vsftpd
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.bit.edu.cn
 * extras: mirror.bit.edu.cn
 * updates: mirror.bit.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package vsftpd.x86_64 0:3.0.2-25.el7 will be installed
--> Finished Dependency Resolution
......
#部分结果省略
[root@node1 ~]# rpm -qa | grep vsftpd
vsftpd-3.0.2-25.el7.x86_64


#源码安装过程
#解压源码包
......
#省略

以上两种安装方法都是可行的,读者可自行选择如何安装。在本例中将采用以yum工具安装的vsftpd作为范例。

2.匿名FTP设置

【示例1-2】所示的是允许匿名用户访问并上传文件,配置文件路径一般为/etc/vsftpd.conf,如果是使用rpm包安装,配置文件应该在/etc/vsftpd/vsftpd.conf。

【示例1-2】

#将默认目录赋予用户ftp权限以便可以上传文件
[root@node1 /]# chown -R ftp.users /var/ftp/pub/
#取消配置文件中的注释并显示有效行
[root@node1 /]# grep -v ^# /etc/vsftpd/vsftpd.conf 
#允许匿名用户登录和上传
anonymous_enable=YES
anon_upload_enable=YES
local_enable=YES
#允许写
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
#允许在监听
listen=NO
#不允许IPv6上的监听
listen_ipv6=NO

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

3.启动FTP服务

【示例1-3】

#启动并设置vsftpd开机自启动
[root@node1 /]# systemctl start vsftpd
[root@node1 /]# systemctl enable vsftpd
#检查是否启动成功,默认配置文件位于/etc/vsftpd/vsftpd.conf
[root@node1 /]# ps -ef | grep vsftp
root       1945      1  0 15:46 ?        00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root       1950   1817  0 15:46 pts/0    00:00:00 grep --color=auto vsftp

4.设置防火墙

#第一步,关闭selinux,将SELINUX设置为disabled后reboot重启服务器
[root@node1 ~]# grep -v ^# /etc/selinux/config 
SELINUX=disabled
SELINUXTYPE=targeted 
[root@node1 ~]# reboot
[root@node1 ~]# getenforce 
Disabled
#第二步,关闭防火墙并禁止开机自启动
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

5.匿名用户登录测试

【示例1-4】

#使用node2登录ftp
[root@node2 ~]# ftp 192.168.1.128 21
Connected to 192.168.1.128 (192.168.1.128).
220 (vsFTPd 3.0.2)
#输入匿名用户名
Name (192.168.1.128:root): anonymous
331 Please specify the password.
#密码为空
Password:
#登录成功
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
#切换目录
ftp> cd pub
250 Directory successfully changed.
#上传文件测试
ftp> put
(local-file) a.test
(remote-file) a.test
local: a.test remote: a.test
227 Entering Passive Mode (192,168,1,128,120,140).
150 Ok to send data.
226 Transfer complete.
#上传文件成功后退出
ftp> quit
221 Goodbye.
#查看上传后的文件信息,文件属于ftp用户
[root@node1 ~]# ll /var/ftp/pub/a.test 
-rw------- 1 ftp ftp 0 Apr 23 16:24 /var/ftp/pub/a.test

6.实名FTP设置

除配置匿名FTP服务外,vsftpd还可以配置实名FTP服务器,以便实现更精确的权限控制。实名需要的用户认证信息位于/etc/vsftpd/目录下,vsftpd.conf也位于此目录,用户启动时可以单独指定其他的配置文件,本示例FTP认证采用虚拟用户认证。

【示例1-5】

#编辑配置文件/etc/vsftpd/vsfptd.conf,配置如下
[root@node1 ~]# grep -v ^# /etc/vsftpd/vsftpd.conf 
#以下为主要设置项的含义和设置

listen=YES
# 绑定本机IP
listen_address=192.168.1.128
# 不监听ipv6地址
listen_ipv6=NO
# 禁止匿名用户登录
anonymous_enable=NO
anon_upload_enable=YES
anon_world_readable_only=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
# 不允许FTP用户离开自己主目录
chroot_list_enable=NO
#为虚拟用户添加写权限
allow_writeable_chroot=YES
# 虚拟用户列表,每行一个用户名
chroot_list_file=/etc/vsftpd.chroot_list
# 允许本地用户访问,默认为YES
local_enable=YES
# 允许写入
write_enable=YES
# 上传后的文件默认的权限掩码
local_umask=022
# 禁止本地用户离开自己的FTP主目录
chroot_local_user=YES
# 权限验证需要的加密文件
pam_service_name=vsftpd.vu
# 开启虚拟用户功能
guest_enable=YES
# 虚拟用户的宿主目录
guest_username=ftp
# 用户登陆后操作主目录和本地用户具有同样的权限
virtual_use_local_privs=YES
# 虚拟用户主目录设置文件
user_config_dir=/etc/vsftpd/vconf
# 其他设置
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
userlist_enable=YES
tcp_wrappers=YES

#编辑/etc/vsftpd.chroot_list,每行一个用户名
[root@node1 ~]# cat /etc/vsftpd.chroot_list
user1
user2
#增加用户并指定主目录
[root@node1 /]# mkdir -p /data/{user1,user2}
[root@node1 /]# chmod -R 775 /data/user1 /data/user2
#设置用户名密码数据库
[root@node1 /]# echo -e "user1\npass1\nuser2\npass2">/etc/vsftpd/vusers.list
[root@node1 /]# cd /etc/vsftpd
[root@node1 vsftpd]# db_load -T -t hash -f vusers.list vusers.db
[root@node1 vsftpd]# chmod 600 vusers.*
#指定认证方式
[root@node1 vsftpd]# echo -e "#%PAM-1.0\n\nauth    required    pam_userdb.so db=/etc/vsftpd/vusers\naccount required    pam_userdb.so db=/etc/vsftpd/vusers">/etc/pam.d/vsftpd.vu
[root@node1 vsftpd]# mkdir -p /etc/vsftpd/vconf       
[root@node1 vsftpd]# cd /etc/vsftpd/vconf/
[root@node1 vconf]# touch user1 user2
[root@node1 vconf]# ls
user1  user2
#编辑用户的用户名文件,指定主目录
[root@node1 vconf]# cat user1
local_root=/data/user1
[root@node1 vconf]# cat user2
local_root=/data/user2
#创建标识文件
[root@node1 vconf]# touch /data/user1/user1
[root@node1 vconf]# touch /data/user2/user2

[root@node2 ~]# ftp 192.168.1.128
Connected to 192.168.1.128 (192.168.1.128).
220 (vsFTPd 3.0.2)
#输入用户名和密码
Name (192.168.1.128:root): user1
331 Please specify the password.
密码为之前设置的pass1
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
#查看文件
ftp> ls
227 Entering Passive Mode (192,168,1,128,224,57).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Apr 23 11:10 user1
226 Directory send OK.
ftp> quit
221 Goodbye.
#user2上传文件测试
[root@node2 /]# ftp 192.168.1.128
Connected to 192.168.1.128 (192.168.1.128).
220 (vsFTPd 3.0.2)
Name (192.168.1.128:root): user2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,1,128,191,231).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Apr 23 11:14 user2
226 Directory send OK.
ftp> put
(local-file) /a.test
(remote-file) /a.test
local: /a.test remote: /a.test
227 Entering Passive Mode (192,168,1,128,47,147).
553 Could not create file.
ftp> quit
221 Goodbye.

vsftp虚拟用户无法上传文件,解决办法

1、打开/etc/vsftpd 目录中的vsftpd.conf文件,查找:guest_username=xxx,这里指的是vsftpd虚拟用户对应的实

际系统用户。

2、将该xxx用户的R权限赋予想要上传的目录:chown -R xxx.xxx /opt/vsftp/admin/

就可以上传了

[root@node1 user2]# chown -R ftp.ftp /data/user2/

图3.3.1 匿名用户

图3.3.2 user2登录ftp服务器

图3.3.3 测试user2的写权限

Login failed解决方法

500 OOPS: vsftpd: refusing to run with writable root inside chroot()
#Login failed解决方法
#在配置文件中加入以下权限
allow_writeable_chroot=YES

vsftp可以指定某些用户不能登录ftp服务器、支持SSL连接、限制用户上传速率等,更多配置可参考帮助文档。

3.3.3 proftp的安装与配置

略......

3.4 小结

本章介绍了NFS的原理及其配置过程。NFS主要用于需要数据一致性的场合,比如Apache服务可能需要共同的存储服务,而前端的Apache接入则可能由多台服务器,通过NFS用户可以将一份数据挂载到多台服务器上,这时客户端看到的数据将是一致的,如需修改则只需修改一份数据即可。

Samba常用于Linux和Windows中的文件共享,本章介绍了Samba的原理机器配置过程。通过Samba,开发者可以在Windows中方便地编辑Linux系统的文件,通过利用Windows中强大的编辑工具可以大大提高开发者的效率。

最后修改:2020 年 10 月 19 日 07 : 36 PM
如果觉得我的文章对你有用,请随意赞赏