关于Ubuntu Server 9.10上安装pure-ftpd报425 Sorry,invalid address given错误的处理

    最近在Ubuntu Server 9.10上安装了pure-ftpd用做ftp服务器,但是遇到了据说是有上千个人提问的关于425 Sorry,invalid address given的错误。甚至有人在分析完该问题后,提出让提问者更换ftp服务器。抱着没有问题不可以解决的决心,尝试了各种方法,最后终于以变通的方式解决了。故写在这里,以便给后来者节省一些时间。

   

    问题产生的原因:使用aptitude安装pure-ftpd的二进制安装包。系统会自动采用默认的pure-ftpd启动参数,默认情况下会使用UNIX用户认证(是导致后面创建的ftp虚拟用户登陆认证失败的原因),和开启登陆用户IP到域名的反向查找功能(是导致425错误的原因)。

   

    问题解决的思路:就是修改pure-ftpd的启动参数,让它符合我们的要求。

   

    难点:pure-ftpd采用了新的配置方式,其启动时的配置参数不是写在一个文件中的,导致我们想修改其启动参数但却无从下手。

   

    救命稻草:pure-ftpd也允许通过inetd,xinetd等几个流行的internet superserver来运行。

    

    变通解决方法:利用inetd可以在其配置文件中使用配置参数来运行服务使问题得到解决。

   

    变通方法的缺点:比起standalone模式来,通过inetd来运行pure-ftpd在性能上会稍微降低一些。

    下面是本人在Ubuntu Server 9.10上安装和配置pure-ftpd的主要步骤:

1. 用aptitude安装pure-ftpd-common和pure-ftpd (建议在弹出窗口询问是否要chroot功能时选择是)

2. 在服务器上运行ftp localhost 用安装pure-ftpd时的Ubuntu系统用户名和口令登陆看是否能正常登陆。通常到这里是可以登陆的,表明服务器安装正确。

3. 在系统中创建ftp组

groupadd ftpgroup

4. 增加一个假的shell解释器(使ftp登陆用户无法运行shell命令,以增强系统安全性)

vi /etc/shells

添加/bin/false  (比如在Ubuntu Server 9.10下)

5. 在系统中建立一个以/dev/null为home的目录(该用户将没有自己的home目录),以/bin/false为默认shell的ftp用户

useradd -g ftpgroup -m -d /dev/null -s /bin/false ftpuser

6. 为上面建立的ftpuser增加一个虚拟ftp用户账号,赋予它真实的home目录

pure-pw useradd ftpvuser1 -u ftpuser -d /home/ftpvuser1

根据提示两次输入该虚拟ftp用户的口令。

上面这一步其实是在/etc/pure-ftpd/pureftpd.passwd这个文件中增加了一行登陆用户的信息。

7. 创建PureDB文件,自动提交用户更改 (注意:这一步不能少)

pure-pw mkdb

上面这一步实际是将/etc/pure-ftpd/pureftpd.passwd的内容写入并增加索引到/etc/pure-ftpd/pureftpd.pdb这个用作数据库的文件中,以便加快查找速度。只有到这一步,该虚拟用户的信息才真正在pure-ftpd中生效。

如果以后需要更新虚拟ftp用户的口令可以用root身份执行如下命令:

pure-pw passwd ftpvuser1

两次输入新口令

pure-pw mkdb

上面这两行命令也可以写成如下的一行:

pure-pw passwd ftpvuser1 -m

两次输入新口令

-m参数会自动将pureftpd.passwd中做的改变提交到pureftpd.pdb中去生效。

8. 修改默认的pure-ftpd守护进程的启动参数配置

由于通过aptitude安装的pure-ftpd其启动参数不是写在配置文件中的。在网上转了一大圈都没有找到该到哪里去修改这些配置参数。而且这几个初始配置的启动参数使用了UNIX用户认证,而不是我们在上面设置的虚拟用户,更麻烦的是由于没有使用-H参数来阻止登陆IP到域名的反向查找,直接导致了在远程终端上ftp时会报425 Sorry,invalid address given的错误。但是峰回路转,pure-ftpd还允许通过inetd来启动,这样就可以把需要的pure-ftpd启动参数写在inetd.conf里了。

下面以root身份运行dpkg-reconfigure pure-ftpd-common 按照窗口提示将pure-fptd的启动模式改为inetd,保存后推出。

找到inetd.conf(在/etc/下面)

vi inetd.conf 增加一行内容如下:
ftp stream tcp nowait root /usr/sbin/pure-ftpd pure-ftpd-virtualchroot -H -w -j -l puredb:/etc/pure-ftpd/pureftpd.pdb -O clf:/var/log/pure-ftpd/transfer.log -8 UTF-8 -E -Z
保存后退出。

重启xinetd(因为Ubuntu Server 9.10下用xinetd代替了老的inetd)使配置生效,当然重启系统也一样可以。

killall -HUP xinetd

9. 接下来就可以在远程终端上ftp 服务器IP, 用前面创建的虚拟ftp用户ftpvuser1来登陆,测试是否能成功了。

后记:pure-ftpd的默认最大同时登陆人数为50个。如果需要增加允许的最大同时登陆人数,可以用-c 人数 来控制。

个人感想:

1. pure-ftpd的登陆IP到域名的反向查找功能其实不错,能够在日志中直观看到登陆用户来自何方,虽然这样做会损失一些性能。由于本人使用的是局域网测试环境,无法知道在真实环境里该功能是否可以无需什么配置而自动实现,反倒是在局域网环境里开了这个功能会报425错误。从网上的提问可以看到,有些真实环境下的ftp服务器的用户也遇到了这个问题,但又不是所有的用户都会遇到该问题。说明该功能可能还需要进一步完善。

2. pure-ftpd使用了新的配置方式,而舍弃了配置文件的形式。这种做法会导致一些新用户的迷茫。如果在使用指导中给出新配置方式的用法倒也可以接受,问题是没有找到有关这方面的信息。希望在下一个版本中可以出现一些方便用户配置的指导。

更详细的说明可以参考http://pureftpd.sourceforge.net/README

猜你喜欢

转载自blog.csdn.net/orlando_xu/article/details/5268911