目录

1、项目背景与需求

2、需求分析

3、方案设计

4、项目实施过程

5、ftp客户端工具配置

6、系统测试

7、系统日常管理

8、总结

1、项目背景与需求

    从2014年下半年以来,公司业务发展迅速,拿下的项目越来越多,公司吸纳了一批新同事全部划分到项目部。各个项目上涉及的标书文件、设计方案、施工方案、工程施工变更文件、竣工验收资料的管理与存档目前都是现场人员及项目经理整理后保存在个人电脑上,当其他同事需要查看此项目上的相关资料时只能联系资料的资料的保管人员才能得到相应的资料,这样公司对于资料的管理极其不易,而且资料存放在同事的个人电脑上,若遇电脑丢失,那补做项目的资料是极其困难的。因此,公司提出对项目上的资料要集中存放和管理,并对访问资料的同事要进行权限划分,哪些人可以修改,哪些人只能读取?而且对在外出差的同事来说也能方便的取得资料。

    在FTP服务的使用上有两种网络环境,一种是在单位内,另一种是因同事出差在外通过internet来访问服务,如果在工作时间有人使用ftp服务,大量的上传或下载资料,大量占用带宽,那必会影响到公司内其他同事的正常办公,所以为了能保证公司的正常办公,所以对在单位内与单位外使用FTP服务时的速度限制策略是不同的,在单位内可以不限制,在单位外那就要限制带宽了。

2、需求分析

    根据项目部提出的需求以及公司的现资源,决定在服务器上搭建一套基于DDNS的FTP系统,系统采用CentOS 6.4 x64,提供FTP服务的软件选择vsftpd。公司正好有一塔式服务器,配置为E5-2407,16GB内存,起初因上了一套基于windows的资源整合系统,系统为windows  server 2008 R2,此资源整合系统资源占用不大,所以计算在此windows系统上安装vmware虚拟化软件,在虚拟化软件的基础上实现FTP服务的运用。在系统分区上,把FTP的数据目录单独分成一个分区。而FTP用户权限的划分计划是这样的,总经理、项目经理及资料制作的同事拥有可写的权限,其他同事只有下载的可读权限。针对单位内与单位外同事使用FTP服务时的速率限制问题,我们启用“tcp_wrappers”功能来实现。

3、方案设计

3.1、系统示意图

马年最后一博-根据项目需求实现ftp服务权限分配及分网段限速访问_第1张图片

注:单位内已升级为电信10M光纤网络,网络稳定,下载速度还算满意,上传带宽还能满意需求。

3.2、系统功能划分设计


序号 设备名称 功能描述 备注
1 无线路由器 实现NAT共享上网,利用路由器自带花生壳DDNS功能实现动态域名解析,并建立DMZ区,使服务器置于此区域
2 服务器 因资源管理系统需部署在windows系统上,所以安装vmware虚拟化软件把ftp服务部署在虚拟机上
3 ftp客户端 采用FlashFXP专业客户端工具实现文件的上传下载 支持正版

3.3、FTP数据目录及用户权限设计

  设计说明:起初设计是把数据目录的属组修改为“group-w”,但此组的用户在上传文件后文件的的属主与属组都是用户自己的,这样“group-w”的其他用户对上一个用户的文件就没有修改权限了,此种方案是不可行的。所以采用linux系统的facl特性来实现。

序号 组内用户 权限 备注
1
group-w qiaohq,zouh,yangy,qiuj 所属组拥有可写权限 /ftproot分区是一个独立的分区
2 group-r chenxf,luoxg,zhaocj,dengl 所属组拥有可读权限

4、项目实施过程

4.1、vsftpd软件搭建:

<系统环境>

[root@LCKJ-ftpserver ~]# cat /etc/issue
CentOS release 6.4 (Final)
Kernel \r on an \m

[root@LCKJ-ftpserver ~]# uname -r
2.6.32-358.el6.x86_64
[root@LCKJ-ftpserver ~]# ifconfig | grep Bcast:
          inet addr:192.168.138.221  Bcast:192.168.138.255  Mask:255.255.255.0
[root@LCKJ-ftpserver ~]# vim /etc/sysconfig/selinux   #关闭selinux
SELINUX=disabled

[root@LCKJ-ftpserver ~]# yum list all | grep vsftpd
vsftpd.x86_64                           2.2.2-13.el6_6.1                 updates
[root@LCKJ-ftpserver ~]# yum -y install vsftpd
[root@LCKJ-ftpserver vsftpd]# pwd
/etc/vsftpd
[root@LCKJ-ftpserver vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
[root@LCKJ-ftpserver vsftpd]# cp vsftpd.conf vsftpd.conf.back   #备份原始文件,养成一个好的习惯[root@LCKJ-ftpserver vsftpd]# grep -v "#" vsftpd.conf   #配置文件中保留以下指令
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
idle_session_timeout=600
data_connection_timeout=300
accept_timeout=60
max_clients=10
max_per_ip=3
pasv_enable=YES
pasv_min_port=3000
pasv_max_port=3050
ftpd_banner=Welcome to FTP service.
chroot_local_user=NO
local_root=/ftproot/mydata/projects
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
listen_address=192.168.138.221
listen_port=2121
pam_service_name=vsftpd
userlist_enable=YES
userlist_file=/etc/vsftpd/ftpusers
tcp_wrappers=YES

  有一些话要说,当“chroot_local_user=NO”,而“chroot_list_enable=YES”时,“/etc/vsftpd/chroot_list”文件中的用户名单是禁止切换到其他目录的;当“chroot_local_user=YES”,而“chroot_list_enable=YES”时,“/etc/vsftpd/chroot_list”文件中的用户名单是排除锁定主目录的用户名单。


<建立锁定用户主目录文件>

[root@LCKJ-ftpserver vsftpd]# vim /etc/vsftpd/chroot_list
qiuj
qiaohq
yangy
zouh
chenxf
luoxg
dengl
zhaocj


4.2、用户创建及数据目录准备(用facl来实现权限限制):

<组的创建>

[root@LCKJ-ftpserver vsftpd]# groupadd group-r
[root@LCKJ-ftpserver vsftpd]# groupadd group-w

<创建拥有可写权限的用户>

[root@LCKJ-ftpserver vsftpd]# useradd -s /sbin/nologin  -G group-w qiaohq  #此用户只是用来登陆ftp的,不需要登陆系统
[root@LCKJ-ftpserver vsftpd]# id qiaohq
uid=501(qiaohq) gid=503(qiaohq) 组=503(qiaohq),502(group-w)
[root@LCKJ-ftpserver vsftpd]# useradd -s /sbin/nologin  -G group-w zouh #不用“-M”选项取消家目录的创建
[root@LCKJ-ftpserver vsftpd]# useradd -s /sbin/nologin  -G group-w yangy
[root@LCKJ-ftpserver vsftpd]# useradd -s /sbin/nologin  -G group-w qiuj
[root@LCKJ-ftpserver vsftpd]#  passwd zouh
[root@LCKJ-ftpserver vsftpd]#  passwd yangy
[root@LCKJ-ftpserver vsftpd]#  passwd qiuj

<创建只有可读权限的用户>

[root@LCKJ-ftpserver vsftpd]# useradd -s /sbin/nologin  -G group-r chenxf
[root@LCKJ-ftpserver vsftpd]# useradd -s /sbin/nologin  -G group-r luoxg
[root@LCKJ-ftpserver vsftpd]# useradd -s /sbin/nologin  -G group-r zhaocj
[root@LCKJ-ftpserver vsftpd]# useradd -s /sbin/nologin  -G group-r dengl
[root@LCKJ-ftpserver vsftpd]#  passwd chenxf
[root@LCKJ-ftpserver vsftpd]#  passwd luoxg
[root@LCKJ-ftpserver vsftpd]#  passwd zhaocj
[root@LCKJ-ftpserver vsftpd]#  passwd dengl

<数据目录准备>

[root@LCKJ-ftpserver vsftpd]# mkdir -p /ftproot/mydata/projects
[root@LCKJ-ftpserver vsftpd]# ll -d /ftproot/mydata/projects/
drwxr-xr-x 2 root root 4096 2月  14 08:44 /ftproot/mydata/projects/ 
[root@LCKJ-ftpserver vsftpd]# setfacl -R -m g:group-w:rwx /ftproot/mydata/projects #设置group-w组对数据目录具有可读可写可执行权限
[root@LCKJ-ftpserver vsftpd]# getfacl /ftproot/mydata/projects
getfacl: Removing leading '/' from absolute path names
# file: ftproot/mydata/projects
# owner: root
# group: root
user::rwx
group::r-x
group:group-w:rwx   #有相应权限
mask::rwx
other::r-x   #非属主、属组的用户具有可读可执行的权限,即具有下载的权限,所以不需要对group-r赋予相应的权限了,只是为了方便管理用户而建立


4.3、区分网段实现速率限制:

前提:确保vsftpd.conf中有“tcp_wrappers=YES”

[root@LCKJ-ftpserver vsftpd]# vim /etc/hosts.allow
#加以下两行
vsftpd:192.168.138.*:setenv VSFTPD_LOAD_CONF /etc/vsftpd/local.class
vsftpd:ALL:setenv VSFTPD_LOAD_CONF /etc/vsftpd/internet.class

<建立控制内外网访问速率的文件>

[root@LCKJ-ftpserver vsftpd]# vim /etc/vsftpd/local.class
local_max_rate=0   #不限制从单位网络访问的速率
[root@LCKJ-ftpserver vsftpd]# vim /etc/vsftpd/internet.class
local_max_rate=300000  #限制从外网访问的速度为300kB/s

4.4、启动服务

[root@LCKJ-ftpserver ~]# service vsftpd start
[root@LCKJ-ftpserver vsftpd]# chkconfig vsftpd on
[root@LCKJ-ftpserver ~]# netstat -tnlp | grep 2121

4.5、防火墙配置

[root@LCKJ-ftpserver ~]# pwd
/root
[root@LCKJ-ftpserver ~]# vim iptables.sh
#!/bin/bash
modprobe ip_conntrack_ftp
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -Z
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT ACCEPT
###
/sbin/iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A INPUT -i eth+ -p icmp --icmp-type 8 -j ACCEPT
#deny DDOS
/sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 2 -j ACCEPT
/sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j REJECT --reject-with icmp-port-unreachable
###
/sbin/iptables -A INPUT -p TCP -i eth0 --dport 2121 -j ACCEPT
/sbin/iptables -A INPUT -p TCP -i eth0 --dport 3000:3050 -j ACCEPT

[root@LCKJ-ftpserver ~]# chmod +x iptables.sh
[root@LCKJ-ftpserver ~]# echo "./root/iptables.sh" >> /etc/rc.local

4.6、路由器配置

   因是宽带拨号上网,没有固定的IP地址,所以采用花生壳的动态域名解析功能(ddns路由器自带),把相应的端口开放即可。对电信的宽带也有一个坑要注意,因IPV4地址的缺乏,通过宽带拨号上网时路由器所获取到的IP地址有可能是一个私有地址,这样你就处于电信自己搭建的一个局域网内,这样ddns是解析不成功的。遇到这样的事就电话给电信让其开通相应的功能吧。

马年最后一博-根据项目需求实现ftp服务权限分配及分网段限速访问_第2张图片

5、ftp客户端工具配置

       因这套系统的使用场景是有在单位内访问和单位外访问,并对这两种场景的访问做了速率策略的控制,所以在配置ftp客户时把两种场景都配置好,这样便于在不同场景时访问方式的切换。

    打开FlashXP点击站点-->站点管理器-->新建站点

内网访问配置:

马年最后一博-根据项目需求实现ftp服务权限分配及分网段限速访问_第3张图片

马年最后一博-根据项目需求实现ftp服务权限分配及分网段限速访问_第4张图片

因linux系统采用utf8字符编码,所以flashxp也设置此种字符编码,如下图:

马年最后一博-根据项目需求实现ftp服务权限分配及分网段限速访问_第5张图片

外网访问配置中只是把主机ip修改成动态域名的域名地址即可,如下图:

马年最后一博-根据项目需求实现ftp服务权限分配及分网段限速访问_第6张图片


6、系统测试

6.1、内网环境测试

就以上边用户为"qiaohq"来做测试,我们向ftp服务器上传一个文件,速度是相当不错的,因为在内外进行数据传输。如下图所示:

马年最后一博-根据项目需求实现ftp服务权限分配及分网段限速访问_第7张图片

6.2、外网环境测试

马年最后一博-根据项目需求实现ftp服务权限分配及分网段限速访问_第8张图片

6.3、不同用户权限的测试

    按照上边的方法建立一个只有下载权限的用户,比如“zhaocj”这个用户,登陆ftp后测试此用户是否具有上传、删除、新建文件的权限,经测试此用户只能从ftp服务器上下载文件。

    再用一个属于“group-w”组中的用户,比如“qiuj”这个用户来做测试,这个用户具有上传、修改、删除ftp文件的权限,对上边qiaohq这个用户上传的文件也具有修改权限。

7、系统日常管理

7.1、锁定用户登陆及解除锁定

如果哪一天一同事休假了或是你看不惯哪个小伙伴了就可以这样操作

[root@LCKJ-ftpserver vsftpd]# pwd
/etc/vsftpd
[root@LCKJ-ftpserver vsftpd]# echo "qiaohq" >> ftpusers

限制用户的登陆是不用重新启动vsftpd服务的。

现在再用qiaohq这个帐号来登陆试一下,测试后发一是拒绝登陆的,如下图所示:

马年最后一博-根据项目需求实现ftp服务权限分配及分网段限速访问_第9张图片

如果这个同事休假时间结束回到单位后就把ftpusers文件里关于此用户的一行删除即可。如果是一同事离职呢,那就彻底删除此用户即可,如下边操作:

[root@LCKJ-ftpserver vsftpd]# userdel -r qiaohq

7.2、增加用户、删除用户

<增加拥有上传权限的用户>

[root@LCKJ-ftpserver vsftpd]# useradd -s /sbin/nologin -G group-w ftpuser1
[root@LCKJ-ftpserver vsftpd]# passwd ftpuser1

<增加只有下载权限的用户>

[root@LCKJ-ftpserver vsftpd]# useradd -s /sbin/nologin -G group-r ftpuser2
[root@LCKJ-ftpserver vsftpd]# passwd ftpuser2

<删除用户>

[root@LCKJ-ftpserver vsftpd]# userdel -r ftpuser1

8、总结

    这次系统部署零零散散的折腾了几天,从规划到着手实施还是踩了几个坑,现总结如下:

1、需求中有项目部门中的多个同事对项目上的资料文件都具有修改权限,这在linux系统本身上很好实现,把多个用户划分为一个group,再把目录的属组归属于这个组,再对属组增加rwx权限即可;但基于本地ftp用户上传资料后,此资料的属主属组都是自己的,只有自己才能修改自己上传的资料,所以无法实现我们的需求。如果能改变上传资料的属组,那问题就可迎刃而解,但vsftpd配置文件的参数中只有修改上传文件的属主,没有能修改文件的属组的参数,所以无法实现。最后采用facl的方式来处理权限的问题,对数据目录“/ftproot/mydata/projects”进行“setfacl -R -m g:greoup-w:rwx /ftproot/mydata/projects”操作后,对此目录下的文件只要是属于group-w这个组中的用户就具有rwx的权限,这样就可实现我们的需求。

2、系统部署好后,在做测试时发现一个奇怪的现象,通过外网访问ftp服务时,如果不启用限速,那上传资料是没有问题的,但一旦启用“local_max_rate=”参数,那上传文件时,即使是文件已上传完毕,客户端工具flashfxp也卡在“150 ok ti send data”,要过一会后客户端与服务器自动断开再自动重新连接后才正常,重新连接后刷新一下就可看到已上传完毕的资料,但如果不对外网访问限速,那又是正常的。这了定位这个故障的所在,我做了这样一个测试,我对内外网访问都做速度的限制,发现从内网访问是正常的,但从外网访问还是有前边说的不正常现象,那我把问题定位到了公司的出口,宽带路由器上,此问题暂时没有解决。