Ubuntu下搭建多用户多权限FTP

Description

vsftp—VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件。关于这个软件的详细信息大家可以自行百度。

切换root用户模式 (已在root模式下的请忽略)

1
sudo -i

然后提示你输入当前用户密码,输入密码后回车后如果密码正确控制台就变成root@***:/#了。

更新软件源且安装vsftp

1
2
sudo apt-get update
apt-get install vsftpd

创建工作目录

为了操作方便管理,我们给FTP创建自定义FTP目录和用户组,创建FTP目录 /home/ftp 当然你也可以创建到其它目录

1
mkdir /home/ftp

创建FTP用户组 ftp-g 这个你们也可以用其它组名

1
groupadd ftp-g

设置FTP目录读写权限(注:用户登陆的根目录如果权限设置的太大会导致无法登陆,根目录下的子目录可以给很大的权限,一般服务器都是采用755权限

1
chmod 755 /home/ftp

设置文件夹归属 root 以及 我们新建的 FTP用户组

1
chown root:ftp-g /home/ftp

到此,ftp的根目录就已经创建完成了

设置FTP用户目录以及添加FTP用户

为用户ftp_pub 创建目录 pub并设置权限

1
2
mkdir /home/ftp/pub
chmod 755 /home/ftp/pub

添加用户 ftp_pub并设置归属用户组为 ftp-g 以及设置缺省目录(FTP登陆目录) -s /sbin/nologin 禁止用户登陆控制台

1
useradd -g ftp-g -d /home/ftp/pub -s /sbin/nologin ftp_pub

给新用户ftp_pub设置密码(无密码不能登陆,然后按照提示输入两遍密码,比如我们设置为 123456798

1
passwd ftp_pub

更改目录归属,ftp下新建的这个目录只有ftp_pub才能够被更改

1
chown ftp_pub:ftp-g /home/ftp/pub

增加上传目录不可删除功能,在配置文件中增加user_config_dir=/etc/vsftpd_user_ctrl,同时在vsftpd_user_ctrl文件夹中增加对应的账户名字的文件,目的就是对指定的账户进行操作限制

增加的指令,cmds_denied=DELE,就是防止删除操作,同样的指令操作还有很多,可以到网络上面自行百度。到此,就实现了普通用户的操作限制,比如限制指定用户删除操作

给FTP开放外网端口(默认:tcp端口 21)

1
ufw allow 21/tcp

启动FTP服务

1
/etc/init.d/vsftpd start

总结

普通用户还是比较好搭建服务器,关键是管理员权限不好控制,看来是需要更加复杂的控制才行,需要通过单独的文件进行控制,比如用vsftp的用户控制或者用用户的权限控制,比如登陆以后给与某个用户超级,最后还是解决了超级管理员的问题,在星期四晚上的最后一刻,还是解决了超级管理员的问题,就是设置root可以登录,同时登陆root账户,那么所有的文件权限也都有了

下面是两个比较成熟的vsftp搭建教程:
https://blog.51cto.com/meiling/2071122

安装完以后会出现当前用户无法访问当前目录的问题,下面的教程会解决这个问题,会提示

1
500 OOPS: vsftpd: refusing to run with writable root inside chroot ()

原因是:

从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。

要修复这个错误,可以用命令chmod a-w /home/user去除用户主目录的写权限,注意把目录替换成你自己的。或者你可以在vsftpd的配置文件中增加下列两项中的一项:

1
2
3
4
5
6
#方案一
$ chmod a-w /vaf/ftp

#方案二
$ vim /etc/vsftpd.conf add the following
allow_writeable_chroot=YES

解决上述问题后,可能还会出现ftp客服端乱码等问题,可以通过设置客户端强制为utf-8字符格式,然后打开vsftpd.conf里面的utf-8模式,客户端检测到utf-8模式以后就会自动采用该模式上传文件,可以解决中文乱码的问题。

注意(FTP上传下载速度问题)

考虑过我们ftp的实际速度的问题吗,为何我们不能达到100M以上的速度?

先讲一点网络速率和传输速度的问题呵呵,我先是一个CCNP,然后才是一个DBA

注意下面B-字节 b-位的区别 1B=8b,不理解的回去看计算机基础知识

1000M网络速度是指bit位的速度,理论网络传输速度上限是1000/8=128MB/S

可是这个速度是在物理层的理论值,呵呵我们要用的TCP/IP协议和FTP协议中间还有好多个协议层.
基于种种原因的考虑,每个协议层都要在数据包头封装一些东西,因此我们一般只能实现用10个字节来描述一个有效的数据

换算成传输速率就是1000/10=100MB/S

另外要考虑的一个事情是,你的应用是否是单向传输的业务,如果是的话,你最多只能实现100MB/S的速率,如果是双向对称传输的协议话呵呵,你的最大传输速率是100/2=50MB/S

这样的业务典型的就是双向的视频会议.

回到FTP传输的问题来,大家要问,FTP不是单方向传输的吗?为何我们经常只能实现30-40MB/S,最多不过60-70MB/S的速度,不对FTP是一个典型的不对称的传输协议,在我们下载的时候,可能下载流量占用了大部分的带宽,但是大家要注意到,FTP必须在服务器和客户端之间传输一些控制命令和交换一些数据请求包什么的,典型的上行流量大概能占用到整个传输10%,呵呵我们上面提到的100M/S的理论上限一下少了10M/S变成90M/S.

接着你又问了不还有90M/S吗?剩下那些速度都在那里产生瓶颈了,呵呵,让我慢慢道来:

  1. 你的客户端和服务器最少都可能在同一台千兆交换机上吧,对不起,交换机会对数据传输产生一定的时延,因为千兆交换机一定是基于存储转发的,这个时延根据厂商算法和芯片的不同,可以造成传输速率下降,下降的幅度在2-10%之间变动,按照平均5%来计算吧,现在是多少了,90*0.95=85.5MB/S
  2. 服务器的千兆网卡和客户机的千兆网卡是接在那里的,你一定会说是在主板上集成的,没错,可是你知道它们到底接在那里吗?呵呵告诉你如果是接在主板上的一定是在南桥总线上的,典型的南桥总线是2GB/S(INTEL ICH8),没完这南桥总线不是千兆网卡独享的,是N多设备共享的,网卡,IDE硬盘接口/SATA接口,声卡等等一大堆东西,一般来说,网卡能达到理论带宽的90%就很不错了,呵呵再算一下,85.5*0.9=76.95MB/S
  3. 没完,FTP协议使用网络传输的数据从那里来?呵呵从硬盘来,到那里去?到硬盘去.这一来一去有个问题,硬盘并非能全速达到理论传输上限,哪怕你组成一个很快的RAID 0,硬盘传输数据都会有一点延迟,这个延迟来自于硬盘的传输原理,FTP一个大文件要在磁盘中移动磁头,找到这个数据块,然后读到内存中,有个5-10%的延迟不为过吧,写入同样,要找到空闲的块,同样可能有5-10%的延迟,取小一点,两边都按5%来计算,呵呵10%的延迟呀,现在你一定冒汗了,降到多少了?76.95*0.9=69.255MB/S
  4. 数据仅仅是到了内存,还没传输到网卡上,这时后,CPU肯定要处理,DMA通道也要处理,内存虽然读得飞快,网卡处理芯片要处理数据,这一大堆玩意虽然都很快,可是同样有延迟,考虑到这些因素,降个5%是很正常的,实际上,基于内存的网络传输速率测试不比硬盘快多少,这时的速率是69.255*0.95=65.79MB/S
    这个速率我想大多数使用过千兆网络FTP传输的人,都见过这样的速度吧,一般来说千兆网络FTP传输很难超过80M/S
  5. 操作系统,FTP SERVER 和FTP CLINET的软件处理能力的问题,这个是一个更复杂的问题,但是可以肯定的是不同的平台和版本,性能差异可能巨大,我用过N多的FTP SERVER和FTP CLINET,访问同一个内部服务器的时候,性能差异巨大,相同的环境下,例如IIS 6的SERVER 配合WINDOWS FTP命令能到40-50MB/S,换一个LINUX下的LFTP客户端就能达到60-65MB/S的性能.

这上面还有一个因素,如果遇到交换机繁忙,或者交换机交换容量不够的情况下,上面许多因素再打大一点折扣,例如磁盘延迟很大,上面的数字还要大大打个折扣.不幸的是我们的许多系统大部分的部件,经常处于繁忙的阶段,上面的数字最多只能实现80%的效能,呵呵所以大多数的千兆FTP传输在30-40MB/S间波动是很正常的.