vsftp
是 linux 下非常有名的一个 ftp 服务器程序。不过其配置稍微有点复杂。以下对其配置作简单说明。
先贴一段目前在用的配置(已把注释部分去掉了),本配置的效果有:
listen=NO listen_ipv6=YES anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES use_localtime=YES xferlog_enable=YES connect_from_port_20=YES secure_chroot_dir=/var/run/vsftpd/empty pam_service_name=vsftpd # 以上基本是一些默认的配置,后面的是自定义内容,详细的说明在后面。 ftpd_banner="Welcome to Gulucat FTP service." utf8_filesystem=YES guest_enable=YES virtual_use_local_privs=YES chroot_local_user=YES user_sub_token=$USER local_root=/data/ftp_home/$USER hide_ids=YES allow_writeable_chroot=YES rsa_cert_file=/etc/ssl/certs/ftp_example_com.crt rsa_private_key_file=/etc/ssl/private/ftp_example_com.key ssl_enable=YES force_anon_data_ssl=YES force_anon_logins_ssl=YES pasv_enable=YES pasv_min_port=12001 pasv_max_port=12002
以下是一些细节的说明。
# No anonymous login anonymous_enable=NO # Let local users login # If you connect from the internet with local users, you should enable TLS/SSL/FTPS # 设定本地用户可以访问。注意:使用虚拟用户时,也要先开启此项。 local_enable=YES # Write permissions write_enable=YES
说明: 程序安装好的默认设置跟上面的设置一致,故未更改。作为一个非公共ftp,必须登录才能使用,因此需要禁止匿名访问。
chroot_local_user=YES chroot_list_enable=NO
chroot_local_user=NO chroot_list_enable=YES # Create the file /etc/vsftpd.chroot_list with a list of the jailed users. # 即所有在 /etc/vsftpd.chroot_list 中列出来的用户会被限制在固定目录中。
chroot_local_user=YES chroot_list_enable=YES # Create the file /etc/vsftpd.chroot_list with a list of the "free" users. # 即只有在 /etc/vsftpd.chroot_list 中列出来的用户不会被限制,可以自由访问目录。
说明: 由于我们目前的需求是所有(虚拟)用户的访问都要限定在特定的目录里,因此直接使用了第1种方式:限制所有用户的访问。
说到虚拟用户,不得不说 linux 的 pam 认证模块,它是通过配置的方式定义一系列的认证规则,非常灵活。pam
认证模块的详细介绍可以自行百度。
vsftpd 默认使用 pam 进行认证,以下是默认设置:
pam_service_name=vsftpd
这里的 vsftpd 是 pam 的服务名称,简单来说就是对应的配置文件名称,相应的配置路径为: /etc/pam.d/vsftpd
。(最终的配置文件名称要跟服务名称对应)
该配置文件默认是允许系统用户进行登录的。相应选项为:
@include common-account @include common-session @include common-auth
由于我们要使用虚拟用户,因此我们需要修改该配置文件:
# 注释掉其他选项,只留下自己的修改信息 # 使用 pam_userdb 模块进行认证,用户数据库文件为 /etc/vsftpd/access.db auth required pam_userdb.so db=/etc/vsftpd/access account required pam_userdb.so db=/etc/vsftpd/access session required pam_loginuid.so
access.db 文件的生成方式:
# 1. 编辑账号和密码文件,格式为一行账号一行密码 vi /etc/vsftpd/access.txt # 如以下内容定义了两个账号:ftp_user_1和ftp_user_2,密码分别为 ftp_password_1和ftp_password_2 ftp_user_1 ftp_password_1 ftp_user_2 ftp_password_2 # 2. 使用 db_load 工具生成 db 数据库文件。 db_load 工具需要安装 db-util 包。 db_load -T -t hash -f /etc/vsftpd/access.txt /etc/vsftpd/access.db
以上为虚拟账号的创建和认证
进行完以上设置后,还需要在 /etc/vsftpd.conf 的配置文件中加上一些额外设置
# 启用虚拟账号,必须开启guest guest_enable=YES # 虚拟账号使用本地权限 virtual_use_local_privs=YES # 限制所有用户的访问路径(前文介绍过) chroot_local_user=YES # 以下两条为限制的具体路径 user_sub_token=$USER local_root=/data/ftp_home/$USER hide_ids=YES # 允许写操作。(如果没有这条,客户端进行写操作时会有警告。) allow_writeable_chroot=YES
# 开启 SSL 和定义证书路径 rsa_cert_file=/etc/ssl/certs/ftp_example_com.crt rsa_private_key_file=/etc/ssl/private/ftp_example_com.key ssl_enable=YES # 强制匿名用户也使用 SSL。 (测试时,如果未开此选项,虚拟用户登录时未使用 SSL 方式。) force_anon_data_ssl=YES force_anon_logins_ssl=YES
# 使用被动传输模式,并限定端口为 12001~12002 pasv_enable=YES pasv_min_port=12001 pasv_max_port=12002
使用 filezilla 等 ftp 客户端时,默认字符集设置为自动检测,它检测服务器是否支持 utf8 ,不支持时回滚到本地编码。
使用以下设置,让服务器告诉客户端使用 utf8 字符集。
utf8_filesystem=YES