首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ProFTPD 搭建FTP/S 服务器

ProFTPD 搭建FTP/S 服务器

作者头像
YaoQi
发布2025-07-14 19:17:04
发布2025-07-14 19:17:04
19500
代码可运行
举报
运行总次数:0
代码可运行

ProFTPD 是一个功能强大且灵活的 FTP 服务器软件。使用Apache服务器那样格式的配置文件。

安装 一、使用系统软件源 使用系统软件源可以安装Proftpd及其模块:

代码语言:javascript
代码运行次数:0
运行
复制
apt install proftpd
apt install proftpd-mod-ldap # 其他模块也是这样装

这样安装的模块一般都是动态加载的,使用前需要 LoadModule 指令加载,例如: LoadModule mod_test.c

二、自己编译 首先根据你用的系统,安装好编译环境(安装gcc编译器等,本文略)

在官网 http://www.proftpd.org/ 下载最新的软件包,解压:

代码语言:javascript
代码运行次数:0
运行
复制
wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.9rc3.tar.gz
tar xzf proftpd-1.3.9rc3.tar.gz

配置:

代码语言:javascript
代码运行次数:0
运行
复制
./configure --enable-nls \
--enable-openssl \
--with-modules=mod_tls

--enable-nls # 开启本地化支持 --enable-openssl # 开启 openssl --with-modules=mod_tls # 编译 tls 模块

可以执行 ./configure --help 查看具体编译参数说明。

然后执行编译:

代码语言:javascript
代码运行次数:0
运行
复制
make

就可以看到路径下编译出的程序和工具了:

然后安装:

代码语言:javascript
代码运行次数:0
运行
复制
make install

默认会安装到 /usr/local 下,当然可以指定安装路径,例如 --prefix=$HOME。 如果configure、make多次,每次参数不同可能造成编译环境混乱,编译报错,记得执行make distclean重新来过。 使用./proftpd -l查看编译进去的模块,使用./proftpd -V可以查看configure参数。

配置 配置文件 /etc/proftpd.conf 或 /usr/local/etc/proftpd.conf,也可以用-c参数指定。 配置文件的结构如下:

代码语言:javascript
代码运行次数:0
运行
复制
##########################################################################
##  ==================== 主服务器配置 =======================
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> 配置格式为:

代码语言:javascript
代码运行次数:0
运行
复制
<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

动作:

代码语言:javascript
代码运行次数:0
运行
复制
AllowUser:允许某个用户
DenyUser:禁止某个用户
AllowGroup:允许某个用户组
DenyGroup:禁止某个用户组
AllowAll:允许所有用户
DenyAll:禁止所有用户

Limit 结合 Directory 示例: 详见 http://www.proftpd.org/docs/howto/Limit.html

代码语言:javascript
代码运行次数:0
运行
复制
 ## 允许用户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>

环境变量的使用:

代码语言:javascript
代码运行次数:0
运行
复制
<IfDefined USE_MASQ_ADDR>
    MasqueradeAddress %{env:EC2_PUBLIC_HOSTNAME}
</IfDefined>

下边是基础配置实战

配置1 用户登录,指定工作路径

代码语言:javascript
代码运行次数:0
运行
复制
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/路径下。

代码语言:javascript
代码运行次数:0
运行
复制
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 然后在配置中添加如下命令:

代码语言:javascript
代码运行次数:0
运行
复制
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存储验证信息,默认不会编译这些模块,需要的朋友请自行阅读文档。

配置2 匿名登录

代码语言:javascript
代码运行次数:0
运行
复制
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 相当于它的别名。

配置3 FTPS

证书的申请我就不涉及了,和HTTPS证书一样。

代码语言:javascript
代码运行次数:0
运行
复制
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,不推荐了),需要修改和添加如下配置:

代码语言:javascript
代码运行次数:0
运行
复制
        Port 990 # 端口改为990,21端口就没了
        TLSOptions UseImplicitSSL # 添加此配置

如果希望同时支持 explicit 和 implicit 模式,也就是同时侦听21和990端口, 需要配置 VirtualHost:

代码语言:javascript
代码运行次数:0
运行
复制
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/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 漫跑的小兔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 下边是基础配置实战
    • 配置1 用户登录,指定工作路径
    • 配置2 匿名登录
    • 配置3 FTPS
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档