ftpd搭建简单的Ubuntu

Linux下的ftpd很多,Ubuntu下常用vsftpd,
proftpd和pure-ftpd,当初使用的就是proftpd.
不过前两者有个致命的问题就是内码转换,它们默认使用UTF-8编码,而Windows系统使用GBK,这就导致Windows访问时中文出现乱码。
pure-ftpd则可以设置客户端默认编码,直接设为GBK就解决问题了。pure-ftpd的虚拟用户支持也很好,允许限制带宽、空间配额,可以用自带的pure-pw管理虚拟用户,也可以用MySQL和LDAP.
pure-ftpd也提供FXP协议和SSL/TLS支持,是一个很全面的ftpd.
首先安装pure-ftpd:

前言:

时隔3年,重新在虚拟机上装了个Linux,开始研究,每次写Blog都会感叹一下时间如梭啊,就像小敏,时不时晚上要对我说:我现在心情不好。S:为啥?M:又老了一天。

  1. sudo apt-get
    install pure-ftpd

FTP的工作方式

Ok,这次主要抱怨下Linux下的SVN和FTP的部署,说错了,是记录下。

  pure-ftpd不是用配置文件而是用命令行参数,这种方式比较怪异。不过pure-ftpd的作者还是为偏好配置文件的用户提供了wrapper,可以man一下pure-ftpd-wrapper.
在Debian/Ubuntu下的wrapper比较怪,是在/etc
/pure-ftpd/conf下以设置项作为文件名,该项的设置值作为文件的内容,如需要设置ClientCharset=gbk,就建立一个名为“ClientCharset”的文件,内容为“GBK”.
  实验室的FTP需要给每个人配一个私有账号,相当于一个网络硬盘;同时允许匿名登录用于上传公共资料与数据交换。由于是内部服务器,需要改一下端口号,最后还需要一个管理员帐号。我使用的设置如下(用传统赋值写法),一些不常用的就不写了:

FTP支持两种模式,一种方式叫做Standard (也就是
PORT方式,主动方式),一种是 Passive (也就是PASV,被动方式)。
Standard模式 FTP的客户端发送 PORT
命令到FTP服务器。Passive模式FTP的客户端发送 PASV命令到 FTP Server。

Linux给我最大的感觉就是太不人性化了,这么多年了,M$,烂苹果都意识到了用户体验的重要性,可是Linux就是不学乖,跟IBM一个德行,也许是为了提升整个系统的运行效率而放弃了图形化的界面(啥?Linux的图形界面?鸡肋,食之无味,弃之可惜),也许是故意提高Linux系统的管理门槛,以便催生类似“牛B的Linux系统管理员”这样称号的职业,谁知道呢,反正Linux可以用一句话来总结一下,就是,谁用谁蛋疼。PS:更有人用Linux来做为日常使用的电脑,办办公,上上网,这就是蛋疼菊紧了,然后还要来论坛秀一下下限,看我用Linux,多NB!这里就要表扬下Win8了,当初也只是为了装B,装了个WDP版本,结果发现M$这次厚道啊,虽说是WDP,但是稳定性,兼容性都相当的好,甚至在资源占用,资源管理等方面都比Win7还好,在我笔记本上测试了下游戏性能,WOW的运行效率比在Win7上还高,小小的期待下Win8的正式版。(啥?Metro才是重头?鸡肋)。好了,徐庶说的言多必失,回归正题。

  1. ClientCharset=gbk #必设,防止Windows登录出现中文乱码
  2. DontResolve=yes #不解析域名,可以节省登录时间
  3. BrokenClientsCompatibility=yes #兼容IE等非标准FTP client
  4. ChrootEveryone=yes #把所有用户限制在其homedir下
  5. KeepAllFiles=yes #禁止用户删除文件,TrustedGID组中的除外
  6. TrustedGID=1001 #管理员组ftpadmins的GID,允许管理员删除文件
  7. CreateHomeDir=yes #当虚拟用户第一次登录时,自动创建homedir
  8. MaxClientsPerIP=2 #每个IP限制2个连接
  9. MaxClientsNumber=20 #最大并发连接数,默认值是50
  10. MaxDiskUsage=90 #分区已使用空间超过90%时不再接受上传
  11. NoAnonymous=no #允许匿名登录
  12. Bind=,8821 #改变端口号

下面介绍一个这两种方式的工作原理:

SVN的安装:
Subversion,Apache的源代码管理工具,本来是不想用SVN的,其实Windows下的TFS蛮好用的,集成了源代码管理和项目管理(包括了Bug
Track)。但是TFS太臃肿了,而且安全性太好了,上次Windows崩溃,我把TFS进行了一次备份,费了九牛九虎之力在另外一台电脑上恢复了,结果客户端使用同样一个用户名,都不能继续使用原来的工作空间,导致没有签入的源代码都要被覆盖,只有用很苯的办法来保证不丢失源代码,太坑爹了。SVN就Light多了,要迁移环境啥的,方便的多。

  每次修改服务器设置后都需要重新启动服务:

Port模式FTP 客户端首先和FTP服务器的TCP
21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。
PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP
20端口连接至客户端的指定端口发送数据。 FTP
server必须和客户端建立一个新的连接用来传送数据。

安装很简单,官方网站有说明,三句命令搞定(SLES11,下同):
zypper addrepo

zypper refresh
zypper install subversion

  1. sudo
    /etc/init.d/pure-ftpd restart

Passive模式在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是
Port命令,而是Pasv命令。FTP服务器收到Pasv命令后,随机打开一个临时端口(也叫自由端口,端口号大于1023小于65535)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTP
server不再需要建立一个新的和客户端之间的连接。

添加源,刷新,安装,这步骤好眼熟,越狱的IOS么?

  一共建立了两个用户组:ftpadmins(管理员和普通用户,可以删除文件)和ftpusers(匿名账号,不能删除文件),以及三个用户:ftpadmin(管理员),ftpuser(普通用户)和ftp(匿名用户).
服务器的根目录为/var/ftp,所有者为 ftpadmin:ftpadmins.
根目录下有public和users两个目录,public作为匿名访问的根目录,users存放普通用户的文件。匿名访问空间(public目录)中只有incoming允许上传(777),其它位置只能下载。users目录也被设为组内的完全访问权限(775),这样同组的普通用户(ftpuser)可以有读写和删除的权限。普通用户将被限制(chroot)在/var/ftp/users下自己的homedir中,因此虽然有完全访问权限,也不会影响其它位置。为了保险起见,其它位置的权限设为755,只有ftpadmin有完全权限。

很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP
服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP
20无法和内部网络的客户端建立一个新的连接,造成无法工作。

SVN配置:
也不复杂,先建立一个目录:
mkdir /home/svn/efreda
这个目录做为SVN的根据地。

  1. sudo groupadd
    ftpadmins
  2. sudo groupadd
    ftpusers
  3. sudo useradd -g ftpadmins -d /dev/null -s /bin/false
    ftpadmin
  4. sudo useradd -g ftpadmins -d /dev/null -s /bin/false
    ftpuser
  5. sudo useradd -g ftpusers -d /var/ftp/public -s /bin/false
    ftp
  6. sudo mkdir
    /var/ftp
  7. sudo mkdir
    /var/ftp/public
  8. sudo mkdir
    /var/ftp/public/incoming
  9. sudo mkdir
    /var/ftp/users
  10. sudo chown -R ftpadmin:ftpadmins
    /var/ftp
  11. sudo chmod -R 755
    /var/ftp
  12. sudo chmod
    777 /var/ftp/public/incoming
  13. sudo chmod
    775 /var/ftp/users

在Ubuntu中pure-ftpd是什么样

然后建立SVN相关配置文件:
svnadmin create /home/svn/efreda
运行之后,可以导航到该目录,生成了几个相关配置文件。

  由于这些用户仅用于pure-ftpd,不需要给登录权限,因此
shell被指定为/bin/false.
  下面配置虚拟用户。虚拟用户是ftp登录时所用的用户账号,但可以共用一个系统账号。当用户使用虚拟账号登录ftp时,将实际使用虚拟用户对应的系统用户身份进行操作。实验室的所有普通用户均使用虚拟账号,对应的系统账号是ftpuser.
匿名用户只能对应系统中的ftp用户(名称不能改),pure-ftpd的官方文档中建议把匿名用户单独设在一个用户组中。
  虚拟用户用pure-pw配置,官方文档在这里。
pure-pw的使用很方便,形式和管理系统用户差不多,只是在useradd,
usermod等前面加上pure-pw(用户名要紧随操作后面而不是放在最后,这一点与useradd等不同).
匿名用户不需要单独配置,因此homedir一定要在创建系统用户ftp时指定好,其它系统用户的homedir可以简单地指定为/dev/null,创建虚拟用户时再指定homedir.
下面创建虚拟管理员账号admin与两个普通账号test1和test2:

Ubuntu/Debian 提供了三个不同的 Pure-FTPd 的 deb 安装包,分别是
pure-ftpd、pure-ftpd-ldap 和 pure- ftpd-mysql,其中 ldap 和 mysql
分别表示 Pure-FTPd 跟 ldap 和 mysql 集成,另外这三个包都依赖于
pure-ftpd-common。如果我们不需要 ldap 和 mysql 的话,选择 pure-ftpd
就可以了。

对svnserve.conf进行配置,用经典的VI(还记得4年前,李老教我们用Linux下的VI,我一直不怎么理解什么叫末行模式,哈哈)打开。
几个地方都需要修改:
anon-access = none # 设置是否允许匿名访问,内部的话,就不允许匿名了
auth-access = write # 设置登录用户的权限,可写

  1. sudo pure-pw useradd
    admin -u ftpadmin -d /var/ftp
  2. sudo pure-pw useradd
    test1 -u ftpuser -d /var/ftp/user/test1
  3. sudo pure-pw useradd
    test2 -u ftpuser -d /var/ftp/user/test2

配置方式

passwd-db = passwd #
这个可配可不配,由于我们采用的是加密的认证方式,所以这个不配置,保持屏蔽
authz-db = authz #
如果需要按目录按组分权限,这个就需要进行配置,网上说明一大堆

  执行每条命令之后pure-pw会要求输入账号的密码。在参数的-d选项中指定的homedir的并不需要事先创建好。如果在配置中设置
CreateHomeDir=yes,则在虚拟用户第一次登录时pure-ftpd会自动创建其homedir.
  添加虚拟用户时还可以设置用户的带宽、空间配额、IP段等。修改虚拟用户设置用pure-pw
usermod, 修改密码用pure-pw passwd, 删除虚拟用户用pure-pw
userdel,用法详见官方文档。
  每次修改用户设置后都要更新一下虚拟用户数据库,不需要重新启动服务:

不同于其他的多数守护进程(daemon),Pure-FTPd
的配置比较特别:它不读取任何的配置文件,配置选项都是通过命令行参数来实现的。例如:参数
‘-H’ 被设计为通过避免 DNS
查询来加快服务器的速度。要启用该特性,我们只需要将其加到命令行中:
pure-ftpd -H 。备选的长参数也被支持的,下面是一个等价的命令 pure-ftpd
–dontresolve

realm = Efreda Repository #
为仓库取一个唯一的名字,后面的加密认证需要用到

  1. sudo pure-pw mkdb

针对喜欢配置文件的用户,Pure-FTPd
官方给出了一种方案:通过一个封装(wrapper)工具,将配置文件解析并将其转换成命令行参数。首先根据自己的需要编辑配置文件
pure-ftpd.conf,而后通过下面的命令启动 pure-config.pl
/etc/pure-ftpd.conf。pure-config.pl 是一个 perl
脚本,它根据配置文件采用合适的命令行选项来调用 pure-ftpd。

use-sasl = true #
是否使用SASL加密认证,这个启用,要不登录保存的是明文,SLES11下这个是默认可以使用的,相关依赖项都安装完毕了。

  也可以在每次使用 pure-pw的时候加上-m参数立即更新虚拟用户数据库。
  到这里设置就算完成了,这时ftp
localhost可以匿名登录,但虚拟用户登录会出现530错误。这是因为默认的认证方式中没有puredb数据库,解决方法是在/etc/pure-
ftpd/auth下加入puredb数据库的软链接:

在 Ubuntu/Debian 中,开发人员采用了另外的一种 wrapper
方式:它没有采用单一的配置文件,而是在/etc下建立一个pure-ftpd的目录,其下又有
conf、auth、db 这三个目录和一个名为 pureftpd-alias-dir
的文件。每一个配置选项都以一个文件的形式存在于 /etc/pure-ftpd/conf
目录中,而且是以选项为文件名,选项值为文件内容。例如如果想配置AnonymousOnly=yes(只允许匿名用户),则在
/etc/pure-ftpd/conf 中创建一个名为 AnonymousOnly
的文件,里面只有一行内容:yes。

min-encryption = 128 #
加密的配置,分别设置成0,1,>1有不同的意思,网上也是说明一大堆
max-encryption =256
改完保存。

  1. cd
    /etc/pure-ftpd/auth
  2. sudo ln -s ../conf/PureDB
    60puredb

在 Ubuntu 中,我们只关注最后一种配置方式。

配置SASL:
导航到 /etc/sasl2,还是使用VI新建一个svn.conf文件,内容如下:
pwcheck_method: auxprop
auxprop_plugin: sasldb
sasldb_path: /home/svn/efreda/sasldb
mech_list: DIGEST-MD5

  现在就可以使用虚拟账号登录FTP了。

环境:

然后新建SVN用户:
saslpasswd2 -c -f /home/svn/efreda/sasldb -u “Efreda Repository” sweet
-p
接着输入密码就行了。

  考虑到文件交换的应用,在匿名用户空间/var/ftp/public下新建了一个exchange目录,下设1day,
3days和7days(权限均为777)用于临时储存交换数据,当目录中的数据存放超过一定时间后删除。我写了一个bash脚本用于自动完成清理工作,并在清理时记录当前时间与被删除的文件,脚本如下:
#!/bin/bash

1,在一台Ubuntu server 10.4 服务器上安装pure-ftpd配置成FTP服务器

删除用户就是把-c 改成 -d。

  1. LOGFILE=/var/log/pure-ftpd/ftpac.log
  2. date >> $LOGFILE
  3. find
    /var/ftp/public/exchange/1day -mtime +1 -type f -exec
    rm
    {} -v >> $LOGFILE
    \;
  4. find
    /var/ftp/public/exchange/3days -mtime +3 -type f -exec
    rm
    {} -v >> $LOGFILE
    \;
  5. find
    /var/ftp/public/exchange/7days -mtime +7 -type f -exec
    rm
    {} -v >> $LOGFILE
    \;

2,在客户端上用FileZilla Client登录测试

另外还有一个命令:sasldblistusers2 -f [path] 列出所有用户

  用crontab将脚本设为每天凌晨执行。

操作:

启动SVN:
svnserve -d -r /home/svn/efreda
停止SVN:
killall svnserve

补充:上面的脚本无法删除空目录,更好的方法是用tmpreaper(默认未安装,记得sudo
apt-get install tmpreaper):
#!/bin/bash

1,安装pure-ftpd

建立FTP:
实际上SLES11在安装完成后,FTP服务器已经安装好了,pure-ftpd,在YaST中启动它即可,图形配置没啥要改的,就是拒绝匿名用户,然后把目录改一下。

  1. LOGFILE=/var/log/pure-ftpd/ftpac.log
  2. date >> $LOGFILE
  3. /usr/sbin/tmpreaper
    –showdeleted -c -M 1d /var/ftp/public/exchange/1day >>
    $LOGFILE
  4. /usr/sbin/tmpreaper
    –showdeleted -c -M 3d /var/ftp/public/exchange/3days >>
    $LOGFILE
  5. /usr/sbin/tmpreaper
    –showdeleted -c -M 7d /var/ftp/public/exchange/7days >>
    $LOGFILE  

#sudo apt-get install pure-ftpd

主要的配置改动还是在文件当中,导航到:/etc/pure-ftpd/pure-ftpd.conf
(VI),
主要的改动如下:
PureDB 把这个的注视去掉,以便允许虚拟帐户访问FTP。
Umask 127:027 #原本是
177:077,这个是权限掩码,不改的话,通过管理员帐户创建的文件,默认情况下,其他正常用户无法下载,今天配置的时候,我就卡在这里了,搞了半天,我上传的东西,别人都不能下载。
AutoRename no
CreateHomeDir no # 如果只是为了共享资源,没必要创建个人目录
NoRename no # 这个必须改,否则管理员帐户登录都无法修改文件名

然后把脚本扔进crontab即可。

#sudo netstat –nl

其他默认即可。

图片 1

查看21端口是否已开启。

然后创建1个分组,2个Linxu帐户,分组取名:ftpgrp,两个帐户分别为:ftpuser,ftpadmin。然后对ftpadmin赋予FTP目录的拥有权限,我用的目录是
/home/ftp 用命令:chown ftpadmin:ftpgrp /home/ftp 即可。

发表评论

电子邮件地址不会被公开。 必填项已用*标注