需求
使用虚拟用户登录访问ftp, 指定用户访问, 公网访问, 保证安全.
ps.折腾了一整晚发现如果仅仅是自用的话, 用SSH自带的
sftp
完全满足需要, 最关键的是不需要任何配置!!!
然后下面的内容不用看了, 权当是个人记录....
本文涉及到的linux基本操作:
- useradd 和 groupadd 用户管理;
- chown 和 chmod 文件权限管理;
- PAM
安装
apt install vsftpd
配置
vim /etc/vsftpd.conf
本人配置内容如下:
listen=NO
listen_ipv6=YES
dirmessage_enable=YES
use_localtime=YES
#打开日志记录
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/xferlog
#禁止匿名访问
anonymous_enable=NO
#允许本地用户访问,就是linux本机中存在的用户
local_enable=YES
#开启写模式
write_enable=YES
#本地用户上传文件的umask值
local_umask=022
#白名单用户
userlist_enable=YES
#是否启动userlist为禁止模式,YES表示在userlist中的用户禁止登录ftp(黑名单),NO表示黑名单失效,我们已经让userlist作为一个白名单,所以无需使用黑名单功能
userlist_deny=NO
#指定哪个文件作为userlist文件
userlist_file=/etc/vsftpd/vsftpd.user_list
#是否限制本地所有用户切换根目录的权限,YES为开启限制
chroot_local_user=YES
#是否启动限制用户的名单list为允许模式,上面的YES限制了所有用户,可以用这个名单作为白名单,作为例外允许访问ftp根目录以外的目录
chroot_list_enable=YES
#设置哪个文件是list文件,里面的用户将不受限制的去访问ftp根目录以外的目录
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
#是否开启写模式,开启后可以进行创建文件夹等写入操作
allow_writeable_chroot=YES
#开启虚拟用户模式
guest_enable=YES
#指定虚拟用户映射的本地账户
guest_username=vsftpd
#虚拟用户权限配置文件夹
user_config_dir=/etc/vsftpd/vusers_permission
secure_chroot_dir=/var/run/vsftpd/empty
#指定PAM文件
pam_service_name=vsftpd.vu
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
#开启被动模式
pasv_enable=YES
#被动模式端口范围
pasv_min_port=60000
pasv_max_port=60099
#关闭PASV模式的安全检查。该检查确保数据连接和控制连接是来自同一个IP地址
#pasv_promiscuous=YES
#主动模式
#connect_from_port_20=YES
使用
service vsftpd start
service vsftpd restart
service vsftpd stop
service vsftpd status
ftp 的原理
ftp 是双通道的,一个负责命令,一个负责数据。分为主动模式和被动模式。负责命令的端口是 21,在主动模式下,负责数据的端口是 20,在被动模式下负责数据的端口是随机的……大部分客户端如 FillaZilla 是可以自行配置用主动模式还是被动模式。你用主动模式就把服务器的安全策略组里的的 21 和 20 打开。
如果是被动模式,你可以在/etc/vsftpd/vsftpd.conf
下面可以配置一个地址段,比如 60000-61000
配置ftp为被动模式
#connect_from_port_20=YES
pasv_enable=YES
pasv_min_port=60000
pasv_max_port=61000
然后在阿里云安全策略组里打开这一个范围(60000/61000 ),这样相当于开了 1000 个端口允许连接
创建&配置虚拟用户
todo
pam_service_name=vsftpd.vu
创建&配置本地用户
创建vsftpd服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。FTP服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。
比如我要创建的本地用户是 vsftpd
, 其用户主目录为 /var/ftproot
- 创建用户
useradd -d /var/ftproot -s /sbin/nologin vsftpd
创建完成后可以通过 id vsftpd
命令查看vsftpd用户的信息:
id vsftpd
uid=1002(vsftpd) gid=1002(vsftpd) groups=1002(vsftpd)
- 配置用户主目录
//创建主目录
mkdir /var/ftproot
//修改主目录所有者
chown -R vsftp:vsftp /var/ftproot
//修改目录权限
chmod -Rf 755 /var/ftproot/
//查看配置结果
ls -ldih /var/ftproot
1058397 drwxr-xr-x 4 vsftpd vsftpd 4.0K Jun 10 22:29 ftproot
客户端选择
- 浏览器地址栏输入 ftp:ip
- mac finder (打开finder后, cmd + k)也可以连接, 但是貌似局限于局域网.
- 推荐使用 FillaZilla, 可以看到整个连接过程的日志, 遇到问题可以方便调试.
错误处理
1. vsftpd 425 Security: Bad IP connecting
测试以下方法会导致vsftpd无法启动
//打开配置文件
vim /etc/vsftpd.conf
//添加:
pasv_promiscuous=YES
//重启vsftpd
service vsftpd restart
pasv_promiscuous选项参数说明:
此选项激活时,将关闭PASV模式的安全检查。该检查确保数据连接和控制连接是来自同一个IP地址。小心打开此选项。此选项唯一合理的用法是存在于由安全隧道方案构成的组织中。默认值为NO。
合理的用法是:在一些安全隧道配置环境下,或者更好地支持FXP时(才启用它)。
参考资料
网友评论