热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

安装配置ProFTPd服务器

标签:FreeBSDProFTPDFTP服务器1、系统安装及前期准备工作见《安装邮件服务器之一》,需要建立一个FTP目录,这里假设为/var/ftp,其下有一目录/var/ftp/any为匿名登录使用2、安装ProFTPD#cd/usr/ports/ftp/proftpd/#makeinstallclean出现选项,
标签: FreeBSD ProFTPD FTP 服务器

1、系统安装及前期准备工作

见《安装邮件服务器之一》,需要建立一个FTP目录,这里假设为/var/ftp,其下有一目录/var/ftp/any为匿名登录使用

2、安装ProFTPD

# cd /usr/ports/ftp/proftpd/

# make install clean

出现选项,根据需要自己选择:

      Options for proftpd 1.3.1.r2_3

[ ] IPV6             Use IPv6
[ ] LDAP             Use LDAP
[ ] LDAP_TLS         Use LDAP TLS (Requires LDAP)
[X] MYSQL            Use MySQL
[ ] POSTGRESQL       Use Postgres
[X] OPENSSL          Include mod_tls
[X] QUOTA            Include mod_quota
[X] IFSESSION        Include mod_ifsession
[X] README           Include mod_readme
[X] RATIO            Include mod_ratio
[ ] CTRLS            include controls
[X] REWRITE          Include mod_rewrite
[X] WRAP             Include mod_wrap2
[ ] WRAP_FILE        include mod_wrap2_file
[ ] WRAP_SQL         include mod_wrap2_sql

安装完毕会在系统中产生一对用户和组:nobody:nogroup,后面用它们来启动proftpd,并作为FTP超级用户,现在为它们分配/var/ftp的权限:

# chown nobody:nogroup /var/ftp
# chmod 701 /var/ftp

注意:某些情况下,安好proftpd,重起系统时,会出现如下情况:

1、警告:

Missed packet -- no receive buffer

如果您的系统是6.0以上的话,请尝试:

# sysctl net.isr.direct=1

2、警告:

- warning: unable to determine IP address of 'localhost.localdomain'
- error: no valid servers configured
- Fatal: error processing configuration file '/usr/local/etc/proftpd.conf'

在/etc/hosts中加入“ip 主机名”。例如:服务器叫soft,ip是192.168.10.23,在hosts文件中加入下面一行:

192.168.10.23 soft

注意:如果主机名带有域名,也要将带域名的主机名加进去。如域名是aa.com,则加入:

192.168.10.23 soft soft.aa.com

3、添加匿名用户(如果不需要匿名登录,这一步可以省略)

# pw adduser ftp -u 3003 -s /sbin/nologin -d /dev/null
# mkdir /var/ftp/any
# chown ftp:ftp /var/ftp/any
# chmod 500 /var/ftp/any

4、修改配置文档使匿名用户生效

# ee /usr/local/etc/proftpd.conf

原始文档中并没有太多的条目,可以根据实际需要来添加。如下是我的配置文档:

#
# To have more informations about Proftpd configuration
# look at : http://www.proftpd.org/
#
# This is a basic ProFTPD configuration file (rename it to
# 'proftpd.conf' for actual use. It establishes a single server
# and a single anonymous login. It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anon.

ServerName                      "YourServerName"
#改为您服务器的名称

ServerType                      standalone
#不推荐为inetd

DefaultServer                   on
ScoreboardFile                  /var/run/proftpd.scoreboard

ServerAdmin                    
#管理员邮箱设置

SyslogLevel                      emerg
SystemLog                       /var/log/proftpd.system.log
#日志设置为紧急事件记录,还有其他级别可选:emerg, alert, crit (empfohlen), error, warn. notice, info, debug

ServerIdent                      off
#用户登陆时不显示ftp服务器版本信息

# Port 21 is the standard FTP port.
Port                            21
#改为您需要的端口

# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask                            022
#改为您需要的权限,这里指的是上传上来的文件的权限

MaxLoginAttempts                10
TimeoutLogin                    120 "连接超时"
TimeoutIdle                     600 "空闲超时"
TimeoutNoTransfer               600 "超时未传输"
TimeoutStalled                  600 "停止超时"
#超时设置,后面的是达到条件时的警告语

MaxClients 10                   "对不起,用户已满,请稍候再试。"
#最大客户端数,后面是达到条件时的警告语

MaxClientsPerHost 3
#设置每个客户端最多并发连接数

RequireValidShell            off
#如果是用上一节的办法建立的用户,这一句必须有,不然就不能登录

DisplayLogin                 .welcome.msg
#手动建立welcome.msg文件,并放入每一个用户的ftp目录下才能起作用。文件里面的内容是登陆时的欢迎信息,可以自己编写。另外,把文件名前加个.使之隐藏是个不错的注意

# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances                    30

CommandBufferSize               1024
#根据自己需要改

# Set the user and group under which the server will run.
User                            nobody
Group                           nogroup
#这里可以改为您想要的用户和组,但必须是系统中已经存在的

# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
#DefaultRoot ~
DefaultRoot ~
#锁定用户到自己的目录

# Normally, we want files to be overwriteable.
AllowOverwrite          on

# Bar use of SITE CHMOD by default

DenyAll

#如下是匿名登录的设置,如果不需要匿名登陆,把下面全部注释掉

# A basic anonymous configuration, no upload directories. If you do not
# want anonymous users, simply delete this entire section.

#########################################################################
                                                                      #
# Uncomment lines with only one # to allow basic anonymous access       #
                                                                      #
#########################################################################

#

#匿名用户的ftp目录

   User                         ftp
   Group                         ftp
   #用上一步建好的用户和组

### We want clients to be able to login with "anonymous" as well as "ftp"
   UserAlias                    anonymous ftp

   DisplayChdir                 .message
   #根据启动proftpd时的提示修改为DisplayChdir,可以不改

### Limit WRITE everywhere in the anonymous chroot
  
     DenyAll
  

5、试运行

修改完配置文件后启动proftpd:

# /usr/local/sbin/proftpd

如发现无法记录日志,请手动建立/var/log/proftpd.system.log,并授予相应权限:

# chown nobody:nogroup /var/log/proftpd.system.log
# chmod 700 /var/log/proftpd.system.log

这时就可以尝试登陆了,如果登陆没有问题就继续。如果有问题,请对照配置文件查找错误,察看日志也是不错的办法

再次打开profptd.conf,在最后加入如下代码:

SQLConnectInfo ProFTPD@localhost FtpUser 123456
# 数据库联接的信息,ProFTPD是数据库名,localhost是主机名,FtpUser是连接数据库的用户名,123456是密码(如果没有密码留空)

SQLAuthTypes Backend Plaintext
# 数据库认证的类型

SQLUserInfo FTPUSERS userid passwd uid gid homedir shell
SQLGroupInfo FTPGRPS groupname gid members
# 指定用来做用户认证的表的有关信息。("FTPUSERS"和"FTPGRPS"是数据表名字,等一会在下面建立)

SQLAuthenticate users* groups*
# 数据库的鉴别

SQLHomedirOnDemand on
# 如果home目录不存在,则系统会根据它的home项新建一个目录

SQLDefaultGID 65534

SQLDefaultUID 65534

#目录所有者,这个很重要,所以我用nobody来做,在此我的nobody为65534

SQLLog PASS updatecount

SQLNamedQuery updatecount UPDATE "count=count+1,accessed=now() WHERE userid='%u'" FTPUSERS

SQLLog STOR,DELE modified
# Update modified everytime user uploads or deletes a file

SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" FTPUSERS

QuotaDirectoryTally on
# 启用磁盘限额

QuotaDisplayUnits "Mb"
# 磁盘限额单位 b"|"Kb"|"Mb"|"Gb"

QuotaEngine on

QuotaLog "/var/log"
# 磁盘限额日志记录

QuotaShowQuotas on
# 打开磁盘限额信息,当登陆FTP帐户后,使用命令 "quote SITE QUOTA" 后可显示当前用#户的磁盘限额

SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail,bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}'AND quota_type = '%{1}'"

SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies

SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies

QuotaLimitTable sql:/get-quota-limit

QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

# SQL调用语句,不用修改

6、数据库设置

在MySQL里新建一个数据库ProFTPD,添加一个用户FtpUser和密码123456,并赋予它对数据库ProFTPD的操作权,然后在ProFTP里建立各种表,建议在phpmyadmin里做:

CREATE TABLE `FTPGRPS` (

`groupname` varchar(16) NOT NULL default '',

`gid` int(6) NOT NULL default '65534',

`members` varchar(16) NOT NULL default '',

KEY `groupname` (`groupname`)

) TYPE=MyISAM COMMENT='ProFTP group table';

INSERT INTO `FTPGRPS` VALUES ('nobody', 65534, 'nobody');

CREATE TABLE `ftpquotalimits` (

`name` varchar(30) default NULL,

`quota_type` enum('user','group','class','all') NOT NULL default 'user',

`per_session` enum('false','true') NOT NULL default 'false',

`limit_type` enum('soft','hard') NOT NULL default 'soft',

`bytes_in_avail` float NOT NULL default '0',

`bytes_out_avail` float NOT NULL default '0',

`bytes_xfer_avail` float NOT NULL default '0',

`files_in_avail` int(6) unsigned NOT NULL default '0',

`files_out_avail` int(6) unsigned NOT NULL default '0',

`files_xfer_avail` int(6) unsigned NOT NULL default '0'

) TYPE=MyISAM;

CREATE TABLE `ftpquotatallies` (

`name` varchar(30) NOT NULL default '',

`quota_type` enum('user','group','class','all') NOT NULL default 'user',

`bytes_in_used` float NOT NULL default '0',

`bytes_out_used` float NOT NULL default '0',

`bytes_xfer_used` float NOT NULL default '0',

`files_in_used` int(6) unsigned NOT NULL default '0',

`files_out_used` int(6) unsigned NOT NULL default '0',

`files_xfer_used` int(6) unsigned NOT NULL default '0'

) TYPE=MyISAM;

CREATE TABLE `FTPUSERS` (

`id` int(6) unsigned NOT NULL auto_increment,

`userid` varchar(32) NOT NULL default '',

`passwd` varchar(32) NOT NULL default '',

`uid` int(6) NOT NULL default '65534',

`gid` int(6) NOT NULL default '65534',

`homedir` varchar(255) NOT NULL default '',

`shell` varchar(16) NOT NULL default '/sbin/nologin',

`count` int(11) NOT NULL default '0',

`accessed` datetime NOT NULL default '0000-00-00 00:00:00',

`modified` datetime NOT NULL default '0000-00-00 00:00:00',

PRIMARY KEY (`id`)

) TYPE=MyISAM COMMENT='ProFTP user table';

7、测试

添加用户,建议在phpmyadmin下进行:

INSERT INTO FTPUSERS (userid, passwd, uid, gid, homedir, shell)
valueS ('user1', '999999', '65534', '65534', '/var/FTP/user1', '' );

设置磁盘限额:

将上面建立的user1帐号给予10M空间,最多能上传500个文件到服务器上,文件传输流量为20M,只能传输10个文件

INSERT INTO `ftpquotalimits` ( `name` , `quota_type` , `per_session` , `limit_type` , `bytes_in_avail` , `bytes_out_avail` , `bytes_xfer_avail` , `files_in_avail` , `files_out_avail` , `files_xfer_avail` )
VALUES ('user1', 'user', 'false', 'soft', '10240000', '0', '2048000', '500', '0', '10');

不需要设置的部分用0代替就可以了

测试磁盘限额:

尝试使用户名user1和密码999999来登陆,并运行quote SITE QUOTA显示当前用户的磁盘限额:

ftp> quote SITE QUOTA
200-The current quota for this session are [current/limit]:
Name: user1
Quota Type: User
Per Session: False
Limit Type: Soft
Uploaded Kb: 0.00/10000.00
Downloaded Kb: unlimited
Transferred Kb: 0.00/2000.00
Uploaded files: 0/500
Downloaded files: unlimited
Transferred files: 0/10
200 Please contact root@wwwx.3322.org if these entries are inaccurate

出现上面的文字说明数据库用户验证和磁盘限额测试成功!

将proftpd加入/etc/rc.conf:

proftpd_enable="YES"

8、防火墙

防火墙安装及基本配置请参考《安装邮件服务器之一》,这里只说明有关FTP的内容。打开/etc/ipf.rules,添加如下内容:

pass in log quick on lnc0 proto tcp from any to any port=21 flags S/SA keep state
pass in log quick on lnc0 proto tcp from any to any port 45000 ><5000 flags S/SA keep state
pass out log quick on lnc0 proto tcp from any to any flags S/SA keep sate

为了使proftpd支持被动连接(pasv),需要修改proftpd.conf,在其中添加:

MasqueradeAddress x.x.x.x
PassivePorts 45000 50000

9、致谢

本文参照《[原创] 我的proftpd+mysql+quota @ debian 安装流水笔记》完成,感谢作者mb

本文参考了《FreeBSD网站平台建设全过程 第四步安装配置ftp服务器》和《ProFTPD Example Configurations》,感谢作者们

感谢《FreeBSD4.7环境下使用IPFILTER设置小型企业防火墙》的作者,很抱歉找不到原著和作者信息,这篇文章为本文提供了IP Filter防火墙的参考

第二节中的警告问题参考了《服务器出现Missed packet -- no receive buffer.怎么回事??》和《启动不了proftpd,显示 Name or service not known》,感谢提供解决方法的网友


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
author-avatar
欧阳羽昌53
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有