商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 系统应用 > FreeBSD FTP 的架设教程

FreeBSD FTP 的架设教程

  发布于2026-06-02 阅读(0)

扫一扫,手机访问

FreeBSD 安装完成之后,其实系统里已经内置了 FTP 服务。只不过,默认情况下它并没有被激活。很多人觉得系统自带的 ftpd 功能相对简单,会选择用 proftpd 或 pu re-ftpd 这样的第三方方案来替代。但需要特别留意的是,FTP 服务程序经常爆出安全漏洞,选用第三方软件时一定要记得及时更新。

1. 使用 FreeBSD 内建的 ftpd 提供服务

基本上,只要 FreeBSD 装好了,FTP 服务程序 /usr/libexec/ftpd 就已经准备就绪。你只需要调整一下 /etc/inetd.conf 这个配置文件,本机用户就能直接使用 FTP 服务了。

1-1 打开 FTP 服务

FreeBSD 预装的 ftpd 支持两种运行模式:一种是独立的 daemon 模式(stand alone),另一种是由 inetd 这个超级守护进程来启动。从实际应用来看,daemon 模式更适合那些同时在线人数多、负载较重的主机。

1-1-1 方法一:daemon 模式 (stand alone)

1-1-1-1 立即启动 ftpd daemon

如果只是想临时开一下服务,直接跑一条命令就行了:

/usr/libexec/ftpd -D -l -l

参数解释一下:

  • -D :让 ftpd 以 daemon 的形式在后台运行。
  • -l :让 syslogd 记录每一次的连接。如果用了两个 -l,连用户具体做了什么操作都会记录下来。

不过要注意,-l 要生效,还得配合修改 /etc/syslog.conf,否则日志不会真正开始写。

ftpd 的选项其实挺多的,想了解更多可以 man ftpd 查看。

1-1-1-2 如何让 FreeBSD 开机时自动启动 ftpd

如果只靠上面的命令启动 ftpd daemon,下次重启就没了。为了让它开机自动跑起来,可以把启动命令放到 /etc/rc.local 里,或者仿照 /usr/local/etc/rc.d 里的脚本格式,自己写一个 ftpd.sh

例一:

ee /etc/rc.local

在文件里加上这么一行:

/usr/libexec/ftpd -D -l -l

例二:

仿照 /usr/local/etc/rc.d 里的脚本,新建一个 ftpd.sh

ee /usr/local/etc/rc.d/ftpd.sh

写入以下内容:

#!/bin/shftpd_flag="-l -l -S"ftpd="/usr/libexec/ftpd"case "$1" instart)        [ -x ${ftpd} ] && ${ftpd} -D ${ftpd_flag} > /dev/null && echo -n ' ftpd        ;;stop)        /usr/bin/killall ftpd > /dev/null && echo -n ' ftpd'        ;;*)        echo "Usage: `basename $0` {start|stop}" >&2        ;;esacexit 0

保存后,记得改一下文件权限,让它变成可执行:

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

这样,FreeBSD 启动时就会自动拉起 ftpd。你还可以通过 /usr/local/etc/rc.d/ftpd stop 来停止服务。想加什么启动参数,直接修改 ftpd_flag 那一行就行。

1-1-2 方法二:由 inetd 来启动 ftpd

这种方式,自然是修改 /etc/inetd.conf 了:

ee /etc/inetd.conf

先检查一下文件里有没有这一行:

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

如果行首是井字号(#),那说明 FTP 服务默认被关闭了。井字号代表注释,去掉就行了,改成下面这样:

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

保存后执行下面的命令,让 inetd 重新加载配置:

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

注意,这里的 ` 是 Esc 键下面那个反引号,不是单引号。

1-2 停止 FTP 服务

想停掉 FTP 服务,要看当初是用 daemon 模式启动的,还是 inetd 模式启动的。

1-2-1 daemon 模式

对于 daemon 模式,直接终止 ftpd 进程就可以了:

killall ftpd

如果之前是把 ftpd 放在 /etc/rc.local 里实现开机自启动,可以用下面的方法关掉它:

打开 /etc/rc.local 编辑:

ee /etc/rc.local

在执行 ftpd 的那一行前面加个井字号,保存好就行。

1-2-2 inetd 模式

如果是通过 inetd 模式提供服务的,就需要修改 inetd 的配置文件 /etc/inetd.conf,并让 inetd 重新读取配置。

打开 /etc/inetd.conf 编辑:

ee /etc/inetd.conf

在包含 ftpd 的那一行前面加上井字号,然后保存。

让 inetd 重读配置:

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

如果想确认 FTP 服务是不是真的停了,可以跑一下:

netstat -na

看看下面这一行是不是已经消失了:

tcp4 0 0 *.21 *.* LISTEN

1-3 限制使用者只能待在自己目录(chroot)

如果没有特殊设置,用户用 FTP 登录后可以在主机上自由切换目录。如果不想让他们到处乱跑,就得做一些配置。

1-3-1 方法一:利用 /etc/ftpchroot

FreeBSD 的 ftpd 通过 /etc/ftpchroot 来控制哪些用户或群组需要做 chroot。所以,新建或打开这个配置文件:

ee /etc/ftpchroot

在里面填入要限制的用户或群组:

gsyan

foo

@staff

上面的设置,会让 gsyanfoo 以及属于 staff 群组的用户都只能待在自己的目录里。

说明: 以 @ 开头的表示后面接的是群组名称。

能不能只开放一部分人不做 chroot,其他所有人都锁住?

新版 FreeBSD 的 ftpd 在 /etc/ftpchroot 里增加了新的配置项。如果 man ftpchroot 能看到说明,那就可以用下面的配置,只开放特定用户,其余全部锁定。

打开 /etc/ftpchroot 编辑:

ee /etc/ftpchroot

假设 admin 是管理员,可以到处浏览,就在文件里放这三行:

admin /

ftp .

@ www

保存后用 FTP 试一下,效果是这样的:

  • 第一行: admin 登录后会切换到根目录。
  • 第二行: 匿名登录保持原样,只能在指定的公共目录里活动。
  • 第三行: 其他所有用户登录后,只能待在个人目录下的 www 文件夹里。

这个第三行的场景很实用:如果服务器上装了 Apache 并且设置了 UserDir=www,以后只要告诉用户“把做好的网页直接 FTP 上传到主机就行”。以前还得费半天口舌解释“请放到 www 文件夹里”。不过,记得先帮用户建好 www 目录,不然他们连登录都登不进去。

在 FreeBSD 4.8R 之后,/etc/ftpchroot 又增加了新的功能,具体可以 man ftpchroot。(不过,旧版本可能没有这个 man page。)

1-3-2 方法二:利用 /etc/login.conf

这个方法是通过用户数据库(密码文件 /etc/master.passwd)里的 login class 字段,来设定用户属于哪个 class,然后在 /etc/login.conf 中定义各个 class 在 FTP chroot 上的行为。当 /etc/ftpchroot 不好用的时候,这个方式特别适合处理大批量用户。

打开 /etc/login.conf 进行修改:

ee /etc/login.conf

找到 default: 开头的几行,大概像这样:

default:\

:copyright=/etc/COPYRIGHT:\

:welcome=/etc/motd:\

......(略)

加入下面这一行:

:ftp-chroot:\

修改后变成:

default:\

:ftp-chroot:\

:copyright=/etc/COPYRIGHT:\

:welcome=/etc/motd:\

......(略)

然后执行下面的命令,把 login.conf 转换成数据库格式:

cap_mkdb /etc/login.conf

这样,所有用户都会被 chroot,活动范围被限定在自己的目录里。

那如果想全部管制,又单独开放某些管理员不做 chroot 呢?

上面的方法是设置了 default 这个 login class 要做 chroot,这是所有人的通用设定。想让管理员可以自由活动,就新建一个管理用的 class,然后把 ftp-chroot 属性去掉就行。

打开 /etc/login.conf,新增一个叫 admin 的管理员 class,并设置 ftp-chroot 为否:

ee /etc/login.conf

新增下面几行,注意蓝色的部分:

default:\

:ftp-chroot:\

:copyright=/etc/COPYRIGHT:\

:welcome=/etc/motd:\

......(略)

admin:\

:ftp-chroot@:\

:tc=default:

......(略)

然后执行:

cap_mkdb /etc/login.conf

注意,admin 这个 class 里用的是 :ftp-chroot@:\ftp-chroot 后面多了个小老鼠(@),它表示取反,也就是不做 ftp-chroot。

接下来,要告诉系统谁属于 admin 这个 login class。直接修改数据库:

vipw

把管理员(不做 chroot 的用户)的 login class 改成 admin

举个例子:假设管理员 gsyan 原来的记录是:

gsyan:*:1000:1000::0:0:大雄:/home/gsyan:/bin/tcsh

把它的 login class 改成 admin

gsyan:*:1000:1000:

admin

:0:0:大雄:/home/gsyan:/bin/tcsh

全部改完后保存文件,然后用不同身份登录 FTP 测试一下。

说明: FreeBSD 中 /etc/master.passwd 的密码字段按顺序是:名称:密码:UID:GID:class:强制换密码的时间:有效时间:资料:家目录:shell。所以要改的 login class 是第五个字段。关于密码文件的格式,可以 man 5 passwd 查看。

把不同身份的用户分成几个 login class,然后用 /etc/login.conf 来设定各身份所能使用的资源,这是一项相当实用的管理手段,值得深入研究。详细内容可以 man login.conf

1-4 提供匿名(访客用)的 FTP 服务

让访客可以从 FTP 站下载文件,这就是匿名 FTP 服务(Anonymous FTP)。要提供这项服务,必须有一个叫 ftp 的用户,并建好相关的目录和文件。如果不太清楚怎么搞,用 /stand/sysinstall 来操作是最省事的。步骤如下:

1. 调用 /stand/sysinstall

/stand/sysinstall

2. 出现‘/stand/sysinstall Main Menu’菜单后,按方向键移到‘

Configure

’,然后按

空格键

FreeBSD FTP 的架设教程

3. 进入‘FreeBSD Configuration Menu’后,按方向键移到‘

Networking

’,然后按

空格键

FreeBSD FTP 的架设教程

4. 进入‘Network Services Menu’后,按方向键移到‘

Anon FTP

’,然后按

空格键

FreeBSD FTP 的架设教程

5. 进入‘Anonymous FTP Configuration’后,输入对应的数据:

FreeBSD FTP 的架设教程

6. 输入完成后按 OK

7. 接着输入 FTP 的 GID(直接用默认值,按 Enter 键就行)。

FreeBSD FTP 的架设教程

8. 然后问是否要生成欢迎词(welcome message),直接按 Enter 键就行。

9. 输入欢迎词内容:

FreeBSD FTP 的架设教程

10. 编辑完后按 Esc 键,再按两次 Enter 键保存退出。

11. 最后都选菜单最上面的 Exit 退出。

/stand/sysinstall 到底帮你做了些什么?

  • 新增了一个叫 ftp 的用户。
  • 新增了对应的群组。
  • 创建了 FTP 相关的目录。
  • 把一些文件复制到 ~ftp/etc/ 下(包括 group、passwd、ftpmotd)。
  • 设置好了各个目录的权限:
目录名称拥有者权限
~ftproota-w
~ftp/etcroot555 (目录权限)

444 (pwd.db group ftpmod 三个档案)

~ftp/pubroota-w

一定要特别注意各个目录的权限。如果目录有 Write 权限,访客就能随意上传、修改、删除文件。一旦被有心人士发现可以随意上传文件,那网络流量可能会瞬间爆增。

相关配置文件:

  • /etc/ftpusers —— 禁止使用 FTP 的黑名单。
  • /etc/ftpchroot —— 需要做 chroot 的用户/群组列表。
  • /etc/ftphosts —— 虚拟主机的配置文件。
  • /etc/ftpwelcome —— 登录前的欢迎词。
  • /etc/ftpmotd —— 登录成功后自动显示的信息。
  • /var/run/nologin —— 如果这个文件存在,ftpd 会显示其内容并拒绝登录。
  • /var/log/ftpd —— 记录匿名登录时的传输状况(需要启动参数 -S,且该文件必须存在)。

其他更详细的设置和参数,请自行 man ftpd

1-5 让 ftpd 记录传输状况

ftpd 的启动参数 -l 可以让负责记录日志的 syslogd 把 FTP 连接情况记录下来。不过,我们得先配置 /etc/syslog.conf,并让 syslogd 重新加载配置,这样才能生效。

下面是具体步骤:

1. 创建一个空的日志文件 /var/log/ftpd

touch /var/log/ftpd

2. 修改 syslogd 的配置文件

打开 /etc/syslog.conf

ee /etc/syslog.conf

找到包含 mail.info 的那一行:

mail.info /var/log/maillog

在这一行的下面新增一行:

ftp.* /var/log/ftpd

加完后,按 Esc 键,再按两次 Enter 键保存文件。

3. 让 syslogd 重新加载配置

执行下面的命令通知 syslogd 重读配置:

kill -HUP `cat /var/run/syslogd.pid`

※ 注意:` 是键盘上那个反引号键。

2. FTP 的架设 — pu re-ftpd

  • 另一个值得考虑的 FTP 服务器方案

3. 以 wu-ftpd 架设 FTP (建议用其他方案替代)

雄曰:现在都直接用 FreeBSD 内建的 ftpd 了,下面的内容已经很久没更新,都是旧资料了,希望不会误导大家。

wu-ftp(Washington University FTP)因为功能强大,过去在 Unix-like 主机上被广泛采用。但也正因为用户多,它成了大家研究的重点对象,经常被发现存在安全漏洞。所以,安装后一定要经常关注安全公告,随时更新。

3-1 安装 wu-ftpd

方法一:用 packages

pkg_add -v ftp://ftp.tku.edu.tw/OS/FreeBSD/packages/packages-stable/Latest/wu-ftpd.tgz

方法二:用 ports

编译 wu-ftpd 时需要 autoconf213,记得先装好这个工具,并确认 ports tree 中有 /usr/ports/devel/autoconf213,否则会报错。

如果没有,可以执行下面的命令安装 autoconf213 并抓取 ports 相关文件:

pkg_add -v ftp://ftp.tku.edu.tw/OS/FreeBSD/packages/packages-stable/Latest/autoconf213.tgz

cd /usr/ports/devel

ncftpget -R ftp://freebsd.csie.nctu.edu.tw/pub/ports/ports/devel/autoconf213

cd /usr/ports/ftp

ncftpget -R ftp://freebsd.csie.nctu.edu.tw/pub/ports/ports/ftp/wu-ftpd

准备好后就可以编译安装了:

cd /usr/ports/ftp/wu-ftpd

make

make install

3-2 修改配置文件

wu-ftpd 会用到的配置文件如下:

  • /usr/local/etc/ftpaccess :主配置文件。
  • /usr/local/etc/ftpconversions :设置文件传输时的压缩/解压程序。
  • /usr/local/etc/ftpusers :黑名单,列在这里的用户无法用 FTP 登录。
  • /usr/local/etc/ftpgroups :黑名单,属于这个文件里群组的用户无法用 FTP 登录。
  • /usr/local/etc/ftphosts :黑名单,列在这里的主机无法用 FTP 登录。

安装完后,在 /usr/local/etc 里会有一些 ftp*.sample 的示例文件,复制一份来修改:

cd /usr/local/etc

cp ftpaccess.sample ftpaccess

cp ftpconversions.sample ftpconversions

cp ftpusers.sample ftpusers

cp ftpgroups.sample ftpgroups

cp ftphosts.sample ftphosts

稍微改改就能用了。

ftpaccess 中常用的配置:

功能语法
定义类(class)class 类名称 成员(real,guest,anonymous) 来源网址

class TP real,guest,anonymous *.tp.edu.tw

限制上线人数及时段limit class名称 人数 时间 信息文件(绝对路径)

limit TP 50 any /usr/local/etc/ftp.msg.Full

让 TP 这个 class 同时最多 50 个连接,满了就显示 ftp.msg.Full 中的内容

连接日志log commands class名称

log transfers class名称 inbound,outbound

控制可执行的指令delete yes 或 no 类

overwrite yes 或 no 类

rename yes 或 no 类

chmod yes 或 no 类

umask yes 或 no 类

连接时只显示主机名,不显示版本...greeting brief
连接时做 chrootrestricted-uid 用户

restricted-uid * (将所有用户 chroot)

不做 chrootunrestricted-uid 用户

unrestricted-uid gsyan (gsyan 不做 chroot)

wu-ftp 能做的事情实在太多,其他配置可以 man ftpaccess,保证收获满满。

3-3 修改 /etc/inetd.conf

我们打算让 wuftpd 以 inetd 模式提供服务,所以先修改 /etc/inetd.conf,然后让 inetd 重新加载配置。

打开 /etc/inetd.conf 修改:

ee /etc/inetd.conf

把包含 ftp 的那一行改成下面这样:

ftp stream tcp nowait root /usr/local/libexec/ftpd ftpd -a

然后让 inetd 重读配置:

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

最后用 netstat -na 观察服务是否启动,或者直接用 FTP 软件测试一下。

记得随时关注安全公告,有问题要马上更新程序,免得被黑。

本文转载于:https://www.jb51.net/os/Unix/8785.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注