最近公司有个客户,对VSFTP的模块集成有所不满。要求更换为PROFTP。因此对该服务器做了简单的了解和部署搭建。坑太多,简单记录下:

 部署:
 获取proftp源码包:ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.5b.tar.gz
 获取模块包(客户需要使用MD5模块):http://www.castaglia.org/proftpd/modules/proftpd-mod-md5-0.3.5.tar.gz

 【编译安装】:
  1、解压缩包,并将第三方库文件导入,用于加载。
      #tar zxvf proftpd-mod-md5-0.3.5.tar.gz proftpd-1.3.5b.tar.gz
      #cp mod_md5/mod_md5.c proftpd-1.3.5b/modules/
  2、配置。<切记:安装成功后,使用proftpd -vv的命令,查看你所安装的模块是否有加载的模块,如果没有的话,全部卸载,删除解压包,重新来一遍>。
      #./configure --with-modules=mod_md5:mod_tls
  3、编译及安装。
      #make  &&  makeinstall
  4、为了方便使用,将使用/etc/init.d/执行,如下:
      #cp proftpd-1.3.5b/contrib/dist/rpm/proftpd.init.d /etc/init.d/proftpd
      并检查如下:
      1、/etc/sysconfig/proftpd文件是否存在,如果不存在,手动创建,并写入内容:
      #echo'PROFTPD_OPTIONS="-DANONYMOUS_FTP"' > /etc/sysconfig/proftpd
      2、/etc/init.d/proftpd配置文件第46行与第53行,皆修改为执行文件所在位置(/usr/local/sbin/proftpd)。
  5、更改默认配置文件:
     修改:Group                nobody
     添加:DefaultAddress       X.X.X.X
 至此,编译安装结束。
    
【基础信息】
所需文件位置:
     默认源代码安装的配置文件为:/usr/local/etc/proftpd.conf
     默认的可执行程序为:/usr/local/sbin/proftpd
所需相关命令:
    重启:/etc/init.d/proftpd restart
    debug:/usr/local/sbin/proftpd -d9n
所需日志:<需配置文件自定义>
    SystemLog:
       1.1.6pl1之后的版本,默认加载的mod_log.c模块实现的,记录的是有关FTP服务器错误及重启的日志。
       LogFormat设置日志格式,具体的每个字段解释如下:
       “%a客户ID,%A匿名用户名,%b发送请求的字节数,%d目录名(相对路径),%D目录名(绝对路径),%F上传或下载的文件名(相对路径),%f上传或下载的文件名(绝对路径),%h客户的域名,%L本服务器IP,%m客户发送的命令,%p本服务器端口,%P访问进程ID,%r客户发送的整条命令,%t本地时间,%T传送就所用的时间(秒),%u客户登录的用户名。”
     TransferLog:
       /var/log/xferlog这个日志是用户上传,下载,删除动作的日志,也是查询客户投诉问题的日志。
       示例“Wed Jun 08 02:41:10 2016 0 61.48.32.202 9801 /home/jing/jingtest/2.txt a _ d r jing ftp 0 * c”
       具体字段解释如下:
       “{Wed Jun 08 02:41:10 2016 时间},{0 传输持续时间},{61.48.32.202 远程FTP客户端地址},{9801 文件大小},{/home/jing/jingtest/2.txt 文件名},{a 传输类型,b是二进制文件,a是ascii传输},{_ 特殊行为标记,C被压缩的文件,U未被压缩的文件,Ttar文件,_没有特殊行为},{d 方向,i上传,o下载,d删除},{r 用户类型,r系统用户,a匿名用户},{jing 用户名},{ftp 被调用的FTP服务器软件名字},{0 认证方式,0表示没有},{* 认证用户ID,*表示没有},{c 完成状态,c表示完成,i表示没有完成}。”

 【配置信息】:
    配置文件结构:
      #全局设置
      设置项目1 参数1
      设置项目2 参数2
      #某个目录的设置
      <Directory 路径名>
    ...
    ...
    </Directory>
    #关于匿名登陆的设置
    <Anonymous 匿名登陆的目录>
    ...
    ...
    <Limit 限制动作>
    ...
    ...
    </Limit>
    </Anonymous>

  【具体配置】
      #【基本配置】
      #配置服务器名
      ServerName                            "ProFTPD Default Installation"
     #设置为默认服务器
     DefaultServer                          on
     #设置默认的服务器监听地址
     DefaultAddress                          XXX.XXX.XXX.XXX     
     #设置服务器接收请求的端口
     Port                               21    
     #设置关闭IPv6支持
     UseIPv6                               off  
     #设置用户上传文件的权限掩码,777-022
     Umask                                022
     #设置服务器进程运行使用的用户名
     User                                 nobody
     #设置服务器进程运行使用的组
     Group                                nobody
     #设置用户被chroot锁定到各自的Home目录
     DefaultRoot                              ~
     #设置屏蔽服务器版本信息
     ServerIdent                              off
     #设置允许写入覆盖
     AllowOverwrite                            on
     #设置下载时,允许断点续传。
     AllowRetrieveRestart                         on
     #设置上传时,允许断点续传。
     AllowStoreRestart                          on
     #设置最大线程数
     MaxInstances                            30
     #设置最大尝试连接次数
     MaxLoginAttempts                           3
     #设置无数据传输超时时间
     TimeoutNoTransfer                          300
     #设置禁止DNS反查
     UseReverseDNS                            off
     IdentLookups                            off
     
     #设置日志格式
     #LogFormat         default          "%h %l %u %t \"%r\" %s %b"
     #AllowLogSymlinks                  on
     LogFormat        default            "%a %A %h %l %u %t \"%r\" %s %b %c %d %D %f %F %L %m %T"
     LogFormat           auth          "%v [%P] %h %t \"%r\" %s"
     LogFormat          write          "%h %l %u %t \"%r\" %s %b"
     
     #设置日志
     #WtmpLog                      off
     #ServerLog                     /var/log/proftp-login.log
     TransferLog                     /var/log/xferlog
     SystemLog                     /var/log/proftp.log
     ExtendedLog                    /var/log/proftpd/access.log ALL default
     
     #设置服务器运行模式,独立服务standalone,被监管inetd。这里注释是因为开启后日志有报错。
     #ServerType                                     standalone
     #设置被动模式使用的端口范围。这里暂时不需要,注释
     #PassivePorts                                   60000 65535
     #设置允许root用户登录,默认禁止。
     #RootLogin                                      on
     #虚拟用户没有shell,需要打开这个设定
     #RquireValidShell                               off
     #设置用户传输速率
     #TransferRate   STOR|RETR (Kbytes/s) USER使用者
     #设置每个账号最多允许来源IP
     #MaxHostsPerUser                                1
     #设置每个账户每个客户端最多可同时登陆1次(避免多线程)
     #MaxClientsPerUser                              1
     #设置同一个客户端最多一个账号可以登陆
     #MaxClientsPerHost                              1
     #设置单用户线程数
     #MaxClientsPerHost                              2
     #设置最大用户数        
     #MaxClients                                     20
     #设置身份认证超时时间
     #TimeoutLogin                                   30
     #设置连接的超时时间
     #TimeoutStalled                                 30s
     #设置客户端IDLE时间,默认600s
     #TimeoutIdle                                    600
     #设置欢迎信息,如果关闭是off。
     #DisplayLogin                                   welcome.msg
     #设置切换文件夹时,显示的欢迎信息。
     #DisplayChdir                                   .message
     
     #设置虚拟用户认证信息,用mod_auth_file.c验证登录用户名密码
     #AuthOrder                           mod_auth_file.c #只允许虚拟用户登录
     #AuthUserFile                         /xxx/ftp.users  #存放用户名和密码的文件
     #AuthGroupFile                        /xxx/ftp.group
     
  #【mod_md5配置】
        #我使用这个功能,主要是为了实现,lftp的quote SITE MD5 $FILENAME命令。
        #首先用-vv的方式检查是否加载了这个模块,如有加载成功,配置文件如下所示:
         <Limit SITE_MD5>
             AllowUser   jing
             DenyAll
            </Limit>
            <IfModule mod_md5.c>
             MD5Engine    on
            </IfModule>

  #【openssl认证配置】
        #这个功能是为了实现,自定义证书认证。
        #同样用-vv方式检查是否加载了模块,如果加载成功,会产生/home/jingjing.wang/proftpd-1.3.5b/modules/mod_tls.c这个软连接。
        #该功能需要本机部署openssl,具体部署方法,见下方【部署openssl】。
        <IfModule mod_tls.c>
           TLSEngine            on
           TLSLog             /var/log/proftpd/proftp-tls.log
           TLSProtocol           TLSv1
           TLSRequired           on
           TLSRSACertificateFile      /usr/local/etc/proftpd.crt
           TLSRSACertificateKeyFile    /usr/local/etc/proftpd.key
           TLSVerifyClient         off
           TLSOptions           NoSessionReuseRequired
        </IfModule>
        <Limit LOGIN>
          AllowUser jing
          DenyAll
        </Limit>
 #【配置完成】
     
  【部署openssl】
   1、获取软件包
   #wget http://www.openssl.org/source/openssl-1.0.2.tar.gz
   2、解压
   #tar -xzvf openssl-1.0.2.tar.gz
   3、编译安装
   #cd openssl-1.0.2
    #./config
    #make && make install
   4、生成秘钥文件
   #cd /usr/local/etc/
    #/usr/bin/openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout proftpd.key -out proftpd.crt
   
  【异常】:
   1、530 Login incorrect.Login failed.Remote system type is UNIX.Using binary mode to transfer files.
    这个错误有很多问题,常见的:
    1、用户设置为/sbin/nologin。<先设置允许登录,sed'/USERNAME/s/nologin/bash/g' /etc/passwd,(记得加-i)再一步步调试。>
    2、家目录权限不是777。<先设置为777,chmod 777 ~再一步步调试。>
    3、Limit控制权限。<先设置为All,最高权限,再一步步调试。>
    4、auth验证问题。<先注释掉所有的auth,再一步步调试。也可以参照http://www.qianweikang.com/cheng-gong-jie-jue-proftpd-deng-lu-ti-shi-530-login-incorrect.htm>
   2、421 Service not available, remote server has closed connection。Login failed.No control connection for command: Success
    这个错误,我是误打误撞解决的,部分用户出现421,调用DEBUG调试,看到配置文件中调用MD5模块的配置有报错(<IfModule mod_md5.c>),注释后就好了。
    by20160608,又出现一次,我把用户名修改成/sbin/nologin后,再次出现 421,经过试验,发现还是这个模块,这个模块中的AllowUser和MD5Path需要把允许的用户名写上才可以。
   3、日志报错:error: /var/log/proftpd is a world-writable directory、unable to open SystemLog '/var/log/proftpd/proftp.log': /var/log/proftpd/proftp.log is a world-writable directory
    这个错误是由于日志文件的权限问题,解决办法:    
    chmod 755 /var/log/proftpd
    chmod 640 /var/log/proftpd/*
       
 【欢迎词设置】
   关于欢迎文件的设置包含如下参数:
   %T 目前的时间
   %F 所在硬盘剩下的容量
   %C 目前所在的目录
   %R Client 端的主机名称
   %L Server 端的主机名称
   %U 使用者帐户名称
   %M 最大允许连接人数
   %N 目前的服务器连接人数
   %E FTP服务器管理员的 email
   %i 本次上传的文件数量
   %o 本次下载的文件数量
   %t 本次上传+下载的文件数量
   
   知道这些参数,可以写出欢迎语文件,例如:
   欢迎您%U, 这是你的测试FTP服务器;
   目前时间是:%T;
   本服务器最多允许%M个用户连接数;
   目前服务器上已有%N个用户连接数;
   目前你所在的目录是%C;
   目录所在的硬盘还剩下%F字节。