下面是自己翻译的Pure-FTPd的官方FAQ。再次声明我不是学计算机的,专业术语不是很懂。如有错误,敬请指正。
有什么建议的话可以给我发邮件
作者:def03@mails.tsinghua.edu.cn

1、用户可以删除属于root的文件?

Q:我有一个属于"john"的文件夹,不过我放进了一些属于"root"(或者其他用户)的 文件.然而,我发现John可以删除这些文件!

A:是的,这时标准的Unix行为:文件夹的所有者可以在他的文件夹内为所欲为,无 视文件的所有者。如果你希望有不可变的文件,检查操作系统有没有这样的功能。

例如,在linux操作系统、ext2/ext3文件系统上,用"chattr +i "就可以实 现这种目的。在BSD系统上,试试"chflags schg "。

2、多用户共享的文件夹

Q:我有一个“public”文件夹。所有的用户动可以在此文件夹内下载、上传。文件 夹中文件的权限是777.不过,用户“john”可以删除属于用户“joe”的文件。怎么避免这种事情发生?

A:对文件夹进行如下操作:chmod 1777 public。这样,文件夹仍是公共的(可写 、可读),但只有文件所有者才可以删除文件。

3、限制文件夹的可见性

Q:我希望人们只能看到自己的主目录和自己的文件,而不希望他们看我的系统文件 。

A:这个功能叫做“chroot”。你可以带着“-A”选项运行pure-ftpd来启动这个功 能,就可以对所有的非root用户进行限制。

你也可以选择“-a ”来设置“受信组”。出了这个组中的成员,其他的用户 都受到限制。

不要同时使用-a 和 -A。

另外一种方法是选定你希望chroot的用户。可以用“/./”的技巧(参考README 文 件)或者虚拟用户来实现。

4、共享的文件夹和chroot

Q:我有一个文件夹,假设叫/var/incoming。我希望每个用户都可以共享这个文件夹。但我希望每个用户都被chroot。所以,/var/incoming应该在“joe”和“john” 的帐户可见,但他们已经被chroot了。这样,怎么使/var/incoming对这些账户可见?

A:建立符号链接并不起作用,因为一旦被chroot,就意味着在基础文件夹(用户的 主目录)之外的任何东西–包括符号链接–都不可访问。

不过所有的现代的操作系统都支持把本地目录挂载到几个不同的位置。要使/home/john/incoming和/home/joe/incoming都有/var/incoming的副本,可以使用下列命令:

* Linux   : mount --bind /var/incoming /home/john/incoming
            mount --bind /var/incoming /home/joe/incoming
* Solaris : mount -F lofs /var/incoming /home/john/incoming
            mount -F lofs /var/incoming /home/joe/incoming
* BSD     : mount_null /var/incoming /home/john/incoming
            mount_null /var/incoming /home/joe/incoming

警告:FreeBSD的mount_null已经损坏,而且会导致低于4.4的发布版FreeBSD系统的内核崩溃。

另外一个解决方法是重新编译Pure_FTPd,在./configure时,加上–with-virtualchroot。使用虚拟chroot,指向在chroot文件夹外面的文件的符号连接也可以达到。在二进制包中,这个功能已经启用。

5、Tar 和/或 gzip不工作

Q:能不能像在Wu-FTPd中一样使用“get directory.tar”命令?(Sven Goldt)

A:很不幸,不能。服务器建立gzip/tar既不是已经存在的功能,也不是计划中的功 能。对Wu-FTPd和BSD ftpd的严重的安全漏洞,这个功能难逃责任。此功能占用了大量服务器资源(可以导致拒绝服务式攻击)。它也不容易建立(chroot环境⇒需要 添加/etc/lib/bin文件夹,在某些平台上添加/dev,等等)

6、如何限制对点文件的访问?

Q:有没有防止人们访问“.”文件/文件夹(像.bash_history, .profile, .ssh …)的选项,即使这些用户是文件的所有者?(William Kern)

A:有。“-x”(–prohibitdotfileswrite),防止用户对点文件的写/删除/改变权限/重命名操作,即使用户拥有这些文件。不过,这些文件仍然可以列出,因为企图通过故意把事情搞的模糊不清来保障安全是非常愚蠢的,而且软件也不该欺骗用户 。不过,用户不能改变文件的内容。 同样,你也可以选用“-X”(–prohibitdotfilesread)选项,这样,用户就无法读 取点文件,也无法进入以点开头的文件夹。

7、日志文件

Q:日志信息记录到了哪里?怎么把日志导入一个特定的文件?怎么停止日志记录?

A:日志信息发送到系统日志守护精灵。系统日志守护精灵通常叫做“syslogd”或“syslog-ng”。这个守护精灵负责从不同的程序中按照设备(范围)和优先级(紧急程度:debug, info, warning, error, critical…)把日志事件发送到日志文件 。

Pure-FTPd的日志信息默认和“ftp”工具发送(在一些没有“ftp”工具的老系统上,是“local2”).

除非你告诉syslogd把带有"ftp"的信息重新导入特定的文件,这些信息就会被传送到 /var/adm/messages, /var/log/messages,/var/adm/syslog 或 /var/log/syslog

检查/etc/syslogd.conf,其中应该有一行类似于:

*.*;mail.none;news.none -/var/log/messages

只要加上ftp.none:

*.*;ftp.none;mail.none.news.none -/var/log/messages

如果希望FTP信息写入一个特定的文件,只要加上:

ftp.* /var/log/ftp

所有的FTP信息都会写入/var/log/ftp.这些信息只会到这儿.

可以给pure-ftpd添加-f <工具名称>(或者–facility=<工具名称>)选项来改变所使用的工具

要完全禁止日志,使用 -f none (或–facility=none).如果你从来不读log文件,推 荐这样做:这样会增进服务器的性能表现,减少磁盘的I/O.

8.如何防止分区被填满?

Q:在磁盘快满的时候,可以禁止上传吗?(Cyberic)

A:使用"-k" (–maxdiskusagepct)标志.如果你加上 -k 95,在分区已经充满了95%时,就无法进行新的上传.

9.防火墙

Q:我的FTP服务器在防火墙后面.我应该开什么端口?

A:首先,打开连向FTP服务器的21端口.此外,应该允许来自⇐20端口到任何地方的连 接.这样就足以应付"主动"模式.不过这还不足以处理所有类型的FTP客户端.大部分 客户端会使用另外一种传输数据的模式,叫做"被动"模式.这种模式比"主动"模式安 全一点,不过要让它工作,你得在防火墙上开更多的端口.

因此,打开一些连向FTP服务器的端口.这些端口应该大于1023.推荐你打开的端口数 目为你期望的最大客户数目的两倍以上.如果你打算接受200个并发会话,打开端口50000–50400就够了.

然后,带着"-p"选项运行pure-ftp,后面加上在防火墙上设置的端口范围.

例如:

/usr/local/sbin/pure-ftpd -p 50000:50400 &

与通常的观念不同,为被动FTP开的端口越多,FTP服务器就越安全,因为这样就更不容易遭到数据窃听.

如果你的防火墙也做网络传输(NAT),就得为了所有的被动端口向前启用端口(enable port forwarding for all passive ports.)

在客户端一方,如果客户端在防火墙后面,防火墙必须理解FTP协议.在Linux防火墙(iptables)上,只要加载ip_conntrack_ftpip_nat_ftp 模块.在OpenBSD, ISOS 以 及FreeBSD 5防火墙(PF)上,重定向所有传输到端口21,到ftp代理.

10.无法登录(Unix验证)

Q:我使用简单的Unix验证.没有PAM,没有puredb,没有MySQL,没有LDAP.匿名FTP服务 运行正常,但我不能以其他用户登录.系统总是说"验证失败".

A:要登录,分配给用户的shell必须在/etc/shells 文件中列出.即使使用假的shell(像/etc ,/bin/true),也应该有精确的路径.

另外,重新检查一下在/etc/shells文件的最后一行是否是以回车结尾.

11.网络文件系统

Q:在Linux或者FreeBSD上,我有一个奇怪的问题.上传文件运行正常,但下载文件却只产生0-byte的文件.在服务器上,这些文件存在 NFS/Novell共享/Appletalk共享/Coda/Intermezzo/SMB卷.

A:默认情况下,pure-ftpd使用零拷贝网络来增加通过能力,减少CPU负荷.但零拷贝并不能在所有的文件系统上运行,特别是网络文件系统.

要想在网络FS或者TMPFS虚拟磁盘上提供文件服务,必须禁用零拷贝.

要禁用零拷贝,带选项,./configure –without-sendfile,重新编译pure-ftpd.

12. Solaris 和chroot.

Q:当我通过ftp连接到我的Solaris服务器时,运行"ls"命令得到的是这样的回答:

"425 Can't create the data socket: Bad file number."

A:在Solaris上,要让chroot在pure-ftpd上运行,在新的root目录需要包含下列文件 的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

( Kenneth Stailey 报告)

13.升级

Q:有人能解释一下怎么升级PureFTPd(从源代码),而不用改变所有的设置等等?(Simon H)

A:

1)获得源代码,解包.
2)加上你的喜好的选项运行./congigure
3)make
4) rm -f /usr/local/sbin/pure-ftpd
5) make install-strip
6)如果你从inetd,tcpserver,xinetd上运行pure-ftpd,那就什么都不必做.已经升级成功了.
7)如果你以standalone模式运行,停掉服务器:
kill $(cat /var/run/pure-ftpd.pid)
然后重启:
/usr/local/sbin/pure-ftpd &

14.OpenBSD,ISOS,EkkoBSD和MacOS X

Q:我想在OpenBSD上运行Pure-FTPd.守护进程在运行,但是无法连接:在端口21收不到任何回应.

A:OpenBSD故意拒绝在一个单独的socet监听IPv4和IPv6连接.Pure-FTPd运行在OpenBSD上时,默认只监听IPv6连接.在最近发布的ISOS,EkkoBSD和MavOS X上,情况类似.

要监听IPv4地址,应该加上'-4'选项运行pure-ftpd:

/usr/local/sbin/pure-ftpd -4&

15.通过SSH进行FTP

Q:怎么通过SSH运行Pure-FTP?我想加密所有的连接数据(包括密码)

A:通过SSH运行FTP比通过SSL运行FTP要好(后者在安全的防火墙内无法使用),也比SFTP好(较慢,但只使用一个端口)

使用Windows的客户可以使用Van Dyke's SecureFX客户端–一个极好的客户端–来 通过SSH访问FTP.这不需要任何特殊的知识:只要在为FTP服务器建立账户时,告诉客 户去在"协议"列表框内检查"FTP-over-SSH2".

至于服务器一边,下面是如何管理通过SSH进行FTP的账户

1)在/etc.shell文件中添加/usr/bin/false (在某些系统内,可能是/bin/false)

2)要建立通过SSH进行FTP的账户,建立一个以/dev/null为主目录、/usr/bin/false 为shell的系统账户。不需要专用的UID:每个通过SSH进行FTP的账户都可以重复使 用相同的uid

3)为用户创建虚拟用户(使用PureDB,SQL或者LDAP)。给虚拟用户一个真实的主 目录,只允许从127.0.0.1来的连接(所有的通过SSH进行FTP的会话都来自本地主机,这是由于SSH管道的原因)

没有主目录(/dev/null),没有有效shell的用户无法得到shell,不能在服务器上运行任何命令。但他们可以有通过SSH进行FTP的会话。 下面是一些例子(Linux/OpenBSD/ISOS命令,如有必要,可以改变)

1)创建一个常规的FTP账户:

pure-pw useradd customer1 -m -d /home/customer1 -u ftpuser

2)建立一个通过SSH进行FTP的账户(拒绝非加密的会话)

useradd -u ftpuser -g ftpgroup -d /dev/null -s /usr/bin/false customer2
pure-pw useradd customer2 -m -d /home/customer2 -u ftpuser -r 127.0.0.1/32

3)建立一个账户.该账户在内网(192.168.1.x)可以使用常规的(非加密的)FTP,但在 外网(internet)必须使用SSH连接FTP.

useradd -u ftpuser -g ftpgroup -d /dev/null -s /usr/bin/false customer3
pure-pw useradd customer3 -m -d /home/customer3 -u ftpuser \
-r 127.0.0.1/32,192.168.1.0/24

16.虚拟用户:/etc/pureftpd.pdb

Q:我改动了/etc/pureftpd.passwd,但服务器并不理解:我不能访问任何刚刚创建的 账户.

A:服务器从来不直接读取/etc/pureftpd.passwd.实际上,它读取的是/etc/pureftpd.pdb.(或者是你在-lpuredb 后面给出的文件).

这个文件是/etc/pureftpd.passwd的一个副本,但是二进制格式的,为快速查询做了 优化.

在手工修改/etc/pureftpd.passwd后,应该用下面的命令重建/etc/pureftpd.pdb:

pure-pw mkdb

如果你用pure-pw useradd/usermod/userdel/passwd添加/删除/修改了用户账户,不要忘了用"-m"选项来自动重建,而不是只升级/etc/pureftpd.passwd.

17.允许访问点文件

Q:我不希望用户读取以点开头的文件.不过,有一个文件我希望给"Iohn"可读(可能是可写)的访问.

A:在John的账户内建立一个符号链接,指向点文件.例如:

ln -s .bashrc bashrc

John可以通过"bashrc"符号链接访问".bashrc".

18.初始标语

Q:如何在出现登录提示符之前显示定制信息?

A:加入–with-cookie,重新编译服务器;加上-F <文件名>,运行服务器.在文件中,放入你喜欢的定制标语信息.

19.Internet Explorer.

Q:Internet Explorer显示登录对话框.

A:IE用一种很古怪的方法来检查FTP服务器是否接受匿名连接.基本上,IE连接服务器,以"anonymous"登录.如果此时你回答"不能登录",连接就出错,断开.你必须回答"可以登录,允许匿名用户",然后,当伪密码("IE@")发送过来时,你得说"呃,这个……最后……实际上不允许匿名登录".够蠢的啊!要玩这个游戏,运行pur-ftpd时要加上-E(非匿名服务器)和-b(与受损的客户端兼容).然后,那个神奇的对话框就会弹出.不过 注意,IE(还有大部分浏览器)通常是拙劣的FTP客户端.

20.IE不能登录FTP

Q:Internet Explorer无法登录(Matthew Enger)

A:检查每用户最大连接数或者每IP最大连接数至少是2.IE需要至少2个连接来连接FTP服务器.

21.密码和pure-pw脚本

Q:我想用shell脚本建立虚拟用户.如果使用pure-pw useradd…..它总是要新密码,有没有命令行选项可以告诉pur-pw密码(类似useradd ftp-user ftp-password -m)?(atlce)

A:通过命令行选项给出明文(或者不良的单向加密的)密码并不是好想法.因为用户可以使用简单的"ps"命令来发现这些密码.

一种输入密码(不通过键盘)的方法是在一个临时文件内输入密码两次,然后重定向文件到标准输出.例如:

pure-pw useradd john -d /tmp/john -u ftpuser -m < ~/tmp/passfile

在文件~/tmp/passfile中,有类似下面的东西:

john's password
john's password

如果你真的要避免使用临时文件,而且除了你以外没有人能登录计算机,也可以这样 做:

(echo blahblah; echo blahblah) | pure-pw useradd john -d /tmp/john -u ftpuser

22.改编日志格式和pure-uploadscript不能正常工作.

Q:pure-uploadscript什么东西都不运行.改编日志的格式(CLF,stats,W3C…)产生 了一个日志文件,但是总是空的.

A:可能是由于你的操作系统的realpath()工具有bug.有些老的Solaris和Linux版本 有这种bug.

试试加上–with-brokenrealpath选项运行./configure,然后重新编译pure-ftpd.

23.服务器启动了,但没有监听任何端口?

Q:服务器运行完全正确,可以看到进程列表,但任何试图连接设定的端口(或者默认的端口21)的尝试都失败了.socket甚至都没有打开.

A:检查两件事:

-如果你运行BSD系统,想监听IPv4地址,检查"-4"选项(配置文件中的"IPV40nly")是 否启用.

-如果你启用了上传脚本("-o",或者"CallUploadScript"),确认启动了pure-uploadscript.否则FTP服务器实际上在等待,直到pure-uploadscript已经准备好处理新上传.如果你不需要uploadscript设备,就移除"-o".

24.双斜杠

Q:为什么我在日志文件中看到双斜杠?例如,下载的文件的路径为/home/johnpictures/zok.jpg . A:""是chroot jail限制的标志.在这个例子中,意味着John被限制在/home/john.

25.Windows移植

Q:Pure-FTPd可以在Windows上运行么?

A:可以.在http://www.pureftpd.org/windows/有移植版本.但这个服务器是在Unix 上开发的,Win32版本只是实验性的,没有支持.

26.以非root用户运行ftpwho

Q:怎么才能使非root用户访问"pure-ftpwho"命令?

A:默认情况下,"pure-ftpwho"是受限制的,只能由root运行,因为用户不应该有能力 去偷窥别的用户在同一台主机上做的事情.不过,在命令上加上setuid bit是安全的,这样它就可以被任意用户使用:

chmod 4711 /usr/local/sbin/pure-ftpwho

27.运行中改变带宽限制

Q:能否在用户传输的时候改变带宽分配,改变立即生效?

A:很不幸,不能.至少在pure-ftp这一级上办不到.这样做就得需要不停的重新读取用户参数,这样太慢了.其他的机制可能会运行,比如发送信号中断传输,重新读取参数,然后续传.不过这样会增加代码的复杂度.

如果你使用如OpenBSD, ISOS 或Linux之类的现代操作系统,内核里就包含了一个非常好的TCP/IP传输控制器。因为它工作在内核水平,所以你可以轻易的在运行时改 变允许某些IP或服务占用的带宽。在OpenBSD, ISOS或FreeBSD 5上,看看文件pf.conf,在Linux上,看看tc,或者读一下linux networking how-to。

另外,可以参考文档后面的“全局带宽限制”章节。

28.作为验证方式,KERBEROS_V4被拒绝

Q:验证可以运行,我也可以登录。但是即使实在非chroot环境,在登录时也收到这 些奇怪的错误信息:

220 FTP server ready.
502 Security extensions not implemented
502 Security extensions not implemented
KERBEROS_V4 rejected as an authentication type

这是什么意思?

A:这是Linux特有的安装问题。意思是你用的不是正常的命令行FTP客户端,而是KerberosFTP客户端。你可能安装了Kerberos的EPM包,尽管你没有使用Kerberos。这个信息是无害的,因为在出错信息后,Kerberos客户端会退化为正常的FTP。如果你想ftp工作时不显示这些信息,就得在客户主机上删除Kerberos。

29.错误的组所有权

Q:我有一个叫做“john”的用户,其所在的组为“johngroup”。当John上传了一个文件后,文件属于John,但是却属于另外一个叫做"wheel"的组(而John不是这个组的 成员).这是怎么回事?

A:这是BSD的标准行为(在OpenBSD, ISOS, DragonflyBSD和FreeBSD上确认过):当新文件创建时,所属的组从父文件夹继承。在其他系统上(像GNU/Linux),文件属于用户的首要的组,除非这个目录的setgid位被置位了。

如果你想让上传到John的文件夹中的新文件属于组“johngroup”,就让文件夹(可能还有子文件夹)属于“johngroup”:

chgrp -R johngroup /home/john

30.加上MySQL编译

Q:我加上MySQL编译时不能通过。./configure 说MySQL库没有正确安装。

A:libmysqlclient.so文件应该在动态连接程序的已知路径中。例如,在GNU/Linux 系统,添加libmysqlclient.so文件的路径到/etc/ld.so.conf(仅仅是路径,不是 文件本身),然后重新运行“ldconfig”

31."对不起,我不信任你."("Sorry, I can't trust you".)

Q:当客户试图登录时,得到的信息是“Sorry, I can't trust you”。不过他的用 户名、密码都是对的。这是怎么回事?

A:这个信息可能有两种意思:

-用户的shell在/etc/shell中没有列出。即使这个shell是个假的,像/bin/false,也得在/etc/shell中加上。同时,确认在/etc/shells最后一条记录后面有回车。

-你使用了-u 选项,拒绝uid小于的用户的访问。不过想要登录的用户的uid在禁止范围内。

32.对客户友好的设置

Q:对于主机服务,你推荐启动服务器时加上哪些选项?

A:这是个比较好的启动选项

--chrooteveryone \
--maxclientsperip=5 \
--displaydotfiles \
--noanonymous \
--minuid=100 \
--umask=022:022 \
--limitrecursion=10000:3 \
--customerproof

33.使用虚拟用户的匿名服务器

Q:我成功的创建了一个叫“ftp”或者“anonymous”的虚拟用户,但匿名服务器不 工作。

A:Pure-FTPd从来不为匿名会话从虚拟用户后端(puredb,MySQL, LDAP等等)获取任何信息。不这么做有三个原因:

速度:需要为了匿名用户的主目录查询数据库吗?不需要为匿名会话检索任何密码。

一致性:与虚拟主机机制保持一致

要运行匿名FTP服务器,需要有一个叫“ftp”的系统账户。不要给它任何有效的shell,只给它一个主目录。主目录就是匿名区域。

34.基本安装

Q:我试图为自己和家人建立一个ftp服务器,这样我们就可以在旅途中获取文件或者 上传文件。如何让两个用户,比如说Jane和Joe,共享/home/ftp和/home/ftp/incoming文件夹。在/home/ftp中,他们只有读权限,在/home/ftp/incoming他们有读权 限和写权限。

A:为所有的FTP用户添加一个组(不是必须的,但更安全)

groupadd ftpgroup

给所有的FTP用户添加一个uid(同上,不是必须的,但是更好)

useradd -g ftpgroup -d /dev/null -s /etc ftpuser

现在,创建/home/ftp和/home/ftp/incoming:

mkdir -p /home/ftp/incoming
chown -R root:ftpgroup /home/ftp/incoming
chmod -R 755 /home/ftp
chmod -R 1775 /home/ftp/incoming

添加用户Jane:

pure-pw useradd jane -m -u ftpuser -d /home/ftp

添加用户Joe:

pure-pw useradd joe -m -u ftpuser -d /home/ftp

开启FTP服务器:

/usr/local/sbin/pure-ftpd -lpuredb:/etc/pureftpd.pdb -H -B

现在应该一切正常了。

关于创建新用户、更改密码等的更多信息,参考http://www.pureftpd.org/README.Virtual-Users

35.pure-ftpdwho太慢或者登录太慢

Q:有时,pure-ftpwho显示结果很慢。有时侯当用户登录时,在得到文件夹列表前,会话反应就有点迟钝。

A:这可能是由于DNS解析服务器太慢引起的。要显示主机全名,pure-ftpd需要查询DNS服务器,而如果你的连接或者客户连接很慢的话,这会很慢。

用-H选项可以加速pure-ftpdwho和pure-ftpd。这样主机名就不会被解析,你只能看到IP地址。

36.被chroot的用户可以跟随到chroot目录外面的符号连接。

Q:人们可以创建到“/”的符号连接来逃出主目录。

A:在pure-ftpd中,有两种chroot的方法:

-传统方法,基于内核chroot系统调用。这是默认的方式。这样,符号连接就只能指向chroot jail内部,不然的话就不会被跟随。

-“虚拟chroot”方法。用这个功能,用户可以跟随所有的符号连接,即使符号连接没有指向chroot jail内部。这对于建立多用户共享的文件夹非常灵活。二进制包默认编译进了虚拟chroot。

要在编译服务器时启用虚拟chroot功能,在./configure 后加上 –with-virtualchroot。如果你希望chroot受限,不要包含–with-virtualchroot。

注意,FTP服务器从来不会允许人们建立新的符号链接。要跟随符号链接,链接必须已经存在。如果你的用户可以使用Perl或PHP脚本建立符号链接,那么你的主机平台 的配置已经相当糟糕了.人人都能够安装任何的WEB文件浏览器,根本不需要用FTP来 查看你的系统文件.去掉POSIX函数,重新编译PHP,在chroot环境中运行所有的Perl脚本.

37.如何在后台启动Pure-FTPd?

Q:我从一个X终端启动了“pure-ftpd”,服务器回应正常。但是一关掉终端,服务 器就停止运行了。

A:这是依赖shell的后果。你的shell被设置为退出时关闭所有后台任务。可以改变shell选项(可能是使用'set'命令),或者用'disdown'关键词来分离后台任务.作为另 外一种选择,可以加上-B选项启动pure-ftpd,让它在启动的时候就分离出来.

/usr/local/sbin/pure-ftpd -B

38,Windows命令行FTP客户端和"ls"

Q:在命令行Windows FTP客户端中,输入"ls -la"没有返回任何文件

A:FTP客户端上的"ls"命令与Unix shell中的"ls"命令没有任何联系

在命令行的Windows客户端上,输入"ls"实际上发送FTP命令"NLST".所以当你输入"ls -la",意思并不是"详细显示所有文件".根据RFCs,它的意思是"列出所有叫做-la的 文件",所以你得到的回复就是你问的问题。如果没有叫“-la”的文件,你就什么都得不到。

如果你想使用正则表达式和选项,应该输入“dir”(翻译过来就是“LIST”)。“dir -la”就对了。

这有点不合逻辑,不过这种头疼的问题只有在使用微软的命令行FTP客户端时才会出 现.

如果你希望'ls'对选项进行解析,可加上-b选项启动pure-ftpd.

39.全局带宽限制

Q:如何限制FTP占用的总的带宽?

A:Pure-FTPd可以限制每个会话占用的带宽.不过,限制总的带宽是故意不添加的一种功能,因为大部分的操作系统已经有了有效的算法来处理带宽限制.

下面是Linux上的一个例子.

1)查看/proc/sys/net/ipv4/ip_local_port_range文件.可以看到两个数字:这就是Linux内核处理外界连接的时候使用的本地端口的范围.你希望为被动模式FTP保留的FTP端口一定不能在这个范围内.所以,如果:

"cat /proc/sys/net/ipv4/ip_local_port_range"返回"32768-61000",那么你可保 留端口10000到20000给FTP服务器,而不是30000-40000.(同样,你也可以选择改编本 地的端口范围).

2)更改前面的那些行,保存下面的脚本.

---------------------------- Cut here ----------------------------
#! /bin/sh
#简单的带宽限制--英文原本作者j@4u.net
#将下面的数据更改为你的连接带宽
#(对于等用户,写上你可能得到的最大带宽,而不是本地以太网连接的速度.)
REAL_BW='10Mbit'

#将下面的数据改为你想给FTP分配的带宽
#我们使用的带宽单位都是megabits,不是megabytes,所以80Kbit就是10 Kilobytes/s
FTP_BW='80Kbit'

#将下面的数据改为你的物理设备(或者'ppp0')
NIC='eth0'

#将下面的数据改为你给被动FTP分配的端口范围
FTP_PORT_LOW="10000"
FTP_PORT_HIGH="20000"

tc qdisc add dev "$NIC" root handle 1: cbq \
bandwidth "$REAL_BW" avpkt 1000

tc class add dev "$NIC" parent 1: classid 1:1 cbq bandwidth "$REAL_BW" \
rate "$REAL_BW" maxburst 5 avpkt 1000

tc class add dev "$NIC" parent 1:1 classid 1:10 cbq \
bandwidth "$REAL_BW" rate "$FTP_BW" maxburst 5 avpkt 1000 bounded

tc qdisc add dev "$NIC" parent 1:10 sfq quantum 1514b

tc filter add dev "$NIC" parent 1: protocol ip handle 1 fw flowid 1:10

iptables -t mangle -A OUTPUT -p tcp --sport 20:21 -j MARK --set-mark 1

iptables -t mangle -A OUTPUT -p tcp \
--sport "$FTP_PORT_LOW":"$FTP_PORT_HIGH" -j MARK --set-mark 1

---------------------------- Cut here ----------------------------

3)确保你已经安装了'tc'命令.要是你的发行版不提供'ip'和'tc'命令,脚本就无法 运行,要使用这两个命令,你得安装一个叫做'iproute2'的软件包.

4)加上你给定的被动端口范围,启动Pure-FTPd.

/usr/local/sbin/pure-ftpd -p 10000:20000 -HBA

5)运行第二步的时候建立的脚本.要是脚本无法运行,那就检查QOS支持是否编译进了你的Linux内核.

6) Enjoy 🙂

也可以参考:

http://www.docum.org

http://www.shorewall.net/traffic_shaping.htm and

http://talk.trekweb.com/~jasonb/articles/linux_tc_minihowto.shtml

40.Linux, NTFS和Pure-FTPd

Q:在linux上,不能从NTFS分区传输文件

A:记住,在Linux上,处理NTFS文件系统还处于实验阶段.一些基本的操作现在还没有 具备.幸运的是,人们作了很大的努力,在Linux 2.5已经有了一个新的处理NTFS的工 具,可以和pure-ftpd一起使用.(试一试./configure –without-sendfile ).这个工具比旧的工具更加可靠,也更快.更幸运的是,这个工具已经向下移植到了最近的2.4.x内核上了.详细情况请看 http://linux-ntfs.sf.net/.

41.速度很慢、运行迟缓

Q:有的用户抱怨说,不能传送大文件.传输开始后,速度还是很正常.然后,就突然下降,迟缓非常严重,常常得断开连接(或者在超时以后由客户来断开).服务器在过滤流入的ICMP的防火墙后面,但允许FTP端口.

A:千万不要过滤ICMP.至少不要在不理解你在过滤什么的情况下盲目地过滤.ICMP是TCP/IP技术规范的一部分. 过滤ICMP可能会带来很多副作用,而不会带来好处。如果你连3、4类型的ICMP,那 你的防火墙肯定有问题。这可能就是你传输大文件老是出问题的原因。

请读一下关于ICMP过滤的文档

http://www.phildev.net/mss/index.html

http://alive.znep.com/~marcs/mtu/

http://www.freelabs.com/~whitis/isp_mistakes.html

有些硬件路由器也会导致一些问题,不能正确处理window scaling。试试把它关掉 ,例如在Linux上:

sysctl -w net.ipv4.tcp_window_scaling=0
sysctl -w net.ipv4.tcp_bic=0

42.防火墙和SSL/TLS Q:我的客户端在一个做应用过滤的stateful防火墙(例如加了ip_conntrack_ftp或 者ip_nat_ftp的IPTables)后面。不能连接启用了SSL/TLS的服务器。验证可以通过,但不能下载文件,也无法显示目录。

A:首先,试着强迫客户端使用被动模式。启用主动模式时,服务器得通过连接socket指定的动态端口主动连接客户(或者网关)。但是,当使用SSL/TLS时,连接socket被加密,所以在中间的人–包括防火墙在内–都不能看到哪个端口被用于传输数据。解决这个问题的建议有几个,但是不论是流行的客户端和常见的防火墙都不理解 这些技巧。也就是说,使用被动模式,或者转而使用SSH。

43.TLS和error 00000000.

Q:启用了TLS的客户端不工作。输出这样的东西:

"SSL connect: error:00000000:lib(0):func(0):reason(0)"这是什么意思?

A:这个错误不是很明确。你应该是在类似LFTP的Unix客户端上看到的这个信息。实 际上意思是在启用TLS的服务器和启用TLS的客户端之间存在防火墙或者NAT box,但防火墙不能处理加密FTP会话。不幸的是,没有简单的解决方案。试试将客户端转换到主动模式,使用1:1 NAT,不过SSL/TLS 、防火墙和FTP混在一起并不好。

44.文件被自动重命名。(C. Jon Larsen提交)

Q:有时当文件上传后,自动的被重命名为类似“pureftpd.3f3300d2.33.0001”。这是什么原因?

A:用于上传文件的FTP客户端使用的FTP命令是STOU(储存唯一文件),而不是STOR 。检查ftp日志文件,应该可以看到这样的东西:

(user@a.b.c.d) [DEBUG] Command [stou] [file_name_from_the_client.ext]
/var/ftp/ftpcustomer/pureftpd.3f3300d2.33.0001 uploaded (218168 bytes,127.79KB/sec)
STOU命令告诉FTP客户端开始向远程站点传输文件;远程FTP服务器选择的文件名将 会是ftp客户端使用的当前文件夹中唯一的文件。服务器的应答将包含这个文件名。

Ftp客户端启用了一个类似“创建唯一文件”或者“带临时文件名上传文件”的选项。应该让ftp用户去掉这个选项。

企图在服务器端,禁用STOU命令并不是好主意,也不是好的解决方案。因为有些ftp客户端使用STOU来上传具有唯一临时文件名的文件,然后在上传完成后重命名文件 。这样可以避免失败的上传留下不完整的文件。