网上没搜着多少Pure的中文内容,就配置文件和MySQL的README,寒假在家就把PureFTPd的README文档翻了过来。
好像还有点没翻完,还有点错误,过两天重新整理下,但基本够用了。
.:. PURE-FTPD .:.
V1.0.22中文文档
Pure-ftpd是一款基于Troll-FTPd的快速高质量的标准FTP服务器。
Pure-ftpd在默认的配置下已经被设置成安全的,它没有已知的系统缺陷。它确实配置简单,并且专门为新内核设计。Pure-ftpd已经成功地应用于Linux、FreeBSD、DragonflyBSD、NetBSD、OpenBSD、ISOS、MirBSD、BSDi、Solaris、Darwin、Tru64、Irix、AIX和HPUX。
功能包括chroot()、虚拟域、ls功能、反病毒系统、为无源下载的可配置端口,FXP协议、带宽限制、ratios、基于LDAP / MySQL / PostgreSQL-based的身份验证、fortune文件,类似于Apache的日志文件、快速独立启动模式,text/HTML/XML实时数据报告、虚拟用户、虚拟配额、特权分离,SSL/TLS 以及更多。
-------------------谁在使用---------------------
许多刚刚接触UNIX的人正在使用Pure-FTPd是因为他们发现这安装非常方便。但是这个软件同样用在嵌入式系统和highly loaded production servers,尤其是一些服务器集群。一些成功应用Pure-FTPd的公司的列表可以在http://www.pureftpd.org/users.shtml上看到。
Pure-FTPd同样是跟其他一些软件一起参加了crack-a-machine挑战,而那台机器并没有非授权的泄漏或丢失敏感的信息。
为了大型网站的集中用户管理,Pure-FTPd提供了灵活的身份验证模式,包括了SQL和LDAP支持,添加了能够使用任何语言简单添加新用户的功能。
-----------------编译--------------------------
在Pure-FTPd的本地窗口中,PureFTPd使用一些系统函数的调用。并且虽然已经做了一些可移植性的工作用于方便地与其他操作系统接驳,但只有Linux FreeBSD、NetBSD、OpenBSD、ISOS、MirBSD、BSDi、DragonflyBSD、Darwin、Solaris、Tru64、Irix、AIX是HPUX是已知能够正常工作的,其他的操作系统将需要一些调整。对于Linux,现在所有的发行版都行。
一个非官方的windows接口可以在http://ww.pureftpd.org/windows/上看到。
如果你的操作系统上安装有Cdialog或者Xdialog,使用下面的命令来编译和安装Pure-FTPd:
make -f Makefile.gui
如果你没有图形界面或者你更喜欢使用传统的方法,这样输入:
./configure
make install-strip
搞定!软件已经安装在了/usr/local/sbin/pure-ftpd
启动服务,在命令行键入:
/usr/local/sbin/pure-ftpd &
如果你是使用编译好的安装包(RPM,SLP,Debian)安装,可能要输入如下的命令:
/usr/sbin/pure-ftpd &
FTP服务已经就绪。输入"ftp localhost"来测试。如果你希望系统登录时就自动启动服务,把上面的命令加入到 /etc/rc.d/rc.local或者/etc/tc.d/boot.local。别忘记符号'&'。
Note.1
在Linux系统中,你将会被提示该服务始终以root权限在运行。这对于那些正在更换有效用户ID(并且只有有效用户ID,他们实际上拥有root权限,使用ps -U命令来观察哪些服务真正以root权限运行)的服务是是有意的并且更安全。我们正在使用Linux内核的特殊后门来撤销那些ps命令无法显示的权限。
Note.2
在Irix下编译,键入./configure之前先完成如下步骤:
export CC=cc
export CFLAGS=-I/usr/freeware/include
export LDFLAGS=-L/usr/freeware/lib32
在Solaris8下编译,使用GNU的Make而不用Solaris自带的make,这么做:
export PATH=/usr/ccs/bin:$PATH
export MAKE=gmake
Note.3
使用如下命令卸载Pure-FTPd(这么好的软件你真的想删掉吗?):
./configure
make uninstall
--------------------进阶编译选项-------------
"./configure"脚本允许你在编译前添加一些参数。
/------------------------------
"--with-"开关
--with-altlog:除了在系统控制台输出之外,支持用可选择的格式江日志写到特别的文件中。现在能实现CLF、Stats、W3C和xferlog。
CLF(常见日志格式)是Apche、WebFS、Roxen以及很多Web服务器所使用的基本格式。这些日志文件仅仅记载文件传输并且他们能使网络统计软件(Analog、Webalizer等)不要去解析你的FTP服务器的装载。数据格式是一种为日志解析软件设计的特殊的输出格式。W3C格式是很多商业日志分析器所使用的标准语法解析格式(所有由IIS支持的分析器都应该能处理这个)。xferlog是由wu-ftpd创造的传统格式。查看这篇文档后面的-O选项来获得更多信息。
--with-brokenrealpath:一些Solaris的版本实现了a broken realpath如果altlog或者pure-uploadscript在你的系统上不能正常工作,尝试使用这个开关重新编译。
--with-certfile=<file>:有SSL证书的文件。默认是/etc/ssl/private/pure-ftpd.pem。
--with-cookie:当用户记录进来时,显示一个fortune或者自定义的标题。(查看'-F'选项)
--with-diraliases:支持目录别名("cd"命令的"shortcuts")。请查看关于这个的适当部分(文档的后续部分)。
--with-everything:建立一个大的包含了所有细节都打开的服务,altlog、cookies、throttling、ratios、ftpwho、upload script、virtual users
(puredb)、quotas、virtual hosts、directory aliases、external authentication 和 Bonjour。
--with-extauth:编译支持外部用户验证模块。在激活这个功能之前请阅读README.Authentication-Modules和pure-authd的man。大多数用户用户并不需要它。
--with-ftpwho:支持'pure-ftpwho'命令。激活这个功能需要更多的内存。当服务器以独立启动模式运行的时候最好使用,这会比inetd模式慢。
--with-language=english
--with-language=german
--with-language=romanian
--with-language=french
--with-language=polish
--with-language=spanish
--with-language=danish
--with-language=italian
--with-language=brazilian-portuguese
--with-language=slovak
--with-language=dutch
--with-language=korean
--with-language=swedish
--with-language=norwegian
--with-language=russian
--with-language=traditional-chinese
--with-language=simplified-chinese
--with-language=hungarian
--with-language=catalan
--with-language=czech: 改变服务消息的语言。
默认是英语。如果你想提供一个翻译,请翻译'src/message_en.h'文件并发送到<j@pureftpd.org>
--with-largefile:支持在32位系统框架内下载大于2G的文件。通过FTP传输这么大的文件是一个奇怪的想法,并且你的文件系统必须支持,同样还有内核以及libc。当然FTP客户端对大文件同样是安全的。如果该功能被激活了,下载会慢一点(或者占用更多的CPU资源),这是由于目前Linux内核的限制。提醒一下,别激活这个功能玩儿,除非你真的想下载大于2G的文件。
--with-ldap:支持使用本地LDAP目录,当这个选项被激活,系统帐户将被忽略。你需要OpenLDAP来使用这个功能。如果OpenLDAP安装在了自定义的地方,你可以使用--with-ldap=<directory>。查看README.LDAP文件获得更多关于LDAP和Pure-FTPd的有关信息。
--with-minimal:为了有效地使用先进FTP客户端的功能,Pure-FTPd实现了FTP协议的最基本要求,还加了很多扩展(SITE IDLE,SITE CHMOD, MLSD, ...)。使用--with-minimal开关,这些扩展功能将不会被编译。因此没有独立启动模式服务,查询用户、用户组,humor以及ASCII支持。但是可执行文件的会比默认安装要小。你至少需要GCC3.3来使用该开关编译。正则表达式将会被编译。如果仍想缩小大小,跟--with-minimal一起使用--without-globbing。如果你要建立的是嵌入式系统,使用该开关。在其他情况下,为了防止用户的抱怨(尤其是windows客户端),请不要使用。
--with-mysql:使用本地MySQL来支持用户数据库。当该选项被激活,系统帐户会被忽略。使用该功能必须安装MySQL客户端程序库。如果MySQL安装在自定义的地方,你可以使用--with-mysql=<directory>。查看README.MySQL文件获得更多关于MySQL和Pure-FTPd的有关信息。
--with-nonroot:定制一个不需要root权限来启动的服务。任何普通用户都能运行该服务。如果你在一个非专用的主服务上有shell接入限制这将非常有用。但是一些功能将被禁止,并且密码只能由LDAP、SQL或者PureDB来验证。当虚拟chroot()被激活,服务开始的那个目录访问将受限制。这是一个不安全的模式,用来为普通(非root)用户临时定制服务。在独立启动模式下2121端口将被默认监听。如果你想使用nonroot模式,你必须编译和重新安装软件(./configure --prefix=... && make install-strip)。/sbin、/bin和/man目录将在prefix=...中创建。但是你必须再添加一个/etc目录(拥有将运行Pure-FTPd用户的可读写权限)。
--with-pam:使用pluggable用户验证模块。如果你合法的登录/密码组合总是被拒绝的话请不要使用。but the real fix would be to
fix your PAM configuration。你需要建立一个/etc/pam.d/pure-ftpd文件来正确使用PAM用户验证。'pam'目录中包含了这样一个文件的例子。
--with-paranoidmsg:favor paranoid信息取代系统友好的信息。当激活该功能,登陆失败不管什么缘由都会显示相同的信息给用户,不使用该选项,如果是密码问题将显示"Authentication failure",如果该用户被系统拒绝访问将显示"Sorry,I can't trust you"。
--with-peruserlimits:激活单用户并发限制。非常loaded的服务器不要使用。
--with-pgsql:使用本地Postgres来支持用户数据库。当该选项被激活,系统帐户会被忽略。使用该功能必须安装Postgres客户端程序库。如果Postgres安装在自定义的地方,你可以使用--with-pgsql=<directory>。查看README.PGSQL文件获得更多关于Postgres和Pure-FTPd的有关信息。
--with-probe-random-dev:Pure-FTPd使用/dev/arandom、/dev/urandom或者/dev/random设备来提供随机数。这些设备的存在在编译时已经探查好了。如果在一台主机上编译好程序在另一台主机上运行,该选项将激活实时探查功能。在Linux和BSD系统中没有作用,但是Solaris和QNX还是需要的。
--with-puredb:支持虚拟用户,就是一个本地用户数据库,独立于你的系统帐户。请查看README.Virtual-Users文件来获得更多关于虚拟用户的信息。
-with-quotas:激活虚拟配额。使用虚拟配额,你可以限制一个用户在他的帐户中可存储的最大文件数和总大小。查看"quotas"部分在文档的后续部分。
--with-ratios:支持上传/下载ratios, to please w4r3z fr34k2.
--with-sysquotas:支持系统配额(不是Pure-FTPd的虚拟quotas)。仅在你确实想使用系统配额时激活该功能。
--with-throttling:支持带宽限制(见下)。
--with-uploadscript:从0.98版开始,Pure-FTPd有了一个关于上传的好功能。在成功上传之后可以自动调用任何一个外部程序或脚本。这需要通过Pure-FTPd安装包安装另一个程序,叫做'pure-uploadscript'。查看man手册获得更多关于这个的信息。
--with-virtualchroot:一般情况下,当用户使用chroot(-A和-a选项)后,不可能从他的根目录中离开。激活该功能将使得这成为可能:始终会有跟着一个符号连接,甚至他们指向的目录不在用户根目录中。这对于使用共享目录是非常有用的(例如,在每一个主目录中建立一个符号连接指向/var/incoming)。该功能默认不被激活。
--with-virtualhosts:支持虚拟主机。这意味着,你可以为每个不同的IP地址建立不同的匿名FTP服务器。如果你的服务器只有一个IP地址,你并不需要那个功能。但是如果你有多个IP地址,而且你希望当客户端连接到IP ***时指向目录/etc/pure-ftpd/xxx/的内容而不是~ftp/,激活该选项。请阅读文档最后的"虚拟服务器"部分。
--with-welcomemsg:为了跟其他的FTP服务器兼容而读取'welcome.msg'。这是个安全隐患,因为匿名用户可以上传'welcome.msg'文件来加入到随机标语中。Pure-FTPD默认使用'.banner'文件。
--with-boring:显示"professional-looking"消息。
--with-privsep:激活特权分离(查看文档的后续部分)。
--with-bonjour:激活在MacOS上的Bonjour支持(查看-v开关)。
--with-rfc2640:激活charset conversion。它添加a dependency over the iconv library,并且需要一点更多CPU时。查看-8和-9开关。
/-----------------------------
"--without-"开关
-----------------------------/
--without-ascii:不支持7位传输(ASCII),如果你有用户使用windows客户端来发送脚本和HTML文件,别使用这个功能,不然他们会对你大叫。
--without-banner:不显示初始标语。这是盲目地追求安全性。
--without-capabilities:如果能找到capabilities library,Pure-FTPd将试着使用它来提高安全性。该选项将不管测试直接忽略这个库。如果capabilities library在你的系统上不能正常运作,试试这个。libcap可以从ftp://ftp.kernel.org/pub/linux/libs/security/linux-privs/下载。
--without-globbing:不包含globbing代码。这可以减少内存占用,但正则表达式将不起作用(例如'ls *.rpm')。大多数用户不必这么这做,gobbing是一个很好的功能。
--without-humor:要是你发现这个选项所做的并不指向源代码可真幸运。(恶作剧?)
--without-inetd:如果你总是在独立启动模式下运行Pure-FTPd,激活这个选项能够节省一些代码,不要同时激活--without-inetd和--without-standalone,没有这两种模式服务将无法运行。这两个选项在编译好的发行版中都没激活,inetd-like和standalone模式都是支持的。
--without-iplogging:不记录任何IP地址来保证机密性尤其对于政府服务器。
--without-nonalnum:paranoid文件名检查:只允许字母数字的字符集,不要盲目的激活该选项,不然你的用户会抱怨你的。
--without-unicode:不接受非拉丁语系的字符。如果你的文件文件名中没有特殊字符则推荐使用。
--without-senfile:在Linux、Solaris、HPUX和FreeBSD的内核中,Pure-FTPd为了减少CPU和内存的使用而调用了一个特殊的系统函数sendfile()。它在大多数文件系统中正常运行。但是这样一个优化并没有被当前内核实现在所有的文件系统中。用户反映在FreeBSD下的SMBFS(Samba)和Linux下的TmpFS和NTFS上用Pure-FTPd下载文件会失败(服务器报错为"broken pipe"或者"Error during write to data connection")。如果你打算从这些文件系统上提供服务,你得使用--without-sendfile来激活一个workaround。PA-Risc Linux系统也报告说需要这个选项。
--without-cork:禁止TCP_CORK优化。一些Linux的变种,例如Playstation需要这么做。
--without-standalone:FTP服务通常能以独立启动模式运行(不依赖任何super-server)。如果你不需要这个功能,并且你希望节约代码体积,加上这个选项。g2s、xinetd或者tcpserver这样的超级服务将强制运行这个服务。但是standalone模式是最受欢迎的操作模式。
--without-usernames:目录列表中永不输出用户和组的名,除了UID和GID。这提高了安全和性能,但是一些用户发现这样不太易用。
/-----------------
其他注意点
-----------------/
其他一些传统的自动配置选项肯定也是能接受的,例如
"--prefix="来改变安装路径前缀,默认是"/usr/local"。
仅供参考:Pure-FTPd的RPM包使用如下命令行配置:
./configure --with-everything --with-paranoidmsg --without-capabilities /
--with-virtualchroot
RPM包同样使用--without-pam编译来增强可移植性。
-----------------------------安装独立启动--------------
除非你使用--without-standalone编译了该服务,启动服务只需键入:
/usr/local/sbin/pure-ftpd &
在下面的例子中,我们假定'pure-ftpd'文件在/usr/local/sbin中,如果你从源代码编译了该服务,这将是默认的。但是正如我在文档前面所说的,如果你使用安装包安装(RPM、SLP、DEB、TGZ),服务可能被安装在了/usr/sbin/下。所以只要把'/usr/local/sbin/pure-ftpd'换成'/usr/sbin/pure-ftpd'就行。
运行前面的命令之后,服务将会监听每个接口、所有的IP地址和标准FTP端口的的输入连接。如果你的系统有IPv6地址,他们也能正常运行。
如果你想监听来自非标准端口的输入连接,加上'-S'和端口号:
/usr/local/sbin/pure-ftpd -S 42
服务的名字也是可以的('-S smtp',后台程序将接受SMTP端口25的连接。虽然不常见,但是我们无论如何得满足所有的人,哪怕是捣乱的)。
如果你的系统有很多的IP地址,并且你希望只能通过他们中的一个来连接到FTP服务,以192.168.0.42为例,使用如下命令:
/usr/local/sbin/pure-ftpd -S 192.168.0.42,
最后的逗号很重要,不要遗漏。实际上它是下面的缩写:
/usr/local/sbin/pure-ftpd -S 192.168.0.42,21
如果你更喜欢使用主机的名字,这么做:
/usr/local/sbin/pure-ftpd -S ftp.rtchar.com,21
同样支持IPv6地址。
使用上面的命令,服务以默认配置运行。如果有名为ftp的系统帐户则允许匿名FTP登录,并且你系统的所有用户都能够使用他们合法的登录/密码组合来访问FTP服务。
如果你需要调整默认配置,可以添加一些其他的命令行选项,比如说:
/usr/local/sbin/pure-ftpd -c 50 &
或者
/usr/local/sbin/pure-ftpd -S ftp.rtchat.com,21 -c 50 &
这样就只允许50个同时的连接。察看更多可用的选项请跳至下面的'选项'章节。对你来说如果系统在独立启动模式运行非常好,你不需要下面关于super-severs的部分,但推荐你看下-m和-C选项,'-D'对于你(或者你的用户)使用broken clients的是一个很好的选择,请看一下。
当你执行'ps auxw|grep pure-ftpd',结果大致为如下
root 15211 0.1 0.3 1276 452 ? S 13:53 0:00 pure-ftpd [SERVER]
root 15212 0.1 0.5 1340 672 ? S 13:54 0:00 pure-ftpd [IDLE]
root 15214 0.0 0.5 1340 672 ? S 13:56 0:00 pure-ftpd [DOWNLOADING]
[SERVER]主服务。要是结束该进程,服务会在下次连接后退出。
[IDLE]显示没有传输动作的终端。
[DOWNLOADING]显示正在下载文件的终端。
[UPLOADING]显示正在上传文件的终端。
为了简单的脚本, 创建了文件'/var/run/pure-ftpd.pid',它始终保存着主服务的进程ID。
------------------------安装SUPER-SERVER --------------------------
Pure-FTPd也能在一个super-server(主机服务访问控制)的帮助下运行,就像telnet、wu-ftp、finger或者Qmail。使用super-server通常比独立启动模式要慢。但是如果你喜欢tcpwrapper或者建立一个有过滤功能的super-server,Pure-FTPd能够轻松完成。
UNIX有很多super-servers:Inetd(最常见的)、TCPserver、G2S、Xinetd、Rlinetd等等。这里仅仅包括了前三个而忽略了其他一些无关的痛痒的super-server。
******在Inet下使用****
提醒:如果安全性对你很重要,请不要使用inetd。在默认配置中,若同一端口有很高的连接率的话会停止该服务。这导致一个很简单的系统繁忙。而且,inetd没有任何的并发控制。尽管你在Pure-FTPd中限制了连接数,坏人也能占满你的内存和描述符表。最好使用inetd的最新版来替换或者以独立启动模式来运行Pure-FTPd。
1)检查inetd已经运行:
ps auxw|grep inetd
root 3699 0.0 0.3 1072 492 ? S 15:47 0:00 inetd
2)打开/etc/inetd.conf并找到像下面这样的一行:
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd
这行可能以"proftpd"或者"wuftpd"结尾,但一定要以"ftp"stream tcp 开头。
3)如下修改该行:
ftp stream tcp nowait root /usr/sbin/tcpd /usr/local/sbin/pure-ftpd
如果你的系统中缺少/usr/sbin/tcpd,如下修改:
ftp stream tcp nowait root /usr/local/sbin/pure-ftpd pure-ftpd
4)重新启动inetd后台进程
killall -HUP inetd
如果你的系统中缺少'killall',用如下命令;
kill -HUP $(cat /var/run/inetd.pid)
*********在Xinetd下使用******
添加下面的单元到/etc/xinetd.conf文件中:
service ftp
{
socket_type = stream
server = /usr/local/sbin/pure-ftpd
protocol = tcp
user = root
wait = no
disable = no
}
在Redhat系统中,你也可以把它放到/etc/xinetd.d/pure-ftpd文件中。
然后重新启动服务:
killall -USR2 xinetd
****在TCPserver下使用******
TCPServer是丹·伯恩斯坦ucspi-tcp软件包中的一部分。它没有inetd那么臃肿,less D.O.S.-prone 有有趣的过滤功能。最简单的在TCPServer下运行Pure-FTPd的方法是使用如下命令:
tcpserver -DHRl0 0 21 /usr/local/bin/pure-ftpd &
你可以把这行添加到系统的本地启动脚本中(通常是/etc/rc.d/boot.local 或者 /etc/rc.d/rc.local),如果不能运行,将'tcpserver'替换成完整路径(例如'/usr/local/bin/tcpserver')。
********在G2S下使用********
把下面这行加入到/etc/jnetd.cf文件中(或者任何一个你选择做为G2S的配置文件)
{
SERVICE ftp
DESCRIPTION "Pure-FTPd"
RUN /usr/local/sbin/pure-ftpd
}
重新启动'jnetd'后台进程,即可完成。
----------------------选项--------------------
前面的步骤已经足够运行一个FTP服务了,但是你可以添加一些命令行参数来改变他的性态。这些参数必须加在你super-server配置文件pure-ftpd路径的后面。举个例子,你想添加'-s'和'-a 42'两个标志,下面是你super-server配置行的范例:
Inetd:
ftp stream tcp nowait root /usr/sbin/tcpd /usr/local/sbin/pure-ftpd -s -a42
or
ftp stream tcp nowait root /usr/local/sbin/pure-ftpd pure-ftpd -s -a42
如果你使用inetd,在选项和参数之间不要加空格,比如用-a42而不是-a 42。很多选项以及像':'这样的字符Inetd处理不了。
- Xinetd:
service ftp
{
socket_type = stream
server = /usr/local/sbin/pure-ftpd
server_args = -s -a 42
protocol = tcp
user = root
wait = no
disable = no
}
- TCPserver:
tcpserver -DHRl0 0 21 /usr/local/bin/pure-ftpd -s -a 42 &
- G2S:
{
SERVICE ftp
DESCRIPTION "Pure-FTPd"
RUN /usr/local/sbin/pure-ftpd -s -a 42
}
下面是能接受的开关项:
- '-0': 上传文件文件时,如果有同名的前版本文件存在,旧文件不会被移除或者删减。上传作为一个临时文件,当上传完成时,不干别的事儿,立马转换为这个新版本文件。举个例子,上传一个大的PHP脚本时,web服务器仍然为老版本工作,而一旦文件上传完毕就立刻转换为新版本。该选项与虚拟配额冲突。
- '-1': 在系统日志中记录每个对话的进程ID。
- '-4': 只监听IPv4地址的连接。
- '-6': 不监听IPv4,只监听IPv6。
- '-a <gid>':验证用户将被授权仅能访问他们的主目录(chroot)。这对没有shell接入权限的用户很有用。举个例子,一些客户共享WWW-hosting服务。只有用户组号码为<gid>的成员能够不受限制的访问整个文件系统。因此添加一个"staff"、"admin"或者"ftpadmin"用户组,并加入你信赖的用户。<gid>是用户组号码而不是组的名字。这个功能是主要为系统用户设置的,而不是虚拟用户。
注意:'root'始终拥有所有的文件系统访问权。
如果你想除了root,对所有人chroot(),使用下面的标志:
- '-A':除了root,对所有人chroot()。
- '-b':忽略RFC的一些标准分来适应一些彻底borken FTP客户端,或者broken firewalls/NAT boxes。
- '-B':让独立启动模式的服务在后台运行(系统守护进程)。
- '-c <number of clients>':最多允许的连接终端数。例如'-c 42'限制最多42个客户端同时访问。默认限制是50。
- '-C <max connection per ip>':限制来自一个IP地址的同时连接数。这是另一个有效的方法来防止服务繁忙和单用户的带宽抢占。这仅仅在以独立启动模式运行服务时有效(如果使用super-server,假定是这样的)。如果服务以'-C 2'运行,并不是指总共的连接数限制为2,而是对于来自同一台机器(或者至少是同样的IP)的客户端,不可以有超过两个的连接。这项功能需要更多的内存来记录IP地址,但是推荐使用。
- '-d':发送全面的调试信息给系统日志。不要使用这个,除非你真的想调试Pure-FTPd。密码将不会被记录。也把'-d'复制到log responses。
- '-D':列出以'.'开头的文件甚至当客户端并没有在list命令后加上'-a'选项。一个为错误配置的FTP客户端的workaround。如果你是purist,不要激活这个。如果你提供hosting服务或者你有恶意客户的话,使用这个。
- '-e':只允许匿名用户。在没有远程FTP访问真实帐号的公共FTP站上使用该功能。
- '-E':只允许验证用户登录。禁止匿名登录。
- '-f <facility>':使用该数据处理设备来记录系统日志。默认是'ftp'(或者'local2'要是你陈旧的libc中没有那个facility)。用'-f none'来禁止日志功能。
- '-F <fortune file>':登录时显示一个fotrune cookie。句子从文本文件<fortunefile>中随机抽取。这个文本文件必须按照标准"fortune"文件的格式(fortunes是每行用一个'%'隔开)。使用该选项,Pure-FTPd必须在在编译时支持cookie(--with-cookie)。如果你就是想在登录前显示一个简单的标语,在这儿加任何一个文本文档。
- '-g <pid file>':改变服务在独立启动模式下运行时改变pid文件的位置。默认在/var/run/pure-ftpd.pid。
- '-G':不接受重命名。
- '-H':默认情况下记录的是完整的主机名。DNS将要强制查找。'-H'标志取消了主机名的解析(记录"213.41.14.252"而不是"www.toolinux.com")。这显著的提高了连接速度,降低了繁忙服务器的上的带宽占用。特别要在公共FTP站点上使用。同样,请注意不用-H,获得的主机名也是不值得相信:没有一个相反的映射验证来保存DNS的查询。
- '-i':不管目录的许可是什么,都不接受匿名用户的上传。这个选项对虚拟主机特别有用,禁止你的用户在他们的帐户上创建warez站点。
- '-I <timeout>':改变最大闲置时间。以分钟记,默认为15分钟。现在的FTP客户端每隔一段时间就发送假的命令来欺骗超时机制。当他们闲置了两倍于timeout之后,就断开这些客户端的连接(因为他们永远表现出来是活动的)。
- '-j':如果用户的主目录不存在,则自动创建一个。新创建的主目录属于用户,根据当前目录的掩码来设定访问权限。只有主目录能够创建(因此像/home/john/./public_html won't work是不行的,而/home/john可以)。为了防止本地的攻击,上级目录不能属于一个不可信用户。同时提醒你,你得信任管理用户数据库的用户,因为有了这个功能,他将能够在服务器文件系统的任何地方创建/改变目录权限。
- '-k <percentage>':在分区使用超过<percentage>%后不允许上传。比如'-k 95'会确保你的磁盘不会由于FTP服务而超过95%的使用率。
- '-K':允许用户上传和恢复文件,但不能删除或重命名。仅能移动空目录。但是覆盖已经存在的文件还是允许的(支持上传恢复)。如果你想连这个也禁止,加上-r (--autorename)。
- '-l <authentication>'或者'-l <authentication>:<config file>':添加新的用户验证规则。请阅读文档后续的"用户验证"部分,这很重要。
- '-L <max files>:<max depth>':为了防止傻瓜式的系统繁忙攻击(或者仅仅是CPU占用CPU hogs),Pure-FTPd对于'ls'命令的回应不会显示超过2000个文件。递归调用ls最多能向下访问5个子目录。你可以通过'-L'这个选项来增加/减小这些限制。
- '-m <cpu load>':在CPU负荷超过<cpu load>时不允许匿名下载。这是个有效防止服务器过载的有效方法。不过,上传仍然是允许的。
- '-M':允许匿名用户创建目录。
- '-n <max files>:<max size>':如果服务在编译时选择支持了虚拟配额,对所有用户(除了'可信'用户组的成员)将强制应用配额的设定。<max size>是以Mb计的。查看文档后续的"virtual quotas"部分。
- '-N':NAT模式。强制运行模式。如果你的FTP服务器在一个不支持合适的FTP代理的NAT box后面,或者你没有透明的FTP代理而使用了端口重定向,使用这个选项。呃…前面的话大概没说清楚。基本上如果你的网络连接是这种形式:FTP服务器-------NAT/网关/路由--------Internet,并且你希望来自外网的客户能访问到你的FTP服务器,先不用这个选项试一下,如果Netscape客户端的连接没有问题,你的NAT网关rulez。如果Netscape不显示目录列表,你的NAT网关sucks。使用'-N'作为workaround。
- '-o':把所有的上传文件写到'/var/run/pure-ftpd.upload.pipe'中,这样'pure-uploadscript'程序就能运行。要是你用不到'pure-uploadscript' 就不要激活这个选项,否则Pure-FTPd会挂起等待Pure-FTPd的上传脚本程序开始。
- '-O <format>:<log file>':以可选择的格式将所有的文件传输写入到特定的日志文件中。目前支持四种格式CLF(类Apache)、Stats、W3C和xferlog。
如果你在开始选项中加了'-O clf:/var/log/pureftpd.log',Pure-FTPd会默认以类似Apache Web服务器的格式来记录传输日志。
要是你在开始选项中使用'-O stats:/var/log/pureftpd.log',Pure-FTP将创建以为统计报告设计的一种特定的格式来创建日志文件。Stats模式很简洁,比CLF和old broken "xferlog"格式更高效和精确。
Stats格式是这样的:
<date> <session id> <user> <ip> <U or D> <size> <duration> <file>
<data>是格林威治时间(time()),<session id>标识了当前的对话,<file>是unqoted,但总是每个日志行的结尾。"U"代表上传,"D"代表下载。
注意:对话ID仅仅为统计的需要设计。虽然在真实世界中它总是一个独一无二的字符串,但理论上在一些很少见的条件下会出现重复。因而在重要的事物中不要依赖它。
"pure-statsdecode"命令可以把时间转换成能读出来的数据。human-readable
W3C格式可以用'-O w3c:/var/log/pureftpd.log'激活。
从安全考虑,必须使用绝对路径(如/var/log/pureftpd.log而不是../log/pureftpd.log)。如果这个日志文件是存储在NFS卷上的,不要忘了运行lock manager(通常叫做"lockd"或者"rpc.lockd")。
- '-p <fist port>:<last port>':仅使用从<fist port>到<last port>之间的端口inclusive为了被动模式下载。这对于在不使用FTP连接跟踪的防火墙后面的服务器很有用。使用一些正常服务不会监听的大端口号(例如40000-50000)。
- '-P <ip address or hostname>':把特定IP地址加入到PASV/EPSV/SPSV命令的应答中。如果服务运行在一个不能正常处理stataful FTP伪装的伪装积存器下,将该box的IP地址放在这里。如果你是动态IP地址,你可以填写网关的公共主机名,这样每次当新客户段登陆时都将resolve。
- '-q <upload ratio>:<download ratio>':允许匿名用户ratios。
- '-Q <upload ratio>:<download ratio>':允许所有用户ratios。root用户组的成员(0,被称作'wheel')没有ratio。
- '-r':禁止覆盖已经存在的文件。上传跟已有文件同名的文件将自动重命名为xyz,xyz.1,xyz.2,xyz.3以此类推。
小贴士:如果你在编译的时候加上'make AUTORENAME_REVERSE_ORDER=1',命名转换将会反过来变成xyz,1.xyz,2.xyz,3.xyz以此类推。
- '-R':不允许用户(甚至是非匿名用户)使用CHMOD命令。在主机服务器上,这将能防止菜鸟们失误,比如在给他们的主目录设置不恰当的权限。使用-R开关将只有root用户能使用CHMOD命令。
- '-s':"waReZ保护"。不允许匿名用户下载属于"ftp"的文件(即由其他匿名用户上传的文件)。这样上传的文件在成为可用下载之前会得到系统管理员的确认(chown给别的用户)。
- '-S [<ip address>,|<hostname>,] [<port>|<service name>]':仅当服务以独立启动模式启动时有效。接受来自特定IP地址和端口的连接。支持IPv4和IPv6。接受Numeric and fully-qualified的主机名。服务的名字(查看/etc/services)可以用来替代端口号。
- '-T <bandwidth>'和'-t <bandwidth>':设置带宽限制(见下文)。<bandwidth>以KB/s计。设置独立的上传/下载带宽,支持[<upload>]:[<download>]这样的语法。
- '-u <uid>':不允许用户ID号在<uid>以下连接到主机的操作。'-u 1'拒绝访问root(这是安全的)。'-u 100'拒绝访问大多数Linux发行版的虚拟用户。
- '-U <umask for files>:<umask for dirs>':改变文件的创建掩码。默认是133:022。如果你希望上传的文件仅能对上传者可读,使用177:077。如果你希望上传的文件能执行,使用022:022(对其他用户文件仅仅是可读而不能写)或者077:077(文件仅仅对他们的所有者可读和可执行)。请注意Pure-FTPd支持SITE CHMOD扩展,这样用户能改变自己拥有的文件的权限。
- '-V <ip address>':仅允许该特定IP地址的非匿名用户访问。所有的其他地址都只是匿名的。通过这个选项,你可以使用routed IP来作为公共访问,而使用本地IP(类似于10.x.x.x)来管理。你可以使用一个有防火墙保护的置信routable IP,只有它能以非匿名用户登录。
- '-v <name>':为Apple's Bonjour设定服务的名字。仅在编译时支持了Bonjour的MacOS X上可用。
- '-w':仅对验证用户提供FXP协议支持。FXP能和IPv4和IPv6一起工作。
- '-W':支持FXP协议。FXP允许在两台远程服务器不经过终端来传输文件。
然而:
***************************************************8
*FXP是一个不可靠的协议*(第三方主机能够窃取当前连接)。在Pure-FTP已经采取了特定的措施来减少FXP插入攻击。但是要是你的FTP服务器提供的是私有数据:永远不要允许不可信主机的FXP访问。你可以运行可插入性服务,但是不要让匿名Inernet用户以FXP访问。
*******************************************************8
这就是Pure-FTPd默认禁止FXP的原因。你只有用'-w'或者'-W'来激活。
- '-x':在正常的操作模式中,验证用户能读/写以'.'开头的文件,而出于安全考虑匿名用户不行(比如改变标语或者a forgotten .rhosts)。使用'-x'后,验证用户能够下载这些点文件,但不能覆盖或者创建,尽管这些文件属于用户。通过这种方法,你就能防止主机用户弄乱.qmail文件。如果你想让用户能访问特定点文件,创建一个不带'.'的符号连接指向点文件,这样客户端能够通过这个连接来检索该文件。
- '-X':这个标志和上面是一样的(禁止点文件的写操作),但增加了一点,用户甚至不能读以点开头的文件和目录(如"cd .ssh")。
************************************************8
如果开始用了"-a"选项,可信用户组的成员能够忽略'-x'/'-X'的限制。
***************************************************8
- '-y <max user logins>:<max anonymous logins>':该选项仅在编译时使用'--with-peruserlimits'后有效。这限制了同一个用户所能拥有的并发对话的数目。
空值('0')代表无限制。
/usr/local/sbin/pure-ftpd -y 3:20 -c 15 -C 5 -B
这里允许:
* 最多15个对话。
* 从同一IP最多有5个连接。
* 同一个用户最多有3个连接。
* 最多20个匿名用户。
使用这样的设置,单用户将不能轻易占满所有的slot。
- '-Y 0':禁止SSL/TLS加密层(默认)。
'-Y 1':允许标准和机密对话。
'-Y 2':拒绝不能使用SSL/TLS安全机制的连接,包括匿名对话。服务必须在编译时使用--with-tls并且存在正确的证书才能使用这个功能。查看README.TLS文件获得更多关于SSL/TLS的信息。
- '-z':允许匿名用户能读以'.'开头的文件和目录。
- '-Z':保护客户不要犯一些常见错误避免你的技术支持总忙于解决一些愚蠢的小事。现在'-Z'选项能防止你的用户使用错误的'chmod'命令,这将拒绝他们自己访问目录。该选项将来会启用其他的功能。如果你提供主机,打开这个。
如果你更习惯长选项(GNU风格的)而不是标准的,下面的别名也是可用的。你可以随时输入'pure-ftpd --help'来获得这个列表。
--(以标准开关名词汇排序的开关)
-0 --notruncate
-1 --logpid <file>
-4 --ipv4only
-6 --ipv6only
-8 --fscharset <charset>
-9 --clientcharset <charset>
-a --trustedgid <gid>
-A --chrooteveryone
-b --brokenclientscompatibility
-B --daemonize
-c --maxclientsnumber <number>
-C --maxclientsperip <number>
-d --verboselog
-D --displaydotfiles
-e --anonymousonly
-E --noanonymous
-f --syslogfacility <facility>
-F --fortunesfile <file>
-g --pidfile <path to pid file>
-G --norename
-h --help
-H --dontresolve
-i --anonymouscantupload
-I --maxidletime <time (min)>
-j --createhomedir
-k --maxdiskusagepct <percentage>
-K --keepallfiles
-l --login <auth> or <auth>:<config file>
-L --limitrecursion <number:number>
-m --maxload <load>
-M --anonymouscancreatedirs
-N --natmode
-o --uploadscript
-O --altlog <format>:<log file>
-p --passiveportrange <minport:maxport>
-P --forcepassiveip <ip address>
-q --anonymousratio <upload ratio>:<download ratio>
-Q --userratio <upload ratio>:<download ratio>
-r --autorename
-R --nochmod
-s --antiwarez
-S --bind <ip address,port>
-t --anonymousbandwidth <bandwidth (KB/s)>
-T --userbandwidth <bandwidth (KB/s)> or [<up bw>]:[<down bw>]
-u --minuid <uid>
-U --umask <mask>
-v --bonjour <name>
-V --trustedip <ip address>
-w --allowuserfxp
-W --allowanonymousfxp
-x --prohibitdotfileswrite
-X --prohibitdotfilesread
-y --peruserlimits <per user max>:<max anonymous sessions>
-Y --tls <0:no TLS | 1:TLS+cleartext | 2:enforce TLS>
-z --allowdotfiles
-Z --customerproof
--(以GNU风格长开关名词汇排序的开关)
-W --allowanonymousfxp
-z --allowdotfiles
-w --allowuserfxp
-O --altlog <format>:<log file>
-t --anonymousbandwidth <bandwidth (KB/s)>
-M --anonymouscancreatedirs
-i --anonymouscantupload
-e --anonymousonly
-q --anonymousratio <upload ratio>:<download ratio>
-s --antiwarez
-r --autorename
-S --bind <ip address,port>
-b --brokenclientscompatibility
-A --chrooteveryone
-9 --clientcharset <charset>
-j --createhomedir
-Z --customerproof
-B --daemonize
-D --displaydotfiles
-H --dontresolve
-Y --tls <0:no TLS | 1:TLS+cleartext | 2:enforce TLS>
-P --forcepassiveip <ip address>
-F --fortunesfile <file>
-8 --fscharset <charset>
-h --help
-4 --ipv4only
-6 --ipv6only
-K --keepallfiles
-l --login <auth> or <auth>:<config file>
-1 --logpid <file>
-L --limitrecursion <number:number>
-c --maxclientsnumber <number>
-C --maxclientsperip <number>
-k --maxdiskusagepct <percentage>
-I --maxidletime <time (min)>
-m --maxload <load>
-u --minuid <uid>
-N --natmode
-E --noanonymous
-R --nochmod
-G --norename
-0 --notruncate
-v --bonjour <name>
-p --passiveportrange <minport:maxport>
-y --peruserlimits <per user max>:<max anonymous sessions>
-g --pidfile <path to pid file>
-X --prohibitdotfilesread
-x --prohibitdotfileswrite
-f --syslogfacility <facility>
-a --trustedgid <gid>
-V --trustedip <ip address>
-U --umask <mask>
-o --uploadscript
-T --userbandwidth <bandwidth (KB/s)> or [<up bw>]:[<down bw>]
-Q --userratio <upload ratio>:<download ratio>
-d --verboselog
-------------------------设置匿名FTP服务器------------
如果存在'ftp'用户,并且它的主目录可用,Pure-FTPd将接受作为'ftp'或者'anonymous'匿名登录。文件必须定位在主FTP目录。不需要有'bin'、'lib'、'etc'和'dev'目录,也不要外部程序。不要chown公共文件给'ftp'用户,设成可写就行了(输入)。
-------------------------显示标语--------------------
如果'.banner'文件在'ftp'用户主目录中(或者在虚拟服务的根目录中,见下文),在客户端连接进来时会打印出来。在文件放一个有你名字的ASCII艺术Logo。
该文件不能超过4000B,否则不能显示。
在每个目录中,你也可以有个'.message'文件,当客户端进入该目录是会打印它的内容。这种文件可以包含重要信息("不要下载1.7版本,它不完整")。
-----------------------显示cookie-----------------
在最初的登录标语里会打印一条随机的有趣信息。随机的cookie是从一个使用标准'fortune'文件格式文本文件中抽取的。如果你安装了"fortune"包,你会有一个含有二进制文件(xxxx.dat)和文本文件(没有.dat扩展名)的目录(通常是 /usr/share/fortune)。只要在-F选项后加上文本文件名就能使用Pure-FTPd cookie。举个例子:
/usr/local/sbin/pure-ftpd -F /usr/share/fortune/zippy
要是你想使用自己的fortune文件,以下面的结构创建一个文本文件。
Hello... this is the first fortune...
%
Welcome to the real world.
%
Follow the white rabbit.
%
Have fun...
Well... lotsa fun!
%
Yop is good for you.
Goddit?Fortunes在一个单行使用'%'标志来定界。但一个fortune本身可以是多行的(看第四个例子)。
为了安全paranoia,这个文件必须对所有人可读(对这个文件chmod 644是必须的),不然服务器会忽略掉的。
当然了,fortune文件可以只包含一条信息。
----------------------每个用户chroot()规则----------------
除了使用'-a'标记,Pure-FTPd还有另外的方法来调整chroot()规则。我们使用/etc/passwd登录:
mimi:x:501:100:Mimi:/home/mini:/bin/zsh
没有任何规定的话,mini将能够连接进来并且检索文件系统中所有public-readable的文件。我们来把它的主目录改一下:
mimi:x:501:100:Mimi:/home/mimi/./:/bin/zsh
就这个?Mimi的主目录还是那样,而且正常应用不会感到任何不同。但是Pure-FTPd理解"chroot() until /./"。所以当mini下次完成连接时,只有/home/mimi是可达的而不是整个文件系统。如果你不喜欢"-a"和它的置信gid,这是一个好方法来仅给一些用户chroot。另一个窍门是在"/./"之后加点东西:
mimi:x:501:100:Mimi:/home/mimi/./public_html:/bin/zsh
当mimi将要连接进来时,会发生两件事:
- chroot("/home/mimi") 这样mimi只能查看她的主目录。
- chdir("public_html") 这样对话会在public_html目录中开始。然而"cd .."还是允许的。
这种"url风格"的操作对FTP-only用户是特别的便利(那就是没有shell access)。
如果用户是用/./窍门chroot的,并且属于可信用户组(-a),他“将”chroot,但是他仍然没有tatio,而且允许访问点文件。
----------------------RATIOS-----------------------
如果强制要求人们在下载文件之前必须要上传新文件,ratios是为你准备的。这是一个很好的方法在公共FTP服务器上获得很多新资源的方法也是warez trader的必然要求。我不喜欢这种交易,但是呢……Pure-FTPd必须设计来满足所有的人。
激活ratios功能,就使用'-q'选项,例如:
-q 2:5
...意思就是匿名用户必须上传至少2MB的资源,才能下载5MB。
如果ratios要应用到所有用户(匿名和非匿名),用项痛的方法使用'-Q'选项。
注意:'root'不会有ratios。同样要是使用了'-a'或'-A'选项,可信组的用户也不会受'-Q'限制。
---------------------------带宽限制------------------
Pure-FTPd有一个有趣的内置功能:简单的带宽限制。
*你想要限制FTP的吞吐量从而不会因通过该协议上传下载文件而占满你的带宽。
->用--with-throttlin编译Pure-FTPd
->使用'-T'标志加上一个数字运行服务。数字是一个用户在一个一个对话中能使用的最大带宽,以KB/s计。
*你想给与匿名用户较少于验证用户的带宽。这样在带宽紧张的时候,真实用户仍能正常地上传/下载。
->用--with-throttlin编译Pure-FTPd
->使用'-t'标志加上一个数字运行服务。
例:
/usr/local/sbin/pure-ftpd -t 64
不管实际带宽为多少,上传/下载文件不会超过64KB/sec。
*对上传和下载采用不同的限制是可以不同的。'-t'和'-T'确实可以跟着由':'分割的两个数字。第一个为上传带宽,后一个为下载带宽。可以空一个表示无穷大。
例1:上传256KB/s,下载64KB/s
/usr/local/sbin/pure-ftpd -t 256:64
例2:上传256KB/s,下载无限制。
/usr/local/sbin/pure-ftpd -t 256:
例3:上传无限制,下载64KB/s
/usr/local/sbin/pure-ftpd -t:64
不分栏,值应用于两项,因此'-t 64'就是'-t 64:64'的另一种写法。
*当Pure-FTPd提供限制带宽的对话,它的进程优先权提升为10。这样'-t 0'就有意义了:当CPU紧张时,验证用户的对话将比匿名的更可靠。'-T 0'相当没有用,但他也能用,而且对服务进程总是不错的。
*要是你需要更高级的带宽管理,看一下你内核Q.O.S. 功能。
-------------------------------虚拟服务器---------------
使用虚拟服务器是在一代机器上架设多个FTP服务器的好方法,就相当于你有两台电脑。前一个使用'c9x.org'域名,后一个使用'rtchat.com'域名。两个的主机都是头一台电脑,但他们不会共享相同的文件。登录ftp://ftp.c9x.org/显示的内容和ftp://ftp.rtchat.com/是不一样的。
FTP协议不允许基于名字的选择。因此如果你想在一台主机上架设N台虚拟FTP服务并且仍使用标准端口,你必须有N个IP地址。是酱紫的,或者你用HTTP。
给你的网络适配器分配所需的IP地址(用"ifcofig eth0:x"或者"ip addr add dev eth0 a.b.c.d")。
如果目录/etc/pure-ftpd不存在,创建一个:
mkdir /etc/pure-ftpd
增加一台虚拟服务器,你只需要在/etc/pure-ftpd创建一个符号连接从虚拟主机IP地址指向虚拟主机所包含文件的目录。
例:
ln -s /home/customers/rtchat.com/ftp /etc/pure-ftpd/216.226.17.77
ln -s /home/customers/c9x.org/ftp /etc/pure-ftpd/212.73.209.252
好了!把C9X的文件放到/home/customers/c9x.org/ftp/中,而把RTChat的文件放到/home/customers/rtchat.com/ftp/中。
使用这个功能,服务器上的每一个帐户都能拥有自己公共匿名FTP域。如果你提供主机服务,对你的机器来说是个不错的功能。
*注意*:这样意味着你的客户能以1777权限创建"入局"目录。这当然不错,但是会使你的硬盘被warez塞满。你可以使用'-i'选项(或者--anonymouscantupload)禁止给匿名用户上传。
默认情况下,真实和匿名用户都能访问分配给服务器的IP地址。你可以使用'-e'(仅匿名帐号)或'-E'(仅真实帐号)来禁止这样。
更灵活的方法是使用'-V <ip address>'来定义一个"可信"IP地址。当客户端连接到这个可信IP时,匿名和真实帐号均允许连接,但在其他的地址,只允许匿名帐号。
如果你提供主机服务,并且你的客户都有自己的IP地址,给你所有的客户一个可信IP是个不错的方法,这样他们就能在自己的帐号下管理文件。对于所有客户这个IP是相同的。如果你的客户端是静态IP的话,你可以简单地通过防火墙禁止对该Ip的访问。
使用'-V <trusted ip>',并把/etc/pure-ftpd/<customer ip>连接到~customer/ftp。这样每个客户就有单独的只匿名登录的FTP服务器,黑客只有找到那个可信IP才能进来。
------------------------------IPv6支持------------------
Pure-FTPd完美支持IPv6(本地IPv6地址和4-in-6地址)。但是通过super-server,比如Rlinetd或者Xinetd也能使用IPv6协议。最新版本的Inetd应该也行(未证实)。所有地方都支持IPv6:日志、配置开关、虚拟主机、协议(EPSV/EPRT支持)、名字resolution等等。
---------------------------日志---------------------------
日志消息是发送给系统日志监督程序的。你可以用'-f none'来禁止该功能。
要是你想所有的FTP消息都重新写到一个文件中,比如/var/log/ftp。把下面这行加到/etc/syslog.conf文件中:
ftp.* /var/log/ftp
然后重启你的系统日志监督程序:
killall -HUP syslogd
你也可以放弃老的"syslog"和"klogd"程序而使用Metalog,这是一个不错的选择:http://metalog.sourceforge.net/
上传/下载的文件名跟路径一起以下面的方式被记录到日志中:
/home/ftp//pub/bla.jpg
双斜杠'//'是chroot限制。
--------------------------查看当前对话----------------
从0.97.7之后,你可以随时输入'pure-ftpwho'来查看当前活动的对话。
要是输入'pure-ftpwho'的回应是'Command not found',你得把/usr/local/sbin加入到你的PATH环境变量中。
默认的输出像这样:
+------+---------+-------+------+-------------------------------------------+
| PID | Login |For/Spd| What | File/IP |
+------+---------+-------+------+-------------------------------------------+
| 2239 | jedi | 00:17 | D/L | XFree86-clients-4.0.3.tar.gz |
| '' | '' | 41K/s| 33% | -> nestea.funboard.de |
+------+---------+-------+------+-------------------------------------------+
| 2385 | ftp | 00:02 | IDLE | |
| '' | '' | | | -> gw2.crn.kjop.co.uk |
+------+---------+-------+------+-------------------------------------------+
'D/L'表示客户端在下载文件,'U/L'表示他在上传,文件名在下一栏显示。'33%'是当前操作的实时完成情况。'41K/s'是客户端占用的带宽。你可以使用这个来跟踪到底是谁耗尽了你的带宽。
'pure-ftpwho'命令支持一些有趣的选项:
'-c':程序经由web服务器(CGI接口)调用。输出是一个有initial content-type的完整HTML文件。如果环境变量中GATE_INTERFACE,该选项则自动激活。如果你能从支持CGI的web服务器(Apache,Roxen,Caudium,WN……)访问程序的话,这将是默认的。
'-h':摘要显示命令行参数。
'-n':不要显示主机名,仅显示IP地址(快一点)。
'-s':为shell脚本输出一个的简单的可分解格式(不是非常user friendly)。
对每个客户端只有一行,全是用'|'隔开的数值数据。用户可读性较差,但这是为了方便shell脚本分解(剪切/sed)。用户名和文件名中出现的'|'是被转义的('|'变成'/|')。
输入'pure-ftpwho -h'检查一下格式。
'-W':输出完整的HTML页(web模式)。
'-W':输出没有报头和脚注的HTML页。这是嵌入式模式,适合CGI的内联调用、SSI或者PHP脚本。
'-x':为post-processing输出well-formed的XML数据。这是最acurate的模式。时间以秒计,文件大小以B计(在其他一些输出格式中,文件以KB计,可读性更强)。
'-v':文本模式的详细输出。增加的信息包括,上传/下载文件的大小、本地IP或者主机名和连接端口。这对虚拟主机特别有用。下面是'pure-ftpwho -v'输出的一个例子:
+------+---------+-------+------+-------------------------------------------+
| PID | Login |For/Spd| What | File/Remote IP/Size(Kb)/Local IP |
+------+---------+-------+------+-------------------------------------------+
| 9086 | j | 00:04 | DL | linux-2.4.4.tar.bz2 |
| '' | '' | 22K/s| 27% | -> localhost |
| '' | '' | | | Total size: 20859 Transfered: 5632 |
| '' | '' | | | <- localhost:21 |
+------+---------+-------+------+-------------------------------------------+
--------------------------上传之后--------------------
在成功上传之后,任何的外部程序或者shell脚本可以以新上传文件的文件名作为参数运行。你可使使用该功能在新文件上传完之后自动发送邮件。或者你能让它通过moderation系统,杀毒程序,MD5码生成器或者任何你想来处理这个文件的程序。
支持这项功能,服务器在编译时需要用--with-uploadscript配置。上传脚本不能在不可读目录中执行。因此强烈建议加上--custmerproof运行时选项来使用上传脚本并不要用不可读的上级目录。
通知FTP服务器来使用上传脚本,必须通过'-o'选项运行。最后,你得运行运行另一个由该程序包提供的叫做'pure-uploadscript'的后台程序。
重要:
你必须先运行Pure-FTPd然后运行Pure-uploadscript,反过来就不行。
出于安全考虑,FTP服务器不能运行任何外部程序。这就是为什么要有一个独立的后台程序,它从FTP服务指定的管道获得新上传信息。上传后的处理是同步和连续的。这样在负荷重或者不可信的服务器上执行过长或者消耗CPU的脚本就不是很明智了。
运行pure-uploadscript最简单的方法是'pure-uploadscript -r <script>':
/usr/local/sbin/pure-uploadscript -r /bin/antivirus.sh
新上传文件的绝对路径是作为第一个参数的,一些环境变量里是一些有趣的值:
- UPLOAD_SIZE : the size of the file, in bytes.
- UPLOAD_PERMS : the permissions, as an octal value.
- UPLOAD_UID : the uid of the owner.
- UPLOAD_GID : the group the file belongs to.
- UPLOAD_USER : the name of the owner.
- UPLOAD_GROUP : the group name the file belongs to.
- UPLOAD_VUSER : the full user name, or the virtual user name. (127 chars max)
"pure-uploadscript"也有一些选项:
- '-u <uid>'和'-g <gid>':选择pure-uploadscript以哪个帐号运行。脚本会以同一身份执行。
- '-B':在后台派生。
请查看一下man('man pure-uploadscript')获得额外的信息。
---------------目录列表---------------------
内置的'ls'支持正规'ls'的所有命令选项。
这里有些为了你更好使用FTP而应该知道的:
- '-l': 完整的列表,报告数据、用户、权限,大小。
- '-a': 也列出以'.'开头的文件。
- '-F': 在目录名名字之前加上一个'/'。
- '-d': 列出目录本身而不是他的内容。
- '-R': 循环列表。
- '-S': 以文件大小分类。
- '-t': 以数据分类。
- '-r': 颠倒排列次序。
要是你对Unix不熟悉,用下面的变量连接到你的FTP服务器:
ls
ls -F
ls -l
ls -la
ls -lR
ls -Sl
ls -Slr
ls -tl
ls -tlr
也能支持globbing。你可以通过下面的方法在目录中查找/gnome-xxxxxxx.rpm:
ls */gnome*.rpm
-------------------------------虚拟配额-----------------
使用虚拟配额,你能限制用户目录中最大的文件数和总大小。
这些配额是虚拟的,因为他们不是内核级的管理,而是FTP服务器自己的。跟内核配额相比有如下优点:
- 虚拟配额是FTP服务器特定的。在同一个分区中,你可以用不同的系统配额来管理别的文件(比如邮件)。
- 可以对每个用户应用不同的虚拟配额,甚至他们共享相同的系统用户ID号。
然而,虚拟配额会慢一点,而且不可能和内核配额一样可靠。所以基本上别相信它,可能会由于竞态而被忽略。用户目录所在的文件系统也得能正常支持文件锁定。
虚拟配额在Pure-FTPd中由一个简单的叫做'.ftpquota'的文件实现,它在chroot用户的主目录中。这个文件只包含两个数字:该用户当前的文件数和该目录的总大小(包含子目录),以B计。当新文件上传/删除时,两数字相应变大/减小。很简单,当虚拟配额对用户激活时,该用户必须是:1)chroot,2)不允许写配额文件,3)不允许禁止访问一些目录来欺骗计数器。
配额可以用'-n'选项对所有用户激活。选项后跟着最大文件数和最大大小(以MB计)。所有的用户将使用相同的配额,除了激活'-a'选项后的可信组成员。
要是你使用PureDB或者SQL数据库,你可以给每个用户设置不同的配额。查看"README.Virtual-Users"文件来获得更多关于PureDB数据库的信息。
比如希望对所有的客户为最大1000个文件和10MB大小,这样运行服务:
/usr/local/sbin/pure-ftpd -n 1000:10
".ftpquota"文件如果丢失,将由系统守护程序创建。然而,当文件创建时,服务器会假设其计数器为空。如果实际并不是这样的话,你得运行"pure-quotacheck"公用程序来创建一个初始的".ftpquota"文件。
"pure-quotacheck"是一个计算目录的大小和文件数并创建包含该信息的".ftpquota"文件的工具。
语法是这样的:
pure-quotacheck -u username/uid -d home directory [-g group/gid]
举个例子,要是你想总结目录/home/ftpusers/john的使用情况,它的文件是属于"ftpusers"系统帐户的,这么运行:
pure-quotacheck -u ftpusers -d /home/ftpusers/john
你可以随时运行pure-quotacheck,甚至".ftpquota"文件已经存在了。in crontab这么做是个不错的主意,这样即使出点错(系统Bug,文件系统讹误,强行结束服务等)所存储的配额将总是正确的。
传统的配额里,达到硬性限制后,将不可能再写入新文件。这对快速创建的文件(本地文件系统上的操作)不错,但对经由网络传输的文件无效。
虚拟配额以一种有点奇怪但很方便的方法工作。当用户开始上传时,新上传的文件能和他的总配额一样大。意味着,如果他的配额是10MB,就算他已经使用了目录了9MB空间,仍能上传10MB的文件。这样当他在上传文件的时候可以意识到他将超过配额,这样他能在上传结束前移动/压缩/删除其他文件来腾出空间。仅当上传完成后才检查配额,而如果仍然超过配额,新上传的文件将被删除。
------------------------注意---------------
Pure-FTPd支持多种用户验证方法。你得把要使用的方式编译进服务中(查看./configure的选项)。
- 采用Unix用户验证(传统/etc/passwd文件),在服务运行时加上下面的选项:
-l unix
- 采用PAM用户验证,加上这个:
-l pam
- 采用PureDB(虚拟用户),加上这个:
-l puredb:/path/to/puredb_database
(查看README.Virtual-Users获得更多关于PureDB索引文件的信息)
- 采用LDAP目录,加上这个:
-l ldap:/path/to/ldap_config_file
(查看README.LDAP获得更多关于LDAP目录的信息)
- 采用MySQL数据库,加上这个:
-l mysql:/path/to/mysql_config_file
(查看README.MySQL获得更多关于MySQL数据库的信息)
- 采用Postgres数据库,加上这个:
-l pgsql:/path/to/postgres_config_file
(查看README.PGSQL获得更多关于Postgres数据库的信息)
- 采用外部用户验证管理器(with pure-authd),用:
-l extauth:/path/to/authd/socket
(查看README.Authentication-Modules获得更多关于外部用户验证的信息)
多种用户验证方式可以结合在一起。比如你可以这样运行服务:
/usr/local/sbin/pure-ftpd -lldap:/etc/pureftpd-ldap.conf /
-lpuredb:/etc/pureftpd.pdb -lunix
每种方法按顺序验证。根据上面的命令行,LDAP目录将先被探查。如果该目录中没有发现用户,将在PureDB数据库中扫描相同的用户名。要是该用户还没找到,扫描/etc/passwd。
如果在LDAP目录中找到该用户,但是密码错误,后面的验证方式将被跳过。
如果不指定'-l'选项,要是编译时选择了支持PAM,默认就是PAM,否则就是默认Unix方式。
-----------------------目录别名---------------
目录别名支持'cd'命令的缩写。比如,要是你定义了"picture"为"/usr/misc/pictures"的别名,当用户输入"cd pictures"且并不存在"pictures"目录时,将自动改向到"/usr/misc/pictures"。跟符号连接不同的是,"cd pictures"可以在任何目录中使用。Tildes are *not* expanded.
用户可以通过下面的命令来获得可用别名的列表:
SITE ALIAS
要支持该功能,必须在./configure中用--with-diraliases编译服务。
定义别名/目录对,必须创建明威/etc/pureftpd-dir-aliases的文件,格式如下:
轮流的别名和目录行
(this enables embeded whitespace in dir and alias without quoting rules)
可选的空行
可选的以'#'开头作为注释的行
例:
pictures
/usr/misc/pictures
sources
/usr/src
# This is for the OpenBSD port tree
pureftpd-port
/usr/ports/net/pure-ftpd
-----------------------特权分离-------------------
特权分离激活后,每个对话产生两个进程:一个以root权限运行的"特权"进程,但只能进行一些很简单和可信的动作(绑定端口和移除ftpwho的记录),还有就是"终端"进程。在用户验证和chroot()之后,"终端"进程肯定取消所有的特权,并且通过私有通道和父进程实时通信。
特权分离降低了loaded服务器的性能,但增强了理论上的安全性。
一些老的broken操作系统可能是允许取消了特权的进程ptrace()系统调用。在那些平台上,激活特权分离对那些不可信但拥有shell访问权的用户不是很好。用src/ptracetest程序测试一下。至少Solaris、ISOS、MireBSD、OpenBSD、FreeBSD和Linux已知是安全的。
------------------------CHARSETS(RFC2640)--------------------
从1.0.21版开始,Pure-FTPd实验性地支持charsets转换。服务器文件系统可以使用和终端假想不同的charset,并且Pure-FTPd通过iconv库传输文件名。
一些先进的终端比如lftp会在服务器支持的情况下使用UTF-8。
这样,charsets转换在处理包含非英文字符文件名的时候会非常有用。
要支持这点,Pure-FTPd必须如下编译:
./configure ... --with-rfc2640
由于需要conv库,该功能不是默认支持的。
然后服务启动时得加上--fscharset=<charset>。将<charset>换成服务器文件系统的charset。举个例子:
/usr/local/sbin/pure-ftpd --fscharset=ISO-8859-15
对于能支持UTF-8的终端大多能正常使用了。
非强制性的,你也可以用--clientcharset列出终端默认的charsets:
/usr/local/sbin/pure-ftpd --fscharset=iso-8859-15 --clientcharset=big5
------------------对高负荷系统的优化-----------------
如果你在高负荷服务器上使用Pure-FTPd,给你一些获得最佳性能的提示:
- 这么编译:
env CFLAGS="-O2 -fomit-frame-pointer -fgcse -Os" ./configure --with-minimal --without-inetd --without-pam
make install-strip
- 以独立启动模式运行。不要用'-C',不要激活pure-ftpwho以及pure-uploadscript (-o)和per-user limits (-y)。
- 增加系统的最大描述符的个数和本地端口范围。在linux内核可以这么做:
echo 2000 > /proc/sys/fs/super-max
echo 60000 > /proc/sys/fs/file-max
ulimit -n 60000
echo 30000 65534 > /proc/sys/net/ipv4/ip_local_port_range
- 在Linux内核上,禁止syncookies、ecn、时间戳和窗口缩放:
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
echo 0 > /proc/sys/net/ipv4/tcp_ecn
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
- 在你挂载的文件系统上禁止记载更新时间。在Linux系统上,在/etc/fstab文件尚未每个挂载点加上'noatime,nodiratime'。
- 禁止系统日志记录和DNS查询。这么运行:
/usr/local/sbin/pure-ftpd -f none -H
对FreeBSD,DJ_Oggy推荐使用如下设置:
>>> QUOTE:
Drop into single user mode (do a shutdown now or boot -s) and enter
tunefs -n enable <filesystem>
i sugest / /usr /var
In /etc/fstab add ",noatime" to the options of all filesystems.
In /boot/loader.conf add the following:
hw.ata.wc="1"
kern.ipc.nmbclusters="60000"
In /etc/sysctl.conf add the following:
vfs.vmiodirenable=1
kern.ipc.maxsockbuf=2097152
kern.ipc.somaxconn=8192
kern.ipc.maxsockets=16424
kern.maxfiles=65536
kern.maxfilesperproc=32768
net.inet.tcp.rfc1323=1
net.inet.tcp.delayed_ack=0
net.inet.tcp.sendspace=65535
net.inet.tcp.recvspace=65535
net.inet.udp.recvspace=65535
net.inet.udp.maxdgram=57344
net.local.stream.recvspace=65535
net.local.stream.sendspace=65535
give it two asprin, a reboot and call me in the morning!!!!!
<<< END OF QUOTE
--------------------已知问题-----------------
- 在非Linux系统,'-c'只能在独立启动模式中生效。
- 避免在登陆名中使用空格:分解日志文件的应用程序经常会因为这点出问题。
- 在Solaris(至少Solaris 8),large files和virtualchroot不能同时编译(需要用struct stat64代替stat everywhere)。
- 在Solaris平台,让Pure-FTPd下能使用chroot,需要在新rootdir下有dev目录,包含如下:
crw-rw-rw- 1 root other 11, 42 Dec 10 15:02 tcp
crw-rw-rw- 1 root other 105, 1 Dec 10 15:02 ticotsord
crw-rw-rw- 1 root other 11, 41 Dec 10 15:03 udp
crw-rw-rw- 1 root other 13, 12 Dec 10 15:03 zero
否则就会这样:
ftp> ls
425 Can't create the data socket: Bad file number.
如果你所有的用户都chroot,你得在每个主目录下都创建这些文件,这么做:
mkdir dev
mknod dev/tcp c 11 42
chmod 0666 dev/tcp
mknod dev/udp c 11 41
mknod dev/zero c 13 12
mknod dev/ticotsord c 105 1
(由Kenneth Stailey报告)
- 拒绝ASCII续传。ASCII传输是个地狱,因为终端和服务器都要消耗大量CPU时。而且比二进制传输消耗更多的带宽。但允许Windows终端上传脚本到Unix服务器,剥离这些讨厌的^M记号。Pure-FTPd中是能实现ASCII传输的,但故意设定成不允许续传。当重新开始ASCII传输时,文件必须得一字节一字节的读取和处理。发送两条小命令都要消耗很长时间,一个终端就能搞垮一个服务器(消耗了大量CPU和磁盘资源)。并且没有工作区。
还有就是如果RFC描述一种ASCII续传的方法,终端和服务器而以另外的方法实现,ASCII续传会导致数据讹误。一些主要服务不遵守RFC,这样一些终端也犯同样的错误来支持这些服务,同时其他一些先进的终端和服务器都正试着完全遵守RFC。所以当终端和服务器都说同样的方言的话就行。要不是这种情况,你得到的就是讹误的文件,恶心伐啦?假设客户上传一个脚本到服务器上,觉得已经能从自己的硬盘中安全删除了,要是远程文件讹误了,他会非常的恼火。
这就是为什么Pure-FTPd拒绝ASCII续传。要是客户告诉你他不能上传/下载不完整的ASCII文件,让他移除不完整的文件再重新传输。这是一项安全设置。
-----------------------下载Pure-FTPd----------------------
Pure-FTPd主页是:http://www.pureftpd.org。
Pure-FTPd邮件列表:http://www.pureftpd.org/ml/
要是你有问题、建议或者patch,直接按邮件列表发过来就行了。也欢迎新手和一些低级的问题。
谢谢。
-Frank DENIS "Jedi/Sector One" <j@pureftpd.org>
*请阅读CONTACT文件*
By 传说的鱼<suxiaodan@gmail.com>