是的,你发现了一个很有意思的现象:FreeBSD安装好后,FTP服务器其实就已经躺在系统里了,只不过默认是“按兵不动”的状态。不少朋友会觉得系统自带的ftpd功能太素,转身就去装proftpd、pu re-ftpd这些功能更花哨的替代品。这也无可厚非,但用第三方软件就得多留个心眼——FTP这玩意儿历
FreeBSD FTP服务器架设教程
作者:技术拾光
时间:2026-07-31
浏览:270
是的,你发现了一个很有意思的现象:FreeBSD安装好后,FTP服务器其实就已经躺在系统里了,只不过默认是“按兵不动”的状态。不少朋友会觉得系统自带的ftpd功能太素,转身就去装proftpd、pu re-ftpd这些功能更花哨的替代品。这也无可厚非,但用第三方软件就得多留个心眼——FTP这玩意儿历来是安全漏洞的高发区,必须时时关注更新,否则容易“引狼入室”。
其实,对很多场景来说,FreeBSD自带的ftpd完全够用了。它稳定、安全,而且和系统浑然一体。下面,我们就从头到尾把ftpd的玩法梳理一遍。
## 1 以 FreeBSD 內建的 ftpd 提供服务
FreeBSD安装完成后,FTP的服务程序`/usr/libexec/ftpd`就已经就位了。你只需要动一动`/etc/inetd.conf`这个配置文件,本机用户就能立刻用上FTP服务。
### 1-1 打开 FTP 服务
FreeBSD内置的ftpd支持两种运行模式:一种是独立守护进程(stand alone),另一种是由inetd(互联网超级守护进程)按需唤醒。怎么选?如果服务器在同一时间需要应对大量并发FTP连接,负载较重,那么用daemon模式会更合适。
#### 1-1-1 方法一:daemon 模式 (stand alone)
**立即启动 ftpd daemon**
如果只是想立刻让服务跑起来,执行下面这行命令就行:
```
/usr/libexec/ftpd -D -l -l
```
各参数的含义:
* **-D** :告诉ftpd以daemon的形式在后台运行。
* **-l** :让syslogd记录每次的连接。连用两个`-l`,连用户做了什么操作都会被记录下来。不过要注意,`-l`参数要生效,还得配合修改`/etc/syslog.conf`。
* ftpd还有很多其他参数,可以`man ftpd`一探究竟。
**如何让 FreeBSD 开机时自动启动 ftpd**
光用上面的命令启动,重启后服务就没了。要实现开机自启,你可以把启动指令放进`/etc/rc.local`,或者仿照`/usr/local/etc/rc.d`里的文件,自己写一个ftpd.sh脚本。
**例一:** 编辑`/etc/rc.local`,在里面加一行:
```
/usr/libexec/ftpd -D -l -l
```
**例二:** 在`/usr/local/etc/rc.d/`下新建一个叫`ftpd.sh`的脚本:
```
#!/bin/sh
ftpd_flag="-l -l -S"
ftpd="/usr/libexec/ftpd"
case "$1" in
start) [ -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
;;
esac
exit 0
```
保存文件后,记得给它加上可执行权限:
```
chmod 554 /usr/local/etc/rc.d/ftpd.sh
```
这样一来,FreeBSD开机时会自动调用这个脚本启动ftpd。你还可以用`/usr/local/etc/rc.d/ftpd.sh stop`来手动停止服务。如果要调整启动参数,修改脚本里的`ftpd_flag`那行就行了。
#### 1-1-2 方法二:由 inetd 来启动 ftpd
这种模式,思路很直接,就是修改`/etc/inetd.conf`。
先检查一下`/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 服务
停止服务的方法,取决于你是用daemon模式还是inetd模式启动的。
#### 1-2-1 daemon 模式
daemon模式可以执行下面这个指令来终结ftpd进程:
```
killall ftpd
```
如果之前是把ftpd的启动指令写在`/etc/rc.local`里来实现开机自启的,那么要停止它自动启动,只需编辑`/etc/rc.local`,在那一行前面加个井字号注释掉就行。
#### 1-2-2 inetd 模式
如果当初是用inetd模式启动的,那就得修改`/etc/inetd.conf`,然后让inetd重新读取配置。
同样编辑`/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
```
按照上面的设置,用户`gsyan`、`foo`以及属于`staff`群组的用户,登录后都只能待在自己的家目录里。说明一下,以`@`符号开头表示后面跟的是群组名称。
**有办法只开放一个用户不做chroot,其他全部做chroot吗?**
新版的FreeBSD在`/etc/ftpchroot`的语法上增加了更灵活的选项。如果`man ftpchroot`能看到详细的说明,就意味着你可以使用下面的配置来实现部分用户不锁定。
假设管理员叫`admin`,希望他可以自由游走,而其他用户只能待在自己的个人目录里。可以这样编辑`/etc/ftpchroot`:
```
admin /
ftp .
@ www
```
这几行配置的效果是:
* **第一行**:用户`admin`登录后,根目录被切换到`/`(也就是整个文件系统的根,实际上等于没限制)。
* **第二行**:匿名用户(`ftp`)登录后,保持原有的方式,只能待在指定的公共目录。
* **第三行**:所有其他用户(`@`)登录后,只能在自己的家目录下的`www`子目录里活动。
这个场景非常实用:如果服务器用Apache提供Web服务,并且设置了`UserDir www`,那么告诉用户“直接把做好的网页通过FTP上传到你的`www`目录就行”,流程会变得非常清晰。不过注意,你得提前为用户建立好`www`这个目录,否则用户连登录都会失败。
#### 1-3-2 方法二:利用 /etc/login.conf
这种方法更有“技巧性”。它利用了用户数据库(`/etc/master.passwd`)中的login class字段,为不同用户设定不同的“类别”,然后在`/etc/login.conf`中为每个类别定义其对FTP chroot的行为。这在需要处理大量用户,而`/etc/ftpchroot`又不太方便时,会显得格外顺手。
**全部用户做chroot**
编辑`/etc/login.conf`,找到`default:`开头的段落,它看起来像这样:
```
default:\
:copyright=/etc/COPYRIGHT:\
:welcome=/etc/motd:\
...................
```
在`copyright`那行的**前面**,插入一行`:ftp-chroot:\`:
```
default:\
:ftp-chroot:\
:copyright=/etc/COPYRIGHT:\
:welcome=/etc/motd:\
...................
```
然后执行下面这行指令,把`login.conf`转换成数据库格式:
```
cap_mkdb /etc/login.conf
```
这样,所有用户就都会被chroot到自己的家目录里了。
**想全部管制,又开放个别管理员不做chroot呢?**
我们可以新增一个login class,比如就叫`admin`,然后特意去掉其中的`ftp-chroot`属性。
编辑`/etc/login.conf`,在`default:`段落之外,新增下面几行:
```
admin:\
:ftp-chroot@:\
:tc=default:
```
注意`admin`这个class里用的是`:ftp-chroot@:`,那个`@`符号在这里表示“取反”,也就是“不做ftp-chroot”。然后执行`cap_mkdb /etc/login.conf`把配置转换成数据库。
接下来,我们需要告诉系统哪些用户属于`admin`这个class。执行`vipw`编辑密码文件,找到管理员(比如`gsyan`)所在的那行。假设他原来的记录是:
```
gsyan:*:1000:1000::0:0:大雄:/home/gsyan:/bin/tcsh
```
将其第五个字段(class字段)修改为`admin`:
```
gsyan:*:1000:1000:admin:0:0:大雄:/home/gsyan:/bin/tcsh
```
保存文件后,用不同身份登录测试一下效果。
通过把不同用户分到不同的login class,并利用`/etc/login.conf`来精细化控制每个class能做什么、不能做什么,这是一个非常强大的管理工具,值得深入研究。
### 1-4 提供匿名(访客用)的 FTP 服务
要搭建一个对访客开放的FTP下载站(即匿名FTP服务),需要系统里有一个叫`ftp`的用户,并建立好相关的目录和文件。如果觉得手动配置繁琐,可以用`/stand/sysinstall`这个图形化工具,它会帮你轻松搞定。
具体步骤如下:
1. 调用`/stand/sysinstall`,执行:
```
/stand/sysinstall
```
2. 进入主菜单后,用方向键选择“**Configure**”,然后按**空格键**。
3. 进入“FreeBSD Configuration Menu”,选择“**Networking**”,按**空格键**。
4. 进入“Network Services Menu”,选择“**Anon FTP**”,按**空格键**。
5. 在“Anonymous FTP Configuration”界面,按要求输入相关信息。
6. 输入完毕后,按 **OK**。
7. 接着输入FTP的GID(使用默认值即可,直接按Enter)。
8. 系统会询问是否要生成进站欢迎词,直接按Enter确认。
9. 编辑欢迎词。
10. 编辑完成后按Esc键,再按两次Enter键保存退出。
11. 最后在菜单顶部选择 **Exit** 退出。
**`/stand/sysinstall`到底帮你做了什么?**
它主要完成了以下操作:
* 新增了一个名为`ftp`的系统用户。
* 新增了FTP用的群组。
* 创建了FTP用的目录(通常是`/home/ftp`)。
* 在`~ftp/etc/`下创建了`group`, `passwd`, `ftpmotd`等必要文件。
* 设置了各目录的权限:
| 目录名称 | 拥有者 | 权限 |
| :--- | :--- | :--- |
| ~ftp | root | a-w (所有用户不可写) |
| ~ftp/etc | root | 目录555,文件444 (pwd.db, group, ftpmotd) |
| ~ftp/pub | root | a-w (所有用户不可写) |
> **这里要特别提醒一句**:目录权限是安全的命门。只要某个目录对访客有“写”权限,他们就能随意上传、修改甚至删除文件。一旦被别有用心的人发现可以上传文件,你的网络流量恐怕会一夜之间“爆表”。
**相关的重要文件:**
* `/etc/ftpusers`: 禁止使用FTP的黑名单。
* `/etc/ftpchroot`: 需要做chroot的用户/群组清单。
* `/etc/ftphosts`: 虚拟站点的设置文件。
* `/etc/ftpwelcome`: 用户登录前看到的欢迎词。
* `/etc/ftpmotd`: 用户登录成功后自动显示的信息。
* `/var/run/nologin`: 当此文件存在时,ftpd会显示其内容并拒绝任何登录。
* `/var/log/ftpd`: 记录匿名FTP登录时的传输状况(需要ftpd以`-S`参数启动,且该文件存在)。
### 1-5 让 ftpd 可以记录传输状况
ftpd的`-l`参数可以让系统日志守护进程`syslogd`记录FTP的连接情况。但我们还需要配置`/etc/syslog.conf`并让syslogd重新加载配置文件,记录才会真正生效。
步骤如下:
1. 创建一个空的日志文件`/var/log/ftpd`:
```
touch /var/log/ftpd
```
2. 修改syslogd的配置文件`/etc/syslog.conf`,在类似`mail.info /var/log/maillog`这行的下面,新增一行:
```
ftp.* /var/log/ftpd
```
3. 让syslogd重新读取配置文件,执行:
```
kill -HUP `cat /var/run/syslogd.pid`
```
> 注意:反引号` `是键盘上那个像毛毛虫的按键。
## 2 FTP 的架设─pu re-ftpd
* pu re-ftpd是另一个备受推崇的FTP服务器软件,它的配置相对简洁,安全性也不错。如果你觉得内置ftpd不够用,它是一个很好的选择。不过,关于pu re-ftpd的详细配置,我们这里就不展开说了,有兴趣的话可以另行研究。
## 3 以 wu-ftpd 架设 FTP (建议用别的方案取代)
说到过去的明星FTP软件,wu-ftpd(华盛顿大学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`,如果没有,可以手动抓取。准备好后,执行标准的编译安装流程:
```
cd /usr/ports/ftp/wu-ftpd
make
make install
```
### 3-2 修改设定档
wu-ftpd的配置文件都放在`/usr/local/etc/`下,安装完后会有一些`.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` 类名 人数 时间 提示信息文件(绝对路径)
例如:`limit TP 50 any /usr/local/etc/ftp.msg.Full` | | 连接记录 | `log commands` 类名
`log transfers` 类名 inbound,outbound | | 控制可执行的指令 | `delete` yes/no 类名
`overwrite` yes/no 类名
`rename` yes/no 类名
`chmod` yes/no 类名
`umask` yes/no 类名 | | 连接时只显示主机名,不显示版本 | `greeting brief` | | 连接做chroot | `restricted-uid` 用户名
例如:`restricted-uid *` (将所有用户chroot) | | 不做chroot | `unrestricted-uid` 用户名
例如:`unrestricted-uid gsyan` | ### 3-3 修改 /etc/inetd.conf 我们让wuftpd以inetd模式运行。编辑`/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软件测试一下。 使用wu-ftpd,最重要的是记住要时刻关注安全警示,一旦发现漏洞,必须马上更新程序。安全这根弦,什么时候都不能松。
例如:`class TP real,guest,anonymous *.tp.edu.tw` | | 限制上线人数及时段 | `limit` 类名 人数 时间 提示信息文件(绝对路径)
例如:`limit TP 50 any /usr/local/etc/ftp.msg.Full` | | 连接记录 | `log commands` 类名
`log transfers` 类名 inbound,outbound | | 控制可执行的指令 | `delete` yes/no 类名
`overwrite` yes/no 类名
`rename` yes/no 类名
`chmod` yes/no 类名
`umask` yes/no 类名 | | 连接时只显示主机名,不显示版本 | `greeting brief` | | 连接做chroot | `restricted-uid` 用户名
例如:`restricted-uid *` (将所有用户chroot) | | 不做chroot | `unrestricted-uid` 用户名
例如:`unrestricted-uid gsyan` | ### 3-3 修改 /etc/inetd.conf 我们让wuftpd以inetd模式运行。编辑`/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软件测试一下。 使用wu-ftpd,最重要的是记住要时刻关注安全警示,一旦发现漏洞,必须马上更新程序。安全这根弦,什么时候都不能松。
实用工具推荐
电子包浆
使用 ›绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
图片压缩
使用 ›选择画质和输出格式,预览压缩前后的大小。
相关文章