近期收到这样一个需求:某部门需要和HK公司(internet)及不同的供应商共享文件,各供应商之间不可共享(通过FTP共享)。

  FTP账号要求:某部门一个内部账号,一个HK外部账号,供应商各一个外部账号,内部账号和HK账号可以访问各供应商账号目录。

  FTP权限要求:内部账号和HK账号有所有权限,包括上传、下载、删除;外部账号只有上传、下载权限。

  FTP带宽限制:内部账号上传下载无限制,HK账号上传下载限速500KB,供应商账号上传下载限速200KB。

  解决方法:

  1、在FTP服务器(vsftpd)上新建一个用户并指定目录(虚拟账号使用)

   [root@ftp ~]# useradd ftpgcb -s /bin/fail -d /home/gcb

  2、新建外部虚拟账号目录

   [root@ftp home]# mkdir -p /home/gcb/shxc

  3、修改虚拟目录所有权并授予权限755(可根据需要设置)

   [root@ftp home]# chmod -R 755 /home/gcb/

   [root@ftp home]# chown -R ftpgcb:ftpgcb /home/gcb/

  4、新建虚拟账号并生成数据库文件(奇数为账号,偶数为密码)

   内部账号:[root@ftp vsftpd]# vi vsftpd_login_intranet.txt

   [root@ftp vsftpd]# db_load -T -t hash -f vsftpd_login_intranet.txt vsftpd_login_intranet.db

   外部账号:[root@ftp vsftpd]# vi vsftpd_login_internet.txt

   [root@ftp vsftpd]# db_load -T -t hash -f vsftpd_login_internet.txt vsftpd_login_internet.db

  5、新建虚拟账号的配置文件

   内部账号:[root@ftp user_conf]# vi /etc/vsftpd/vsftpd_intranet/user_conf/ruisi

   主要的几个参数:

   write_enable=YES                   anon_upload_enable=YES

   anon_mkdir_write_enable=YES           anon_other_write_enable=YES

   guest_enable=YES                      guest_username=ftpgcb

   chmod_enable=YES                      anon_world_readable_only=NO

   connect_from_port_20=YES              hide_ids=YES

   pasv_min_port=50000                   pasv_max_port=60000

   tcp_wrappers=YES                      xferlog_std_format=YES

   xferlog_enable=NO                    log_ftp_protocol=NO

   ls_recurse_enable=NO                 ascii_download_enable=NO

   ascii_upload_enable=NO               async_abor_enable=NO

   dirlist_enable=YES                   idle_session_timeout=120

   data_connection_timeout=300          accept_timeout=60

   connect_timeout=60                   port_enable=YES

   download_enable=YES                  anon_max_rate=0

   chroot_local_user=NO                 deny_file={*.mp3,*.mov,.private}


  内部用户上级目录通用配置(/etc/vsftpd/vsftpd_intranet/vsftpd_intranet.conf):

   listen=YES                listen_address=10.x.x.y (对内的IP地址)

   listen_port=21            anonymous_enable=NO

   local_enable=YES          user_config_dir=/etc/vsftpd/vsftpd_intranet/user_conf

   local_max_rate=0          ftpd_banner=FTP Server

   banner_file=/etc/vsftpd/vsftpd_intranet/banner

   pam_service_name=ftp_e  use_localtime=YES


   外部账号:[root@ftp user_conf]# vi /etc/vsftpd/vsftpd_internet/user_conf/xinchun

   listen=YES    开启监听

   listen_address=10.x.x.x      设置监听的IP地址(对外的IP地址)

   listen_port=21    设置侦听的端口号

   max_clients=200    设置最大连接的IP数

   max_per_ip=4    设置第个IP允许与FTP服务器同时建立的连接数

   write_enable=YES    允许写入权限

   anon_upload_enable=YES    允许匿名用户上传            (如只允许下载不允许上传,可修改为NO)

   anon_mkdir_write_enable=NO    禁止匿名用户创建目录    (HK账号新建和删除权限需要YES)

   anon_other_write_enable=NO    禁止匿名用户其他的权限    (HK账号新建和删除权限需要YES)

   guest_enable=YES        启用虚拟用户

   guest_username=ftpgcb    虚拟用户对应的本地用户账号

   local_root=/home/gcb/shxc    本地用户登入时的(定义的)目录    (HK账号对应为上一级目录)

   chmod_enable=YES    允许本地用户使用chmod命令改变上传的文件权限

   local_umask=077    本地用户上传档案时的权限掩码(默认)

   file_open_mode=0666    本地用户上传档案后的档案权限(默认)

   anon_world_readable_only=NO    禁止匿名用户下载

   connect_from_port_20=YES    开启20端口连接

   hide_ids=YES    所有档案的拥有者与群组为虚拟用户对应的本地用户

   pasv_min_port=50000    设置被动模式数据连接可使用端口范围的最小端口(默认为0表示任意端口)

   pasv_max_port=60000    设置被动模式数据连接可使用端口范围的最大端口(默认为0表示任意端口)

   tcp_wrappers=YES    启用wrap配合vsftpd检查/etc/hosts.allow和/etc/hosts.deny中的设定来决定请求连接的主机是否允许访问FTP服务器(简易防火墙)

   xferlog_std_format=YES    启用xferlog标准日志格式(默认为关闭)

   xferlog_enable=NO    禁用上传/下载日志记录(默认为开启,记录保存在xferlog_file所定义的文件中)

   log_ftp_protocol=NO    禁用所有ftp请求和响应日志记录(默认为禁用,开启后日志将保存在/var/log/vsftpd.log,且xferlog_std_format不能被激活。此选项一般用于调试)

   ls_recurse_enable=NO    禁止登入者使用ls -R查看当前目录下子目录中的文件(默认禁止)

   ascii_download_enable=NO    禁用ASCII模式下载数据(默认为NO)

   ascii_upload_enable=NO    禁用ASCII模止上传数据(默认为NO)

   async_abor_enable=NO    禁用sync abor功能(启用时FTP命令将显示为"async ABOR",仅对高级客户端使用)

   dirlist_enable=YES    允许用户查看目录的内容

   idle_session_timeout=200    空闲用户会话的超时时间,200秒不对FTP服务器进行任何操作将断开FTP链接

   data_connection_timeout=300    设置建立FTP数据连接的超时时间5分钟

   accept_timeout=60    设置建立FTP连接的超时时间为60秒(默认)

   connect_timeout=60    响应主动模式下数据连接的超时时间为60秒(默认)

   port_enable=YES        开启主动模式

   download_enable=YES    允许文件下载到本地            (如只允许上传不允许下载,可修改为NO)

   anon_max_rate=200000    匿名用户的最大传输速度(200K,有80%-120%的浮动,0为无限制)

   local_max_rate=200000   本地用户的最大传输速度(200K,有80%-120%的浮动)

   chroot_local_user=YES    当chroot_list_enable=NO,所有的用户均不能切换到其他目录

   banner_file=/etc/vsftpd/vsftpd_internet/banner    设置包含当用户登录FTP时显示的内容的文件,会覆盖由ftpd_banner设置的字符串

   deny_file={*.mp3,*.mov,*.exe,.private}    设置拒绝访问的文件

   use_localtime=YES    使用本地用户所在的时区显示时间

   

  外部用户上级目录通用配置文件(/etc/vsftpd/vsftpd_internet/vsftpd_internet.conf):

   anonymous_enable=NO    禁止匿名用户登录

   local_enable=YES    允许本地用户登录

   user_config_dir=/etc/vsftpd/vsftpd_internet/user_conf    设定用户配置文件所在的目录(用户登录后会到指定的目录下读取与当前用户名相同的文件,并根据文件中的配置命令对当前用户进行更进一步的配置)

   ftpd_banner=FTP Server    设定FTP欢迎语的字符串(默认无)

   pam_service_name=ftp_i    设置PAM使用的文件名称(默认路径/etc/pam.d/)

  6、修改磁盘配额限制

   修改/etc/fstab,在/home所在行defaults后面加上逗号再加上usrquota后保存退出 

   使用quotacheck检查/home文件系统:[root@ftp ~]# quotacheck -avug

   对账号设置配额限制quota(以K为单位),设置blocks相应的soft及hard值(30G,250000个文件)。

   [root@ftp ~]# edquota -u ftpgcb

   Disk quotas for user ftpgcb (uid 509):

   Filesystem      blocks       soft       hard     inodes     soft     hard

   /dev/sda5        116       31457280   31458280     22      250000    253000

  7、重启服务,测试。


vsftpd的配置参考:

http://wiki.ubuntu.org.cn/Vsftpd

http://os.51cto.com/art/201008/222036.htm

http://yuanbin.blog.51cto.com/363003/108262/

http://blog.sina.com.cn/s/blog_946cb2b70100x4zc.html