FreeBSD6.2 FTP服务器架设详细教程
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中)。 - 除非是匿名模式,否则用户名不能是
ftp或anonymous。
关于/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服务器上,你可以使用anonymous或ftp这两个用户名登录,密码任意。这就是匿名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)就能找到。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
微软详解Win11时间点还原 默认每24小时创建恢复点
微软今日推送了最新的 6 月可选更新,并发布博客详细解读了 Win11 全新的“时间点还原”(Point-in-time restore)功能——这一功能本质上是对系统恢复体验的一次全面升级,旨在让用户更轻松地应对电脑故障。 微软表示,面向 Windows 11 客户端用户的“时间点还原”功能现已正
Win11 26H1六月可选更新KB5095091 优化放大镜改善装机体验
微软今天推送了Windows 11 26H1设备的6月可选更新KB5095091,安装完成后系统版本号会升级到Build 28000 2340。值得一提的是,这次更新并非面向所有设备,而是专门为搭载高通骁龙X2系列芯片的机型准备的——包括骁龙X2 Plus、X2 Elite和X2 Elite Ext
Win11六月可选更新KB5095093修复回收站弹窗异常
微软已悄然推送Windows 11六月可选更新,编号KB5095093。本次更新覆盖两个版本:24H2用户安装后版本号升级至Build 26100 8737,而25H2用户则更新至Build 26200 8737。 本次更新并非仅是小修小补,而是带来了多项实质性新功能。下面我们就来详细解析这些更新内
苹果macOS 27 Beta2封堵Siri AI跳过候补名单漏洞
科技媒体 Cult of Mac 昨日(6月23日)发布博文指出,苹果在 macOS 27 Beta 2 更新中悄然封堵了一个此前可用的后门——用户曾能通过一条终端命令绕过候补名单,直接启用新版 Siri AI,如今这一方法已失效。 简要回顾一下:在 macOS 27 Beta 1 阶段,只需在 M
微软加速Win11 25H2推送 覆盖所有符合条件家用PC
近日(6月23日),科技媒体 Windows Latest 发布了一则值得关注的动态:微软已进一步扩大 Windows 11 25H2 的推送范围,所有满足硬件要求、且不受 IT 部门管理的家庭版和专业版设备,现在均可顺利接收本次更新。 此次升级有一个显著特点——采用“启用包”(eKB)方式进行推送
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2026-06-30 07:39
2026-06-30 07:39
2026-06-30 07:39
2026-06-30 07:38
2026-06-30 07:38
2026-06-30 07:38
2026-06-30 07:38
2026-06-30 07:38
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

