ProFTPD 是一个功能强大且灵活的 FTP 服务器软件。使用Apache服务器那样格式的配置文件。
安装 一、使用系统软件源 使用系统软件源可以安装Proftpd及其模块:
apt install proftpd
apt install proftpd-mod-ldap # 其他模块也是这样装
这样安装的模块一般都是动态加载的,使用前需要 LoadModule 指令加载,例如:
LoadModule mod_test.c
二、自己编译 首先根据你用的系统,安装好编译环境(安装gcc编译器等,本文略)
在官网 http://www.proftpd.org/ 下载最新的软件包,解压:
wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.9rc3.tar.gz
tar xzf proftpd-1.3.9rc3.tar.gz
配置:
./configure --enable-nls \
--enable-openssl \
--with-modules=mod_tls
--enable-nls # 开启本地化支持 --enable-openssl # 开启 openssl --with-modules=mod_tls # 编译 tls 模块
可以执行 ./configure --help
查看具体编译参数说明。
然后执行编译:
make
就可以看到路径下编译出的程序和工具了:
然后安装:
make install
默认会安装到 /usr/local 下,当然可以指定安装路径,例如 --prefix=$HOME。
如果configure、make多次,每次参数不同可能造成编译环境混乱,编译报错,记得执行make distclean
重新来过。
使用./proftpd -l
查看编译进去的模块,使用./proftpd -V
可以查看configure参数。
配置 配置文件 /etc/proftpd.conf 或 /usr/local/etc/proftpd.conf,也可以用-c参数指定。 配置文件的结构如下:
##########################################################################
## ==================== 主服务器配置 =======================
ServerName "ProFTPD Default Installation"
ServerType standalone # 服务器类型
DefaultServer on # 当前级别配置作为默认服务器
UseEncoding UTF- CP936 # 支持的编码格式(中文)
DefaultAddress 0.0.0.0 # 主服务器侦听的IP地址,也可以通过域名,接口名指定
Port # 侦听的端口
MasqueradeAddress 1.2.3.4 # 地址伪装,用于被动模式下发给客户端连接的地址
# 云主机等本机分配的是私网地址,如果直接发给客户端连不上
PassivePorts # 被动模式端口范围
UseIPv6 off # on开启或off禁用IPv6
Umask # 默认掩码
MaxInstances # 最大实例数,每个连接过来会建一个实例提供服务
MaxClientsPerHost # 每用户线程
MaxClients # 最大用户数
MaxLoginAttempts # 最大尝试连接次数
DefaultTransferMode binary # 默认传输模式
AllowRetrieveRestart on # 允许断点继传(上传)
AllowStoreRestart on # 允许断点继传(下载)
SystemLog /var/log/proftp.log #产生独立的日志文件. (如果想指定自己的日志格式可以结合(ExtendLog,LogFormat)两个选项设置)
TransferLog /var/log/proftp.log #记录用户下载的日志信息
User nobody # 设置主程序的用户身份,用户登录会会以用户身份新建子程序处理
Group nogroup # 设置主程序的组身份
AllowOverwrite on # 文件可被覆盖
DefaultRoot /var/ftp # 指定共享根目录为/var/ftp
RequireValidShell off # 登录用户是否有shell,虚拟用户一般都没有
UseFtpUsers off # 不检查文件 /etc/ftpusers(这个文件是禁用用户列表)
RootLogin on # 允许root登录
UseReverseDNS off # 关闭反向DNS查询,加速登录
IdentLookups off # 关闭身份识别,加速登录
<Global> # 全局的默认配置,后边有特别配置的按后边的配置
</Global>
<Class 名字> # 客户端IP分组,用于访问控制
</Class>
<Directory 路径> # 指定在特定路径下,不同用户授予不同权限
</Directory> # 下级路径默认会继承上级的配置
<Anonymous 根路径> # 匿名登录相关设置,会被chroot到后边的根路径
</Anonymous>
## ================== 虚拟服务器的配置 ==================================
<VirtualHost 域名 IP 接口> # ,用域名,IP等侦听不同的地址
# VirtualHost 内部相当于是一个独立的服务器配置,但和HTTP的vhost不同
# HTTP的vhost是在一个IP和端口上接受连接,按Host头中的域名分配给不同的网站。
# FTP没有Host这种机制,必须用不同的IP或端口接收不同的服务。
# 我认为本质上FTP是发布一个存储,按登录用户给不同路径授权的方式工作的,
# VirtualHost只是为多IP的服务器准备的。
#
# 前边提到的Global,Directory,Anonymous 和各种配置都可以出现在此段中
#
</VirtualHost>
#########################################################################
接下来介绍下 <Limit>
配置格式为:
<Limit 命令 命令 命令>
动作
动作
</Limit>
用于配置“是否允许”“用户”在不同路径可执行的“FTP命令”。
要注意,每个连接进来后,会以某个用户或组权限运行,这个命令不会覆盖文件系统上文件的用户和组权限。 Limit配置会继承自上级路径,除非重新指定。
命令: 支持的FTP命令列表参看:http://www.proftpd.org/docs/howto/FTP.html 命令组: ALL : 所有FTP命令(除了LOGIN) DIRS: CDUP, CWD, LIST, MDTM, MLSD, MLST, NLST, PWD, RNFR, STAT, XCUP, XCWD, XPWD LOGIN: 用户登录 READ: RETR, SIZE WRITE: APPE, DELE, MKD, RMD, RNTO, STOR, STOU, XMKD, XRMD
动作:
AllowUser:允许某个用户
DenyUser:禁止某个用户
AllowGroup:允许某个用户组
DenyGroup:禁止某个用户组
AllowAll:允许所有用户
DenyAll:禁止所有用户
Limit 结合 Directory 示例: 详见 http://www.proftpd.org/docs/howto/Limit.html
## 允许用户barb和dave以及ftpuser组中的任何用户登录。所有其他用户都将被拒绝
<Limit LOGIN>
AllowUser barb
AllowUser dave
AllowGroup ftpuser
DenyAll
</Limit>
## proftpd 默认是allow优先的,遇到allow就会生效,遇到deny还会继续向后看。
## 也可以认为,程序先处理所有的allow,然后处理所有的deny,遇到匹配的就执行。
## 如果希望优先deny,可以配置: Order deny,allow
## 例如:
<Directory /path/to/uploads>
<Limit ALL>
DenyAll # 阻止使用/path/to/uploads目录中的所有FTP命令。
</Limit>
<Limit CDUP CWD PWD XCWD XCUP>
AllowAll # 应该允许使用CDUP和CWD命令(及其X变体),以便客户端可以进出目录。
</Limit>
<Limit STOR STOU>
AllowAll # 接下来,允许STOR和STOU,这样客户端就可以实际将文件上传到目录中(假设文件系统权限也允许客户端在目录中写入文件)。
# WRITE命令组也可以被使用,但它也允许创建和删除子目录,这在仅上传配置中通常是不需要的。
</Limit>
</Directory>
## 客户端可以从目录上传和下载文件,但他们看不到目录中的内容
<Directory /path/to/dir>
<Limit LIST NLST MLSD MLST STAT>
DenyAll
</Limit>
</Directory>
## 禁止 dave 从1.2.3.4 IP 登录
<IfUser dave>
<Limit LOGIN>
Deny from 1.2.3.4
</Limit>
</IfUser>
## 只允许从特定IP段登录
<Class friends>
From 1.2.3.4/8
</Class>
<IfUser dave>
<Limit LOGIN>
AllowClass friends
DenyAll
</Limit>
</IfUser>
## 禁用主动模式
<Limit EPRT PORT>
DenyAll
</Limit>
## 禁用被动模式
<Limit EPSV PASV>
DenyAll
</Limit>
## 配置只读用户
<Directory ~user>
<Limit CWD PWD DIRS READ>
AllowUser user
</Limit>
<Limit ALL>
DenyUser user
</Limit>
</Directory>
## 禁止删除一个路径,但可以删除子路径
<Directory /path/to/dir>
<Limit RMD XRMD>
DenyAll
</Limit>
</Directory>
<Directory /path/to/dir/*>
<Limit RMD XRMD>
AllowAll
</Limit>
</Directory>
## 禁止删除和重命名路径
<Directory /path/to/dir>
<Limit RMD RNFR RNTO XRMD>
DenyAll
</Limit>
</Directory>
环境变量的使用:
<IfDefined USE_MASQ_ADDR>
MasqueradeAddress %{env:EC2_PUBLIC_HOSTNAME}
</IfDefined>
ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultAddress 0.0.0.0
Port
MaxInstances
MaxClients
MaxLoginAttempts
TimeoutStalled
User nobody
Group nogroup
AllowRetrieveRestart on # 允许断点继传(上传)
AllowStoreRestart on # 允许断点继传(下载)
UseEncoding UTF- CP936
Umask
RequireValidShell off# 允许没有合法shell的用户(那些被配置来运行守护进程不需要登录的用户)登录
RootLogin on# 允许root登录
DefaultRoot ~ # 用户的家路径 /home/username
配置1说明: 这个配置会以nobody,nogroup身份,在所有IP上侦听21端口。 用Linux系统用户名和密码登录(/etc/ftpusers中的用户不允许登录,root登录需要加配置RootLogin on,没有合法shell的用户也要特殊配置RequireValidShell off)。 登录后会以登录用户身份创建子进程。
按 DefaultRoot 的配置提供路径供操作,本例配置的是家路径,如果配置其他路径需要注意相关的路径遵循Linux的权限控制,必须有权限操作才行。如果开启了 SELinux、AppArmor 等安全机制,也需要注意相关授权。
不想用Linux系统用户登录,可以不可以单独配置? 答案是肯定的。
首先制作单独的用户和组文件。 需要借助随带的 ftpasswd 工具生成,此工具一般位域源码的./contrib/路径下。
ftpasswd --passwd --name=demo_usr --uid= --home=/home/demo_usr --shell=/bin/false
ftpasswd --group --name=demo_group --gid= --member=demo_usr
默认生成的文件位于当前路径下 ./ftpd.passwd,./ftpd.group ,可以用--file 指定,更多操作查看帮助:ftpasswd --help 然后在配置中添加如下命令:
AuthOrder mod_auth_file.c mod_auth_unix.c # 系统默认值,先用指定文件,再用系统用户文件
# 如果想禁用系统用户,请删掉 mod_auth_unix.c
# 使用特定文件提供用户和组文件
AuthUserFile /path/to/ftpd.passwd
AuthGroupFile /path/to/ftpd.group
proftpd 也支持mod_ldap,mod_sql,mod_radius,mod_auth_pam存储验证信息,默认不会编译这些模块,需要的朋友请自行阅读文档。
ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultAddress 0.0.0.0
Port
MaxInstances
MaxClients
MaxLoginAttempts
TimeoutStalled
User nobody
Group nogroup
AllowRetrieveRestart on # 允许断点继传(上传)
AllowStoreRestart on # 允许断点继传(下载)
UseEncoding UTF- CP936
Umask
RequireValidShell off# 允许没有合法shell的用户(那些被配置来运行守护进程不需要登录的用户)登录
RootLogin on# 允许root登录
DefaultRoot ~ # 用户的家路径 /home/username
# 在前边配置的基础上增加匿名登录的配置:
<Anonymous ~ftp> # ftp用户的家路径
User ftp
Group ftp
# We want clients to be able to login with "anonymous" as well as "ftp"
UserAlias anonymous ftp
</Anonymous>
用户可以用 ftp 用户名或 anonymous 无密码登录,根路径是 ~ftp (注意和~/ftp的区别) 很多客户端不填写用户名会默认以 anonymous 向服务器发出请求。 匿名登陆后,proftp也需要有个用户身份,就是配置中的 User 和 Group ,也可以直接用 User 指定的用户名无密码登录,anonymous 相当于它的别名。
证书的申请我就不涉及了,和HTTPS证书一样。
ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultAddress 0.0.0.0
Port
MaxInstances
MaxClients
MaxLoginAttempts
TimeoutStalled
User nobody
Group nogroup
AllowRetrieveRestart on # 允许断点继传(上传)
AllowStoreRestart on # 允许断点继传(下载)
UseEncoding UTF- CP936
Umask
RequireValidShell off# 允许没有合法shell的用户(那些被配置来运行守护进程不需要登录的用户)登录
RootLogin on# 允许root登录
DefaultRoot ~ # 用户的家路径 /home/username
# 其他配置参考上边的配置,增加如下部分:
<IfModule mod_tls.c>
TLSEngine on
TLSLog /path/tls.log
TLSProtocol TLSv1. TLSv1.
TLSRequired on # 禁用FTP,只允许FTPS,如需同时支持FTP,改为off
TLSRSACertificateFile /path/ftp.cert
TLSRSACertificateKeyFile /path/ftp.key
TLSCipherSuite HIGH:!aNULL:!MD5
TLSVerifyClient off
</IfModule>
使用 Implicit 模式(在端口990连接FTPS,不推荐了),需要修改和添加如下配置:
Port 990 # 端口改为990,21端口就没了
TLSOptions UseImplicitSSL # 添加此配置
如果希望同时支持 explicit 和 implicit 模式,也就是同时侦听21和990端口, 需要配置 VirtualHost:
ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultAddress 0.0.0.0
Port
MaxInstances
MaxClients
MaxLoginAttempts
TimeoutStalled
User nobody
Group nogroup
AllowRetrieveRestart on # 允许断点继传(上传)
AllowStoreRestart on # 允许断点继传(下载)
UseEncoding UTF- CP936
Umask
RequireValidShell off # 允许没有合法shell的用户(那些被配置来运行守护进程不需要登录的用户)登录
RootLogin on # 允许root登录
DefaultRoot ~ # 用户的家路径 /home/username
# 其他配置同上边正常配置,下边是新加配置:
<Global>
<IfModule mod_tls.c>
TLSEngine on
TLSLog /path/tls.log
TLSProtocol TLSv1. TLSv1.
#TLSRequired on
TLSRSACertificateFile /path/ftp.cert
TLSRSACertificateKeyFile /path/ftp.key
TLSCipherSuite HIGH:!aNULL:!MD5
TLSVerifyClient off
</IfModule>
</Global>
## 主服务器配置也会使用Global
<IfModule mod_tls.c>
<VirtualHost 0.0.0.0>
Port
TLSOptions UseImplicitSSL
# 其他配置从Global继承,不用Global,需要重写一遍
# Global外的一些配置可能没有继承,如果需要请自行添加进Global,或者单独添加到这里
</VirtualHost>
</IfModule>
注意 VirtualHost 中的配置和 主配置相对独立,除了从Global继承,都需要重写。
ProFTP的简单使用就写到这里了,有问题可以多看下文档,文档上还有好多功能的配置例子。 参考:http://www.proftpd.org/docs/