4、FTP服务器搭建与配置:FTP协议原理(主动/被动模式)、Windows下搭建FTP服务器、Linux下搭建vsftpd、用户名密码认证配置

4.1 FTP协议原理:主动模式与被动模式

说到FTP,很多刚入行的朋友容易搞混它的工作模式。我刚开始也踩过这个坑——明明防火墙都关了,FTP就是连不上。后来才明白,问题出在主动和被动模式上。

FTP使用两个通道:一个控制通道(21端口),一个数据通道。控制通道负责发指令,数据通道才真正传文件。主动模式和被动模式的区别,就在于数据通道怎么建立。

主动模式(PORT模式)

客户端从随机端口N连接服务器的21端口,建立控制通道。然后客户端告诉服务器:「我用N+1端口等你」。服务器就用20端口主动连客户端的N+1端口。

说白了,就是服务器主动找客户端要数据连接。

我曾经踩过的坑: 客户端在内网,服务器在外网时,主动模式基本废掉。因为服务器根本连不进客户端的局域网。我在一次远程升级交换机固件时就遇到这问题,折腾了半小时才换成被动模式。

被动模式(PASV模式)

还是客户端连服务器21端口建立控制通道。但这次客户端发PASV指令,服务器说:「我在端口X等你」。然后客户端主动连服务器的X端口。

嗯,这里要注意:被动模式下,服务器要开放一个端口范围给客户端连接。我一般习惯开放 50000-50100 这100个端口,够用了。

对比项 主动模式 被动模式
数据连接发起方 服务器→客户端 客户端→服务器
客户端防火墙 需开放随机端口 只需出站即可
服务器防火墙 开放20、21端口 开放21+端口范围
适用场景 服务器在内网 客户端在内网

你想想看,现在大部分场景都是客户端在内网(比如公司电脑),服务器在公网或DMZ区。所以被动模式用得最多。我建议你默认就用被动模式,省心。

4.2 Windows下搭建FTP服务器

Windows自带的IIS就有FTP功能,不用装第三方软件。我个人习惯用这个,因为稳定,而且跟AD域集成方便。

安装步骤

  1. 打开「控制面板」→「程序和功能」→「启用或关闭Windows功能」
  2. 勾选「Internet Information Services」→「FTP服务器」→「FTP服务」和「FTP扩展性」
  3. 同时勾选「Web管理工具」→「IIS管理控制台」
  4. 点击确定,等待安装完成

配置FTP站点

  1. 打开IIS管理器,右键「网站」→「添加FTP站点」
  2. 站点名称填「SwitchFirmware」,物理路径选 D:\FTPServer
  3. 绑定IP地址选「全部未分配」,端口21,勾选「自动启动FTP站点」
  4. SSL选「无SSL」(内网环境够用了)
  5. 身份验证勾选「基本」,授权选「指定用户」,输入你的Windows用户名
  6. 权限勾选「读取」和「写入」
我的小技巧: 如果只是临时传固件,可以建一个专用本地用户,比如ftpuser,密码设复杂点。别用管理员账号,安全第一。

防火墙配置

Windows防火墙默认会拦截FTP。你需要添加入站规则,允许21端口。如果是被动模式,还要开放端口范围。

# 用管理员权限打开PowerShell
New-NetFirewallRule -DisplayName "FTP Control" -Direction Inbound -Protocol TCP -LocalPort 21 -Action Allow
New-NetFirewallRule -DisplayName "FTP Passive" -Direction Inbound -Protocol TCP -LocalPort 50000-50100 -Action Allow

4.3 Linux下搭建vsftpd

Linux下我首选vsftpd,名字就叫「Very Secure FTP Daemon」,安全性和性能都不错。我在生产环境用了好几年,没出过问题。

安装vsftpd

# CentOS/RHEL
yum install -y vsftpd

# Ubuntu/Debian
apt-get install -y vsftpd

配置文件详解

配置文件在 /etc/vsftpd/vsftpd.conf。我直接给你一份我常用的配置,注释都写好了:

# 禁止匿名登录
anonymous_enable=NO

# 允许本地用户登录
local_enable=YES

# 允许写操作
write_enable=YES

# 本地用户登录后限制在家目录
chroot_local_user=YES

# 被动模式端口范围
pasv_min_port=50000
pasv_max_port=50100

# 启用日志
xferlog_enable=YES
xferlog_std_format=YES

# 超时设置
idle_session_timeout=600
data_connection_timeout=120
我曾经踩过的坑: chroot_local_user=YES 这个配置,在CentOS 7以上版本有个安全限制——如果用户家目录可写,登录会报错。解决办法是让家目录不可写,或者加一行 allow_writeable_chroot=YES。

启动服务

systemctl start vsftpd
systemctl enable vsftpd
systemctl status vsftpd

4.4 用户名密码认证配置

FTP认证说白了就两种:匿名和本地用户。做固件升级肯定不能用匿名,太不安全了。我建议用本地用户认证。

Windows下的用户认证

在IIS里配置FTP时,身份验证选「基本」,授权选「指定用户」。然后输入Windows本地用户或域用户。

创建专用用户的步骤:

  1. 「计算机管理」→「本地用户和组」→「用户」
  2. 右键新建用户,用户名 ftpadmin,密码设复杂点
  3. 把该用户加入Guests组(权限最小化)
  4. 在FTP站点授权里指定这个用户

Linux下的用户认证

vsftpd默认就用系统本地用户认证。我习惯创建一个专用系统用户:

# 创建用户,家目录指向固件存放路径
useradd -d /opt/firmware -s /sbin/nologin ftpadmin

# 设置密码
passwd ftpadmin

# 设置家目录权限
chown -R ftpadmin:ftpadmin /opt/firmware
chmod 755 /opt/firmware

这里有个细节:-s /sbin/nologin 表示这个用户不能登录系统shell,只能用来做FTP。安全多了。

测试连接

配置完一定要测试。我习惯用命令行测,简单直接:

# Windows命令行
ftp 192.168.1.100
# 输入用户名 ftpadmin
# 输入密码
# 成功后执行 ls 看看目录内容

# Linux命令行
ftp 192.168.1.100
# 同样输入用户名密码验证
我的测试习惯: 先用主动模式测,再用被动模式测。如果主动模式失败但被动模式成功,八成是防火墙问题。如果都失败,检查服务是否启动、端口是否监听。

嗯,FTP服务器这块就这些。说白了,Windows下用IIS,Linux下用vsftpd,认证用本地用户。记住被动模式优先,防火墙开放对应端口。这样搭建出来的FTP服务器,给交换机升级固件完全够用。