On this page... (hide)
本文简单介绍一下在Debian Gnu/Linux中配置Pure-FTPd的要点,详细信息仍建议查找官方文档。说实话,目前Pure-FTPd在国内应用得不多,中文文档也很少。除官方文档之外,我主要参考了LinuxSir上关于Debian下Pure-FTPd的安装心得。
1. 程序安装
Debian下只需要apt-get install pure-ftpd就行,之后apt-get会询问是使用StandAlone方式还是inetd方式运行,我选的是使用inetd方式运行;还会询问是否使用suid的方式来绑定Pure-FTPd运行所使用的账号,这个我还没弄清楚具体差别。如果以后想修改这些设置,可以使用dpkg-reconfigure指令重新配置pure-ftpd包就可以。
2. 参数配置方式
Pure-FTPd这个软件的设计其实有点奇怪,其默认的工作方式是全部使用pure-ftpd指令启动的命令行参数来进行设置的(具体参考man pure-ftpd)。为了维护方便,Pure-FTPd提供了一个名为pure-ftpd-wrapper的perl脚本来将设置参数配置文件化。这个脚本会读取/etc/pure-ftpd目录下的各个配置文件,转换为命令行参数,用来启动pure-ftpd进程。配置文件的大致格式是每个参数就是一个文件,文件名对应该参数的内容,每个文件内部只有一行,指定该项配置的取值。据说官方还提供了与pure-ftpd-wrapper功能完全一样的Python版本脚本,但是我还没有去找。
inetd的配置文件是/etc/inetd.conf,如果在包安装时选择了inetd方式,那么可以看到其中已经将ftp服务指定为pure-ftpd-wrapper了。这样inetd会在系统启动时启动pure-ftpd-wrapper,然后pure-ftpd-wrapper会读取配置文件参数,启动pure-ftpd。
如果需要了解pure-ftpd-wrapper的详细信息,可以man pure-ftpd-wrapper 。另外可是参考http://download.pureftpd.org/pub/pure-ftpd/doc/README.Configuration-File
3. 虚拟用户的配置方法
pure-ftpd包安装完的默认配置虽然会自动启动pure-ftpd,但是仅启用了Linux系统用户作为认证的方式,也不允许匿名用户。通常为了方便管理,还是使用虚拟用户来登录ftp服务。
可以参照/usr/share/doc/pure-ftpd/README.Virtual-Users.gz,也可以参照http://download.pureftpd.org/pub/pure-ftpd/doc/README.Virtual-Users 来进行配置虚拟用户。
Pure-FTPd中的所有虚拟用户都会分别与系统中的某个用户对应,并且依据该系统用户的文件系统权限来决定虚拟用户对文件或目录的访问权限。
有人建议直接使用系统中默认带有的nobody用户,也有人认为应当专门建立新的系统用户组来为虚拟用户用。这样的话,就在Shell中执行下面两条语句:
useradd -g ftpgroup -d /dev/null -s /etc ftpuser
Pure-FTPd可以使用多种认证方式,比如MySQL等等,我这里打算采用的是PureDB方式。这样的话:
- 使用pure-pw指令维护虚拟用户(实际上编辑的是/etc/pure-ftpd/pureftpd.passwd文件)
- 建立新虚拟用户:
pure-pw useradd joe -u ftpuser -d /home/ftpusers/joe
- 可以用pure-pw usermod命令修改一个虚拟用户的参数设置
- 删除用户用 pure-pw userdel joe。
- 查看一个用户的当前设置用 pure-pw show joe。
- 建立新虚拟用户:
- 使虚拟用户生效:用pure-pw mkdb 建立一个认证库,会根据pureftpd.passwd的内容在/etc/pure-ftpd/下面生成一个pureftpd.pdb文件。
- 此时,pure-ftpd还不知道利用pureftpd.pdb文件来进行用户认证,进入/etc/pure-ftpd/auth 目录看看,发现里面有两个文件65unix和70pam,这就是pure-ftpd用的认证方式,需要自己加一个60pdb的链接文件告诉pure- ftpd用pdb认证,
ln -s ../conf/PureDB 60pdb
- 很多人说此时不用重启,就可以用joe登录了。如果不成功,那么还是把inetd重启一下(Debian下inetd默认用的是inetutils-inetd:“/etc/init.d/inetutils-inetd stop”、“/etc/init.d/inetutils-inetd start”。或者kill掉inetd的进程,然后再键入inetd指令使之启动)。
- 以后用pure-pw修改虚拟用户设置时,只要加上一个-m就可以马上生效而省了pure-pw mkdb这一步。比如:
pure-pw useradd newuser -m
4. 认证TLS加密
参考http://download.pureftpd.org/pub/pure-ftpd/doc/README.TLS 的说明进行设置,这里是自行创建一个没有被第三方机构认证的自有证书来作认证之用。
openssl req -x509 -nodes -newkey rsa:1024 -keyout \
/etc/ssl/private/pure-ftpd.pem \
-out /etc/ssl/private/pure-ftpd.pem
chmod 600 /etc/ssl/private/*.pem
编辑创建/etc/pure-ftpd/conf/TLS这个文件,在其首行顶头写一个数字“1”(1代表既能够使用TLS加密认证过程,也可以使用非加密的过程登陆;0表示只支持非加密登陆;2表示只支持加密登陆)。然后重启pure-ftpd服务即可(如果pure-ftpd在inetd中运行,则重启inetd即可)。
5. 关于“invalid address given”错误
启动Prue-ftpd服务后,如果lftp主机名可以登录,但是lftp主机IP地址或外部域名却不能登录,log里显示:
pure-ftpd: (?@?) [ERROR] Sorry, invalid address given
man pure-ftpd得知:pure-ftpd默认是把IP地址解析成域名,而hosts文件里没有把对外IP地址对应到域名,所以解决的办法就是:
- 修改hosts文件,把以太口IP和主机名对应
- 使用-H参数,使得pure-ftpd不解析域名
这里使用第二个方法。在Debian下是在/etc/pure-ftpd/conf目录下建立一个名为DontResolve的文本文件,在里面写Yes,然后重启inetd就可以了。Gentoo下的方法参见这个解决方法的原始链接。
6. 修改FTP服务端口
应该是在/etc/pure-ftpd/conf目录下名为Bind的文件中写:"<port>" (eg 21) 或者 "<ip>,<port>" (eg 192.168.0.1,21)就行了。可是我在试验的时候通过inetd启动pure-ftpd仍然是使用21端口而不是我改过的端口,在命令行下直接启动pure-ftpd-wrapper就会使用我所设定的端口。
于是我只好放弃pure-ftpd的inetd模式,改为使用standalone方式。首先得在/etc/default/pure-ftpd-common文件中,将“STANDALONE_OR_INETD=inetd”改为“STANDALONE_OR_INETD=standalone”。然后用“/etc/init.d/inetdutils-inetd restart”重启inetd,用“/etc/init.d/pure-ftpd restart”重启pure-ftpd。应该就会变成使用Bind文件里面设定的端口的standalone模式了。
7. 更多高级设置
【待续】