游乐游手机版
首页/系统平台/文章详情

FreeBSD6.2 FTP服务器架设详细教程

时间:2026-06-18 07:45
FTP协议有一个颇具特色的特点:它在工作时需要建立两条独立的连接——一条用于传输控制指令,另一条用于传输实际数据。当你使用FTP客户端连接到服务器时,首先会连接到服务器的21号端口,建立一条“控制连接”。随后,你输入的账号、密码以及各种命令,还有服务器返回的响应,都通过这条控制连接进行传输。但是当你

FTP协议有一个颇具特色的特点:它在工作时需要建立两条独立的连接——一条用于传输控制指令,另一条用于传输实际数据。当你使用FTP客户端连接到服务器时,首先会连接到服务器的21号端口,建立一条“控制连接”。随后,你输入的账号、密码以及各种命令,还有服务器返回的响应,都通过这条控制连接进行传输。但是当你要真正下载一个文件,或者执行ls命令列出目录内容时,这些数据就会走另一条“数据连接”。数据连接的流量通常远大于控制连接,而控制连接只负责传输指令和简单的确认信息。

一个完整的FTP连接建立过程大致如下:

  • 客户端在自己的机器上随机开启一个大于1024的端口,连接到服务器的21号端口,建立控制连接。
  • 客户端告知服务器:“我准备好了,数据连接要用哪个端口?”
  • 服务器从自己的20号端口主动连接到客户端刚才开放的端口,建立数据连接。

这种由服务器主动发起数据连接的方式,称为主动模式。在没有任何防火墙或NAT的环境下,主动模式运行非常顺畅。但问题在于——如果客户端存在防火墙,主动模式就可能受阻。需要注意的是,FreeBSD自带的NAT会自动处理这种转换,但其他防火墙不一定支持FTP的主动模式,很容易导致连接失败。

要解决这个麻烦,可以在连接时改用被动模式。被动模式的做法正好相反:由服务器打开一个端口,被动等待客户端来连接,从而建立数据连接。具体过程如下:

  • 客户端依然先开启一个大于1024的端口,连接到服务器的21号端口,建立控制连接。
  • 客户端告知服务器:“我要进入被动模式。”
  • 服务器打开一个大于1024的端口,然后等待客户端来连接。
  • 客户端在自己的机器上再开启一个大于1024的端口,主动连接到服务器刚才打开的那个端口,建立数据连接。

因为控制连接和数据连接都是由客户端主动发起,防火墙和NAT就不会再干扰了。如果你登录一台FTP服务器后输入ls却等了很久没有反应,不妨按Ctrl+C中断命令,然后输入passive进入被动模式,再试一次ls。如果能正常列出目录,那么问题多半是主动模式引起的。

设定FTP服务器

FreeBSD系统内建了FTP服务器功能,使用的是ftpd,无需额外安装,只需做好配置即可使用。

启动FTP服务器

启动ftpd有两种方式:一种是用standalone daemon直接运行,另一种是通过inetd来托管。许多系统服务(如telnet、ssh、ftp)都倾向于使用inetd启动,其好处是可以统一管理,并且能在此基础上添加访问规则,比如屏蔽某些IP来源。但inetd也有缺点——每次有连接请求时,inetd需要根据请求类型去执行对应的程序,所以响应速度会稍慢。如果运行的是专门的FTP服务器,采用standalone方式更合适:直接将FTP daemon启动,有新连接时由它自行fork出新进程处理,速度更快。

使用inetd启动:

编辑/etc/inetd.conf,找到ftp相关配置,将行首的#去掉:

ftp     stream  tcp     nowait  root    /usr/libexec/ftpd      ftpd -l
ftp     stream  tcp6    nowait  root    /usr/libexec/ftpd      ftpd -l

修改完成后让inetd重新加载配置:

kill -1 `cat /var/run/inetd.pid`

现在FTP服务就可以使用了。

使用standalone方式启动:

首先确认inetd.conf中没有启用FTP服务。然后新建一个启动脚本/usr/local/etc/rc.d/ftpd.sh,内容如下:

#!/bin/sh
ftpd_program="/usr/libexec/ftpd"
ftpd_flags="-D -l"
case $1 in
start)
    echo "Starting FTPD"
    $ftpd_program $ftpd_flags
    ;;
stop)
    echo "Stopping FTPD"
    killall ftpd
    ;;
restart)
    $0 stop
    sleep 1
    $0 start
    ;;
esac

编辑完成后,给脚本添加执行权限:

chmod 755 /usr/local/etc/rc.d/ftpd.sh

然后就可以通过这个脚本来启动或停止FTP服务了:

/usr/local/etc/rc.d/ftpd.sh start   # 启动
/usr/local/etc/rc.d/ftpd.sh stop    # 停止

编辑欢迎信息

连接FTP站点时,通常会看到两段欢迎信息:一段是登录前的,开头带有220-,称为欢迎信息;另一段是登录后的,开头带有230-,称为当日信息。这两段都可以自定义。

登录前的欢迎信息存放在/etc/ftpwelcome,你只需将想要显示的内容写进去即可,不需要自己添加220之类的代码,服务器会自动添加。登录后的信息存放在/etc/ftpmotd,直接编辑即可。

FTP服务器管理

启动FTP服务器时可以附加一些参数来调整行为,比如修改默认端口、记录上传下载日志等。有些参数只能在standalone模式下使用,有些在inetd模式下也能生效。下面是一些常用参数:

参数仅Daemon模式说明
-a当有多张网卡或多个IP时,只接受指定IP的连接。例如 ftpd -D -a 192.168.0.1 表示只允许连接192.168.0.1这个IP。
-d记录FTP的调试信息。使用此参数时还需要修改/etc/syslog.conf,加入 !ftpd*.* /var/log/ftpd.log 来保存日志。
-h不显示FTP服务器的主机名、软件信息、版本等。
-l记录FTP登录成功和失败的信息。如果使用两次-l,还会记录上传、下载、删除、创建目录等操作。默认日志保存在/var/log/xferlog
-P改变默认端口号。FTP默认使用21端口,通过-P可以指定其他端口。

在inetd模式下,修改/etc/inetd.conf中ftp那一行的最后,加上参数即可,例如:

ftp  stream  tcp     nowait  root  /usr/libexec/ftpd    ftpd -l -l -d
ftp  stream  tcp6    nowait  root  /usr/libexec/ftpd    ftpd -l -l -d

如果是standalone方式,修改/usr/local/etc/rc.d/ftpd.sh中的ftpd_flags变量即可。

FTP权限控制

默认情况下,FTP启动后用户可以在权限允许的范围内上传、下载文件,并进入系统中的任意目录(如果目录权限允许)。我们可以通过一些规则来限制特定账号的登录:

  • 如果/var/run/nologin存在,则所有账号都不能登录——这个文件可以用来临时暂停FTP服务。
  • 用户必须有密码才能登录,没有密码的账号无法登录。
  • 用户名不能出现在/etc/ftpusers中。
  • 用户所属的群组不能出现在/etc/ftpusers中(群组名前加@)。
  • 用户使用的shell必须是合法的shell(定义在/etc/shells中)。
  • 除非是匿名模式,否则用户名不能是ftpanonymous

关于/etc/ftpusers 这个文件列出了禁止使用FTP的用户和群组。默认已经包含了一些系统账号,你可以自行添加或删除。

关于/etc/hosts.allow(仅inetd模式有效): 所有由inetd托管的服务都可以通过TCP Wrapper来控制连接来源。例如,限制某些IP或网域不能使用FTP:

ftpd : localhost : allow
ftpd : 210.122.13.5 : deny
ftpd : .evil.cracker : deny
ftpd : ALL : allow

如果只想允许特定来源访问,可以这样设置:

ftpd : localhost : allow
ftpd : 192.168.0. : allow
ftpd : my.friend.com : allow
ftpd : ALL : deny

上传和下载权限控制: 可以在启动参数中加入以下参数进行限制:

参数说明
-o限制所有用户只能上传,不能下载任何文件。
-r限制所有用户只能只读访问,不能创建目录、上传、改名或执行任何会修改文件系统的操作。

使用chroot限制用户目录: 默认情况下用户登录后会进入自己的家目录,但可以切换到其他系统目录。如果想要用户只能在自己的家目录中活动,可以使用chroot功能。所谓chroot,就是把某个目录变成用户看到的根目录。比如让用户alex登录后,将/home/alex作为根目录,那么他执行cd /还是会停留在/home/alex,执行pwd也会显示/。这样可以防止用户到处乱跑,大幅提升安全性。

配置chroot很简单,编辑/etc/ftpchroot即可。下面是一个例子:

alex
@guest
john /var/ftp
@other /var/ftp

第一行表示用户alex登录后以自己家目录为根目录;第二行的@guest表示群组guest下的所有用户都以自己家目录为根目录;第三、四行分别指定用户john和群组other以/var/ftp为根目录。建议在开放FTP服务时,将每个用户都添加到/etc/ftpchroot中。

匿名FTP: 在FreeBSD的FTP服务器上,你可以使用anonymousftp这两个用户名登录,密码任意。这就是匿名FTP。这两个账号会映射到系统内的真实用户ftp。要启用匿名FTP,需要先创建这个系统账号:

pw adduser ftp
mkdir /home/ftp
chown ftp:ftp /home/ftp

使用pw命令创建的用户,/etc/master.passwd中的密码字段默认是*,表示不能用于登录系统——这个账号除了匿名FTP外,不能用于telnet、SSH等其他服务。创建完成后,匿名FTP就生效了。匿名用户登录后会自动被chroot到其家目录中。

针对匿名用户,还有几个额外的启动参数可以进一步限制:

参数说明
-M禁止匿名用户创建新目录。
-m允许匿名用户覆盖已有的同名文件。默认情况下,如果上传的文件名已存在,系统会自动改名。
-O让匿名用户只能上传,不能下载。

此外,前面提到的-r-o等通用参数也同样适用于匿名用户。匿名FTP一旦开放,任何人都能登录,如果没有做好权限控制,安全风险会很高,需要谨慎对待。

以上介绍的是FreeBSD系统自带的ftpd的配置方法。如果希望搭建功能更强大的FTP服务器,可以考虑使用proftpd等工具,在FreeBSD的ports中(/usr/ports/ftp)就能找到。

来源:https://www.jb51.net/os/Unix/1495.html
上一篇FreeBSD系统常用命令速查表与快速实用技巧详解 下一篇OpenBSD 4.1 Apache+MySQL+PHP环境配置
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
微软详解Win11时间点还原 默认每24小时创建恢复点
系统平台 · 2026-06-30

微软详解Win11时间点还原 默认每24小时创建恢复点

微软今日推送了最新的 6 月可选更新,并发布博客详细解读了 Win11 全新的“时间点还原”(Point-in-time restore)功能——这一功能本质上是对系统恢复体验的一次全面升级,旨在让用户更轻松地应对电脑故障。 微软表示,面向 Windows 11 客户端用户的“时间点还原”功能现已正

Win11 26H1六月可选更新KB5095091 优化放大镜改善装机体验
系统平台 · 2026-06-30

Win11 26H1六月可选更新KB5095091 优化放大镜改善装机体验

微软今天推送了Windows 11 26H1设备的6月可选更新KB5095091,安装完成后系统版本号会升级到Build 28000 2340。值得一提的是,这次更新并非面向所有设备,而是专门为搭载高通骁龙X2系列芯片的机型准备的——包括骁龙X2 Plus、X2 Elite和X2 Elite Ext

Win11六月可选更新KB5095093修复回收站弹窗异常
系统平台 · 2026-06-30

Win11六月可选更新KB5095093修复回收站弹窗异常

微软已悄然推送Windows 11六月可选更新,编号KB5095093。本次更新覆盖两个版本:24H2用户安装后版本号升级至Build 26100 8737,而25H2用户则更新至Build 26200 8737。 本次更新并非仅是小修小补,而是带来了多项实质性新功能。下面我们就来详细解析这些更新内

苹果macOS 27 Beta2封堵Siri AI跳过候补名单漏洞
系统平台 · 2026-06-30

苹果macOS 27 Beta2封堵Siri AI跳过候补名单漏洞

科技媒体 Cult of Mac 昨日(6月23日)发布博文指出,苹果在 macOS 27 Beta 2 更新中悄然封堵了一个此前可用的后门——用户曾能通过一条终端命令绕过候补名单,直接启用新版 Siri AI,如今这一方法已失效。 简要回顾一下:在 macOS 27 Beta 1 阶段,只需在 M

微软加速Win11 25H2推送 覆盖所有符合条件家用PC
系统平台 · 2026-06-30

微软加速Win11 25H2推送 覆盖所有符合条件家用PC

近日(6月23日),科技媒体 Windows Latest 发布了一则值得关注的动态:微软已进一步扩大 Windows 11 25H2 的推送范围,所有满足硬件要求、且不受 IT 部门管理的家庭版和专业版设备,现在均可顺利接收本次更新。 此次升级有一个显著特点——采用“启用包”(eKB)方式进行推送