第 16.1 节 FTP 服务器
最后更新于
最后更新于
FTP 即 File Transfer Protocol(文件传输协议)。使用 FTP 服务搭建服务器可以快速传输文件。
警告
Pure-FTPD 已经移除了对 RFC 2640 的支持,所以 Windows 下使用 ftp 命令行处理 FTP 非英文相关文件会乱码,且无法修改编码。见 。
ftp> quote opts utf8 on 504 Unknown command
使用命令行(FreeBSD 中)、WinSCP 等客户端测试 Pure-FTPd 并不存在乱码问题。
由于 pkg 包没有数据库支持功能,所以需要通过 ports 来安装该软件:
# cd /usr/ports/ftp/pure-ftpd
# make config
选中 MYSQL
,其余保持默认选项回车即可:
# make BATCH=yes install clean
/usr/local/etc/pure-ftpd.conf
文件# cp /usr/local/etc/pure-ftpd.conf.sample /usr/local/etc/pure-ftpd.conf
# cp /usr/local/etc/pureftpd-mysql.conf.sample /usr/local/etc/pureftpd-mysql.conf
配置 /usr/local/etc/pure-ftpd.conf
文件,以下项目修改如下:
# 兼容 ie 等非正规化的 ftp 客户端
BrokenClientsCompatibility yes
# 被动连接响应的端口范围。
PassivePortRange 30000 50000
# 允许认证用户登录的最小 UID。
# 例如,值为 100 会阻止所有 UID 小于 100 的用户登录。
# 如果您希望 root 能够登录,请使用 0。
MinUID 2000
# 仅允许认证用户进行 FXP 传输。
AllowUserFXP yes
# 若不禁止或注释,日志会报错找不到 ftp 用户
# AntiWarez yes
# 用户主目录不存在的话,自动创建
CreateHomeDir yes
# MySQL 配置文件(参见 README.MySQL)
MySQLConfigFile /usr/local/etc/pureftpd-mysql.conf
注意
本文基于 MySQL 8.x。关于 MySQL 的安装、基本设置请看其他章节。
请自行安装配置 mysql 8.x。
create database pureftpd;
use pureftpd;
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`User` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
`Password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
`Uid` int(11) NOT NULL DEFAULT -1 COMMENT '用户 ID',
`Gid` int(11) NOT NULL DEFAULT -1 COMMENT '用户组 ID',
`Dir` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
`quotafiles` int(255) NULL DEFAULT 500,
`quotasize` int(255) NULL DEFAULT 30,
`ulbandwidth` int(255) NULL DEFAULT 80,
`dlbandwidth` int(255) NULL DEFAULT 80,
`ipaddress` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT'*',
`comment` int(255) NULL DEFAULT NULL,
`status` tinyint(4) NULL DEFAULT 1,
`ulratio` int(255) NULL DEFAULT 1,
`dlratio` int(255) NULL DEFAULT 1,
PRIMARY KEY (`User`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
CREATE USER 'pftp'@'localhost' IDENTIFIED BY 'abc123';
GRANT SELECT, INSERT, UPDATE, DELETE ON pureftpd.* TO 'pftp'@'localhost';
flush privileges;
测试数据库链接:
# mysql -u pftp -p -h localhost pureftpd
/usr/local/etc/pureftpd-mysql.conf
完整示例:
##############################################
# #
# 示例 Pure-FTPd 的 MySQL 配置文件。 #
# 详细说明请参阅 README.MySQL。 #
# #
##############################################
# MYSQLServer 数据库服务器地址
MYSQLServer 127.0.0.1
# MYSQLServer 数据库服务器端口
MYSQLPort 3306
# 可选:如果数据库服务器运行在本机,指定 mysql.sock 的路径。
MYSQLSocket /var/run/mysqld/mysqld.sock
# 数据库用户名
MYSQLUser pftp
# 数据库密码
MYSQLPassword abc123
# 数据库名
MYSQLDatabase pureftpd
# 密码加密方式(此处为明文)
# 有效值包括:"cleartext"(明文)、"argon2"、"scrypt"、"crypt" 和 "any"
MYSQLCrypt cleartext
# 以下设置中的字符串部分在运行时会被替换:
#
# \L 会被替换为尝试认证的用户名。
# \I 会被替换为用户连接到的 IP 地址。
# \P 会被替换为用户连接到的端口号。
# \R 会被替换为用户来源的 IP 地址。
# \D 会被替换为远程 IP 地址的长整数形式。
#
# 使用这些替换字符串可以执行非常复杂的查询,特别适用于虚拟主机设置。
# 用于获取密码的 SQL 查询语句
MYSQLGetPW SELECT Password FROM users WHERE User='\L'
# 用于获取系统用户名或 UID 的 SQL 查询语句
MYSQLGetUID SELECT Uid FROM users WHERE User='\L'
# 默认 UID - 设置后将覆盖 MYSQLGetUID 的查询结果
MYSQLDefaultUID 2000
# 用于获取系统用户组名或 GID 的 SQL 查询语句
MYSQLGetGID SELECT Gid FROM users WHERE User='\L'
# 默认 GID - 设置后将覆盖 MYSQLGetGID 的查询结果
MYSQLDefaultGID 2000
# 用于获取用户主目录的 SQL 查询语句
MYSQLGetDir SELECT Dir FROM users WHERE User='\L'
# 可选:用于获取最大文件数的查询(虚拟配额支持需开启)
MySQLGetQTAFS SELECT QuotaFiles FROM users WHERE User='\L'
# 可选:用于获取最大磁盘使用量(单位为 MB,需要虚拟配额支持)
MySQLGetQTASZ SELECT QuotaSize FROM users WHERE User='\L'
# 可选:上传/下载比率,服务器需支持比率功能
MySQLGetRatioUL SELECT ULRatio FROM users WHERE User='\L'
MySQLGetRatioDL SELECT DLRatio FROM users WHERE User='\L'
# 可选:带宽限制,单位为 KB/s,服务器需支持带宽限制功能
MySQLGetBandwidthUL SELECT ULBandwidth FROM users WHERE User='\L'
MySQLGetBandwidthDL SELECT DLBandwidth FROM users WHERE User='\L'
# 启用 ~ 路径扩展。**切勿盲目启用,除非满足以下条件:**
# 1) 你明确知道自己在做什么。
# 2) 实际用户与虚拟用户一致。
# MySQLForceTildeExpansion 1
# 如果你使用事务型存储引擎,可以启用 SQL 事务以避免竞态条件。
# 如果使用传统的 MyISAM 引擎,请保持此项注释。
# MySQLTransactions On
警告
使用数据库后,pure-pw 就没用了。
# pw groupadd ftpgroup -g 2000
# pw useradd ftpuser -u 2001 -g 2000 -s /sbin/nologin -w no -d /home/pureftp -c "VirtualUser Pure-FTPd" -m
添加 FTP 登录用户(必须手动写入 mysql 数据库),以下命令创建的用户是 test
。密码是 test2
。
USE pureftpd;
INSERT INTO `users` (`User`, `Password`, `Uid`, `Gid`, `Dir`, `quotafiles`, `quotasize`, `ulbandwidth`, `dlbandwidth`, `ipaddress`, `comment`, `status`, `ulratio`, `dlratio`)
VALUES ('test', 'test2', 2001, 2000, '/home/pureftp/www', 500, 30, 80, 80, '*', NULL, 1, 1, 1);
注意
写入表的
Uid
、Gid
必须和上文pw useradd
创建的用户一致。
技巧
基本思路就是写入数据库的虚拟用户会继承
pw useradd
创建的用户的权限与 GID\UID,然后通过数据库中的用户来操作 FTP。下同。
实际操作示例:
root@localhost [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| pureftpd |
| sys |
+--------------------+
5 rows in set (0.00 sec)
root@localhost [pureftpd]> USE pureftpd;
Database changed
root@localhost [pureftpd]> INSERT INTO `users` (`User`, `Password`, `Uid`, `Gid`, `Dir`, `quotafiles`, `quotasize`, `ulbandwidth`, `dlbandwidth`, `ipaddress`, `comment`, `status`, `ulratio`, `dlratio`)
-> VALUES ('test', 'test2', 2001, 2000, '/home/pureftp/www', 500, 30, 80, 80, '*', NULL, 1,1, 1);
Query OK, 1 row affected (0.01 sec)
root@localhost [pureftpd]> select * from users;
+------+----------+------+------+-------------------+------------+-----------+-------------+-------------+-----------+---------+--------+---------+---------+
| User | Password | Uid | Gid | Dir | quotafiles | quotasize | ulbandwidth | dlbandwidth | ipaddress | comment | status | ulratio | dlratio |
+------+----------+------+------+-------------------+------------+-----------+-------------+-------------+-----------+---------+--------+---------+---------+
| test | test2 | 2001 | 2000 | /home/pureftp/www | 500 | 30 | 80 | 80 | * | NULL | 1 | 1 | 1 |
+------+----------+------+------+-------------------+------------+-----------+-------------+-------------+-----------+---------+--------+---------+---------+
1 row in set (0.01 sec)
配置 FTP 目录
# mkdir -p /home/pureftp/www
# chown -R ftpuser:ftpgroup /home/pureftp
# chmod -R 775 /home/ftpuser # 权限要设置为 775,这样同组的才能读写
# service pure-ftpd enable # 添加服务
# service pure-ftpd start # 启动服务器
# service pure-ftpd stop # 停止服务
# service pure-ftpd restart # 重启服务
Pure-FTPd 日志在 /var/log/messages
。
技巧
ProFTPD 在 Windows 自带的 FTP 链接下不会乱码。
注意
本文基于 MySQL 8.0。关于 MySQL 的安装、基本设置请看其他章节。
请自行安装配置 MySQL 8.x——需要与 proftpd-mod_sql_mysql
安装的 databases/mysql8X-client
版本相一致。
# pkg install proftpd proftpd-mod_sql_mysql
或
# cd /usr/ports/ftp/proftpd/ && make install clean
# cd /usr/ports/databases/proftpd-mod_sql_mysql/ && make install clean
/usr/local/etc/proftpd.conf
编辑 ProFTPD 的配置文件 /usr/local/etc/proftpd.conf
如下
技巧
示例文件参见
/usr/local/etc/proftpd.conf.sample
。
ServerName "Test Ftp Server"
ServerType standalone
DefaultServer on
ServerIdent on "FTP Server ready"
Port 21
Umask 022
# 超时设置
TimeoutLogin 300
TimeoutIdle 36000
TimeoutNoTransfer 36000
# 资源限制
User proftpd
Group proftpd
RLimitMemory 256M 256M
RLimitOpenFiles 1024 1024
PassivePorts 50000 60000
# 日志配置
LogFormat default "%h %l %u %t \"%r\" %s %b"
LogFormat auth "%v [%P] %h %t \"%r\" %s"
SystemLog /var/log/proftpd/proftpd.log
TransferLog /var/log/proftpd/xfer.log
ExtendedLog /var/log/proftpd/auth.log AUTH auth
# MySQL 模块加载
LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
LoadModule mod_sql_passwd.c
# 只允许访问自己的目录,去掉会访问 /
DefaultRoot ~
# 运行覆盖文件
AllowOverwrite on
<Global>
# 数据库连接
SQLConnectInfo proftpd@localhost proftpd 123456
# 关键修正部分
SQLAuthTypes SHA256
SQLPasswordEngine on
# 用户表映射
SQLUserInfo users username password uid gid homedir shell
SQLDefaultGID 2000
SQLDefaultUID 2000
RequireValidShell off
# 认证配置
AuthOrder mod_sql.c
SQLAuthenticate users
# 登录统计
SQLNamedQuery getcount SELECT "CONCAT('Total logins: ', count) FROM users WHERE username='%u'"
SQLNamedQuery updatecount UPDATE "count=count+1 WHERE username='%u'" users
SQLShowInfo PASS "230" "%{getcount}"
SQLLog PASS updatecount
# 文件操作日志
SQLNamedQuery log_work FREEFORM "INSERT INTO worklog (user_name, file_and_path, bytes, send_time, client_ip, client_name, client_command) VALUES ('%u', '%f', %b, NULLIF('%T', ''), '%a', '%h', '%m')"
SQLLog RETR,STOR,DELE log_work
</Global>
创建一个目录来存储 FTP 服务器的日志:
# mkdir /var/log/proftpd
警告
若不 主动 创建(即使自动创建了也应主动再创建一次),会提示
proftpd[3435]: warning: handling possibly truncated configuration data at line 65 of '/usr/local/etc/proftpd.conf'
。
技巧
ProFTPD 配置文件
/usr/local/etc/proftpd.conf
有语法检查命令proftpd -t -d5
。
我们在设置中指定服务器将在主动模式下在端口 21 上工作,在被动模式下在 50000-60000 范围内工作。这些端口应该在防火墙中打开。对于 PF,这是通过以下规则完成的:
pass in quick on $ext_if proto tcp from any to $ext_if port { 21, 50000:60000 }
出于安全目的,我们将以非 root 用户身份运行 Proftpd。因此,我们将创建此用户:
# adduser
Username: proftpd # 用户名
Full name: FTP User # 用户全名
Uid (Leave empty for default):
Login group [proftpd]:
Login group is proftpd. Invite proftpd into other groups? []:
Login class [default]:
Shell (sh csh tcsh bash nologin) [sh]: nologin # 不允许登录系统
Home directory [/home/proftpd]:
Home directory permissions (Leave empty for default):
Enable ZFS encryption? (yes/no) [no]:
Use password-based authentication? [yes]: no
Lock out the account after creation? [no]:
Username : proftpd
Password : <disabled>
Full Name : FTP User
Uid : 1002
ZFS dataset : zroot/home/proftpd
Class :
Groups : proftpd
Home : /home/proftpd
Home Mode :
Shell : /usr/sbin/nologin
Locked : no
adduser: INFO: Successfully created ZFS dataset (zroot/home/proftpd).
adduser: INFO: Successfully added (proftpd) to the user database.
Add another user? (yes/no) [no]:
Goodbye!
创建一个 MySQL 数据库和一个对创建的数据库具有完全访问权限的用户:
CREATE DATABASE `proftpd` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
创建数据库用户和密码 (授权 proftpd 数据库):
CREATE USER 'proftpd'@'localhost' IDENTIFIED BY '123456';
GRANT SELECT, INSERT, UPDATE, DELETE ON proftpd.* TO 'pftp'@'localhost';
FLUSH PRIVILEGES;
创建数据表:
USE proftpd;
DROP TABLE IF EXISTS users;
CREATE TABLE `users` (
`username` VARCHAR(30) NOT NULL,
`descr` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`password` VARCHAR(64) NOT NULL,
`uid` INT(11) DEFAULT NULL,
`gid` INT(11) DEFAULT NULL,
`homedir` VARCHAR(255) DEFAULT NULL,
`shell` VARCHAR(255) DEFAULT NULL,
`count` INT(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
DROP TABLE IF EXISTS worklog;
CREATE TABLE worklog (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
date TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP(0),
user_name VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
file_and_path VARCHAR(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
bytes BIGINT UNSIGNED DEFAULT NULL,
send_time VARCHAR(9) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
client_ip VARCHAR(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
client_name TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
client_command VARCHAR(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE INDEX id (id)
) ENGINE=InnoDB CHARACTER SET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
INSERT INTO `proftpd`.`users` (`username`, `descr`, `password`, `uid`, `gid`, `homedir`, `shell`, `count`)
VALUES ('test', 'Test user', SHA2('FTPpassword_here', 256), '1002', '1002', '/home/www/ftp', NULL, '0');
创建了:
FTP 用户名 test
FTP 登录密码 FTPpassword_here
UID 1002
GID 1002
警告
上面的 UID GID 必须与 proftpd 用户相同!否则只能读不能写!
你可以通过以下方式确定 proftpd 用户的 UID 和 GID:
root@ykla:/home/ykla # id proftpd uid=1002(proftpd) gid=1002(proftpd) groups=1002(proftpd)
测试数据库链接:
# mysql -u proftpd -p -h localhost proftpd
proftpd@localhost [proftpd]> show data;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'data' at line 1
proftpd@localhost [proftpd]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| proftpd |
+--------------------+
3 rows in set (0.00 sec)
proftpd@localhost [proftpd]> use proftpd;
Database changed
proftpd@localhost [proftpd]> select * from users;
+----------+-----------+------------------------------------------------------------------+------+------+---------------+-------+-------+
| username | descr | password | uid | gid | homedir | shell | count |
+----------+-----------+------------------------------------------------------------------+------+------+---------------+-------+-------+
| test | Test user | d1d6930fda5f964acba51ec4c35d0ddb3b36d25bfef59f1120abd2e4f9f140d9 | 1002 | 1002 | /home/www/ftp | NULL | 0 |
+----------+-----------+------------------------------------------------------------------+------+------+---------------+-------+-------+
1 row in set (0.00 sec)
创建一个目录和一个测试 FTP 用户,将创建的目录指定为用户目录:
# mkdir -p /home/www/ftp
# chown -R proftpd:proftpd /home/www/ftp
# chmod -R 775 /home/www/ftp
# service proftpd enable # 加入启动
# service proftpd start # 启动服务
# service proftpd stop # 停止服务
# service proftpd restart # 重启服务
使用用户 test
,密码 FTPpassword_here
登录 FTP 即可。
vsftpd 即 Very Secure FTP Daemon(非常安全的 FTP 守护进程)。在 Linux 上比较流行。经过测试在 Windows 上 FTP 客户端中也不会乱码。
通过 pkg 安装
# pkg install vsftpd-ssl pam_pwdfile apache24
vsftpd-ssl
带 SSL 支持的 vsftpd-ssl
pam_pwdfile
一个 PAM 模块,允许使用纯文本密码文件进行用户身份验证。
apache24
提供了 htpasswd
命令
技巧
FreeBSD 系统中的
/etc/passwd
仅起到兼容作用,并不实际使用。实际使用的是相关 db 数据库文件。
通过 Ports:
# cd /usr/ports/ftp/vsftpd/ && make install clean
# cd /usr/ports/security/pam_pwdfile/ && make install clean
# cd /usr/ports/www/apache24 && make install clean
观察安装输出:
[2/2] Installing vsftpd-ssl-3.0.5_2...
===> Creating groups
Using existing group 'ftp'
===> Creating users
Creating user 'ftp' with uid '14'
===> Creating homedir(s)
[2/2] Extracting vsftpd-ssl-3.0.5_2: 100%
看到 vsftpd 会创建一个用户叫 ftp
,查看该用户详情:
# id ftp
uid=14(ftp) gid=14(ftp) groups=14(ftp)
root@ykla:/home/ykla # adduser
Username: ftptest
Full name:
Uid (Leave empty for default):
Login group [ftptest]: ftp # 注意此处
Login group is ftp. Invite ftptest into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]: nologin # 注意此处
Home directory [/home/ftptest]:
Home directory permissions (Leave empty for default):
Enable ZFS encryption? (yes/no) [no]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password: # 注意此处,我设置密码为 z
Enter password again:
Lock out the account after creation? [no]:
Username : ftptest
Password : *****
Full Name :
Uid : 1003
ZFS dataset : zroot/home/ftptest
Class :
Groups : ftp
Home : /home/ftptest
Home Mode :
Shell : /usr/sbin/nologin
Locked : no
OK? (yes/no) [yes]:
adduser: INFO: Successfully created ZFS dataset (zroot/home/ftptest).
adduser: INFO: Successfully added (ftptest) to the user database.
Add another user? (yes/no) [no]:
Goodbye!
以上:
用户名 ftptest
密码 z
组 ftp
创建文件 /etc/pam.d/vsftpd
,写入:
auth required /usr/local/lib/pam_pwdfile.so pwdfile /usr/local/etc/vsftpd_login.db
account required /usr/lib/pam_permit.so
创建密码数据库(我上面添加了用户 ftptest
,密码是 z
)
# htpasswd -c -b /usr/local/etc/vsftpd_login.db ftptest z
Adding password for user virtual
后续再添加(可能需要再 adduser
,未测试):
# htpasswd -b /usr/local/etc/vsftpd_login.db 新建的用户名 新建的用户密码
vsftpd.conf
vsftpd 主配置数据保存在 /usr/local/etc/vsftpd.conf
,可直接修改。因为还有个备用的模板在 /usr/local/etc/vsftpd.conf.sample
。
我们将 /usr/local/etc/vsftpd.conf
配置如下:
# /usr/local/etc/vsftpd.conf 示例配置文件
#
# 默认编译设置相当保守。此示例文件略微放宽了一些设置,使 FTP 守护进程更实用。
# 参阅 vsftpd.conf.5 可获取所有默认编译设置。
#
# 请注意:此示例文件不是 vsftpd 选项的详尽列表。
# 请阅读 vsftpd.conf.5 手册页,以全面了解 vsftpd 的功能。
#
# 不允许匿名 FTP 吗?
anonymous_enable=NO
#
# 允许本地用户登录。
local_enable=YES
#
# 取消注释以启用任何形式的 FTP 写命令。
write_enable=YES
#
# 本地用户的默认 umask 值为 077。你可能希望将其更改为 022,
# 如果你的用户期待这样的话(022 是大多数其他 FTP 服务的默认值)
# local_umask=022
#
# 取消注释以允许匿名 FTP 用户上传文件。仅当启用了上面的全局写入功能时,才会生效。
# 此外,你还需要为 FTP 用户创建一个可写的目录。
# anon_upload_enable=YES
#
# 如果你希望匿名 FTP 用户能够创建新目录,取消注释此项。
# anon_mkdir_write_enable=YES
#
# 启用目录消息 - 在远程用户进入某个目录时,给出相关的消息。
dirmessage_enable=YES
#
# 启用上传/下载日志记录。
xferlog_enable=YES
#
# 确保 PORT 传输连接来自端口 20 (ftp-data)。
connect_from_port_20=YES
local_root=/home/ftp
anon_root=/home/ftp
#
# 如果需要,你可以安排上传的匿名文件由不同的用户拥有。注意!不建议将上传文件归属于 "root" 用户!
# chown_uploads=YES
# chown_username=whoever
#
# 你可以覆盖日志文件的存放位置。默认路径如下。
# xferlog_file=/var/log/vsftpd.log
#
# 如果需要,你可以使用标准 ftpd xferlog 格式的日志文件。
# 注意,在这种情况下,默认的日志文件位置为 /var/log/xferlog。
# xferlog_std_format=YES
#
# 你可以更改超时闲置会话的默认值。单位秒,下同
idle_session_timeout=1800
#
# 你可以更改超时数据连接的默认值。
data_connection_timeout=1200
#
# 建议你在系统上定义一个唯一的用户,供 FTP 服务器使用,作为完全隔离且没有特权的用户。
# nopriv_user=ftpsecure
#
# 启用此选项,服务器将识别异步 ABOR 请求。由于代码较为复杂,安全性方面不推荐启用此项。
# 如果不启用,某些旧的 FTP 客户端可能会遇到问题。
# async_abor_enable=YES
#
# 在默认情况下,服务器会假装允许 ASCII 模式,但实际上会忽略该请求。
# 打开以下选项,服务器将在 ASCII 模式下对文件进行 ASCII 格式的修改。
# 注意:在某些 FTP 服务器中,ASCII 支持允许通过 "SIZE /big/file" 命令在 ASCII 模式下发起拒绝服务攻击(DoS)。vsftpd 已经预测到此攻击并始终保持安全,报告的是原始文件的大小。
# ASCII 格式修改是该协议的一项糟糕特性。
# ascii_upload_enable=YES
# ascii_download_enable=YES
#
# 你可以完全自定义登录横幅信息:
ftpd_banner=Welcome to blah FTP service.
#
# 你可以指定一个禁止匿名电子邮件地址的文件。此功能对于防范某些 DoS 攻击可能很有用。
# deny_email_enable=YES
# (默认值如下)
# banned_email_file=/etc/vsftpd.banned_emails
#
# 你可以指定一个本地用户的显式列表,将这些用户 chroot() 到他们的主目录。如果 chroot_local_user 为 YES,
# 则此列表变为不进行 chroot() 操作的用户列表。
# (警告!chroot() 可能非常危险。如果使用 chroot,请确保用户对 chroot 目录的顶级目录没有写权限)
# chroot_local_user=NO 即 chroot_list_file 文件中用户将会被限制在其家目录中
chroot_local_user=NO
chroot_list_enable=YES
# (默认值如下)
chroot_list_file=/usr/local/etc/vsftpd.chroot_list
allow_writeable_chroot=YES
#
# 你可以启用内置 ls 的 "-R" 选项。默认情况下禁用此选项,以避免远程用户在大站点上引起过多 I/O。
# 然而,一些有缺陷的 FTP 客户端(如 "ncftp" 和 "mirror")假设存在 "-R" 选项,因此启用它有一定的理由。
# ls_recurse_enable=YES
#
# 当启用 "listen" 指令时,vsftpd 以独立模式运行,并监听 IPv4 套接字。此指令不能与 listen_ipv6 指令同时使用。
listen=YES
#
# 此指令启用监听 IPv6 套接字。如果要同时监听 IPv4 和 IPv6 套接字,则必须使用两个不同的配置文件运行两个 vsftpd 实例。
# 确保其中一个 listen 选项被注释掉!!
# listen_ipv6=YES
# 此选项应该是一个空目录的路径。
# 此目录不应可写给 FTP 用户。该目录在 vsftpd 不需要文件系统访问时用作安全的 chroot() 监狱。
secure_chroot_dir=/usr/local/share/vsftpd/empty
# 如果启用后台模式,此选项才有效。
# 它会将运行中的守护进程的 PID 写入指定路径的文件中。
# 默认情况下不创建 PID 文件。
# pid_file=/var/run/vsftpd.pid
# 如果在独立模式下使用 vsftpd,请取消注释下面两行:
listen=YES
background=YES
# 使用本地时间
use_localtime=YES
vsftpd.chroot_list
创建并编辑/usr/local/etc/vsftpd.chroot_list
,加入用户 ftptest
# mkdir -p /home/ftp
# chown -R ftp:ftp /home/ftp
# chmod -R 775 /home/ftp
# service vsftpd enable # 添加服务
# service vsftpd start # 开始服务
# service vsftpd stop # 停止服务
# service vsftpd restart # 重启服务
使用用户 ftptest
,密码 z
登录 FTP 即可。
vsftpd 日志在 /var/log/vsftpd.log
简单示例:
# telnet localhost 21
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 FTP Server ready
quit
221 Goodbye.
使用 ftp
命令可以快速连接到 FTP 服务器。
用法:
ftp [选项] [IP 地址]
FTP 命令:
account [密码] 提交补充密码
put 上传
bell 在文件传送完后发出提示音
dir/ls 显示该目录下的文件及文件夹
cd 切换目录
delete 删除文件
features 显示该服务器支持的功能
get 远程文件 下载服务器上的远程文件
bye 结束与服务器的会话
实例:
PS C:\Users\ykla> ftp 192.168.179.150
连接到 192.168.179.150。
220 Welcome to blah FTP service.
200 Always in UTF8 mode.
用户(192.168.179.150:(none)): ftptest
331 Please specify the password.
密码:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
FreeBSD完全攻略QA版 (冯宝坤,陈子鸿编著, 冯宝坤, 陈子鸿编著, 冯宝坤, 陈子鸿).pdf
FreeBSD技术内幕 ((美) Michael Urban,(美)Brian Tiemann著 智慧东方工作室译).pdf
哲学史期末.docx
马克思主义哲学原理.doc
226 Directory send OK.
ftp: 收到 288 字节,用时 0.00秒 96.00千字节/秒。
ftp> delete 哲学史期末.docx
250 Delete operation successful.
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw------- 1 1003 14 147170778 Mar 06 15:39 FreeBSD完全攻略QA版 (冯宝坤,陈子鸿编著, 冯宝坤, 陈子鸿编著, 冯宝坤, 陈子鸿).pdf
-rw------- 1 1003 14 47037557 Mar 06 15:39 FreeBSD技术内幕 ((美) Michael Urban,(美)Brian Tiemann著 智慧东 方工作室译).pdf
-rw------- 1 1003 14 591146 Oct 20 11:28 马克思主义哲学原理.doc
226 Directory send OK.
ftp: 收到 435 字节,用时 0.01秒 54.38千字节/秒。
ftp> get 马克思主义哲学原理.doc
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for 马克思主义哲学原理.doc (591146 bytes).
226 Transfer complete.
ftp: 收到 591146 字节,用时 0.01秒 42224.71千字节/秒。
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
FreeBSD完全攻略QA版 (冯宝坤,陈子鸿编著, 冯宝坤, 陈子鸿编著, 冯宝坤, 陈子鸿).pdf
FreeBSD技术内幕 ((美) Michael Urban,(美)Brian Tiemann著 智慧东方工作室译).pdf
马克思主义哲学原理.doc
226 Directory send OK.
ftp: 收到 266 字节,用时 0.00秒 66.50千字节/秒。
ftp> lcd
目前的本地目录 C:\Users\ykla。
ftp> put UOS使用打印机.pdf
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 1269989 字节,用时 0.04秒 36285.40千字节/秒。
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw------- 1 1003 14 147170778 Mar 06 15:39 FreeBSD完全攻略QA版 (冯宝坤,陈子鸿编著, 冯宝坤, 陈子鸿编著, 冯宝坤, 陈子鸿).pdf
-rw------- 1 1003 14 47037557 Mar 06 15:39 FreeBSD技术内幕 ((美) Michael Urban,(美)Brian Tiemann著 智慧东 方工作室译).pdf
-rw------- 1 1003 14 1269989 Mar 27 15:13 UOS使用打印机.pdf
-rw------- 1 1003 14 591146 Oct 20 11:28 马克思主义哲学原理.doc
226 Directory send OK.
ftp: 收到 515 字节,用时 0.01秒 46.82千字节/秒。
ftp> bye
221 Goodbye.
PS C:\Users\ykla>
FTP 默认下载路径是 C:\Users\你的用户名
,我是 C:\Users\ykla
。
,775 权限设置来自此处
,本文框架基于此
官网文档在此 ,中文翻译在金步国的 。
,其修改自 。本文框架基于此。