背景
领导说,要搞个ftp服务,方便各个部门的人下载资源,我觉得确实有这个必要,速度给他搞一个。
分析需求
1.各个部门一个账号和密码
2.有个公共的文件夹public,每个账号都能够访问
3.各自部门的账号,只能下载自己文件夹下的文件和public文件夹下的文件,看不到其他用户的目录
4.要能通过浏览器下载
5.前10m不受限制,之后限制下载速度为2m/s
规划
/app/vsftpd/public(公共文件夹)
/app/vsftpd/u01(u01用户的文件夹)
/app/vsftpd/u02(u02用户的文件夹)
/app/vsftpd/u03(u03用户的文件夹)
部署
1.安装vsftpd+nginx
# 安装vsftpd和nginx(nginx也可以选择自己编译)
sudo yum install -y vsftpd nginx
# 安装ftp客户端用于测试
sudo yum install -y ftp
# 启动服务并设置开机自启
sudo systemctl start vsftpd
sudo systemctl enable vsftpd
sudo systemctl start nginx
sudo systemctl enable nginx
# 开放防火墙端口
sudo firewall-cmd --permanent --add-port=21/tcp
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
2.创建目录结构和用户
# 创建主目录结构
sudo mkdir -p /app/vsftpd/{public,u01,u02,u03}
# 创建用户并设置主目录
sudo useradd -d /app/vsftpd/u01 -s /sbin/nologin u01
sudo useradd -d /app/vsftpd/u02 -s /sbin/nologin u02
sudo useradd -d /app/vsftpd/u03 -s /sbin/nologin u03
# 设置密码(交互式,按提示设置密码)
sudo passwd u01
sudo passwd u02
sudo passwd u03
# 设置目录权限
sudo chown u01:u01 /app/vsftpd/u01
sudo chown u02:u02 /app/vsftpd/u02
sudo chown u03:u03 /app/vsftpd/u03
sudo chmod 755 /app/vsftpd/public
sudo chmod 755 /app/vsftpd/u0{1,2,3}
# 创建公共目录的符号链接到各用户目录
sudo ln -s /app/vsftpd/public /app/vsftpd/u01/public
sudo ln -s /app/vsftpd/public /app/vsftpd/u02/public
sudo ln -s /app/vsftpd/public /app/vsftpd/u03/public
3.配置VSFTPD
[root@mail public]# cat /etc/vsftpd/vsftpd.conf |grep -v ^#|grep -v ^$
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
tcp_wrappers=YES
chroot_local_user=YES
allow_writeable_chroot=YES
pasv_min_port=40000
pasv_max_port=45000
#local_root=/app/vsftpd/$USER
#限制VSFTP服务器同时接受的最大总连接数为50个
max_clients=50
#限制单个IP地址最多只能建立5个并发连接
max_per_ip=5
4.创建用户列表文件
echo -e "u01\nu02\nu03" | sudo tee /etc/vsftpd/user_list
5.重启vsftp服务
sudo systemctl restart vsftpd
6.配置nginx.conf
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
server {
listen 80;
server_name your-server-ip-or-domain;
location /files/ {
#client_max_body_size 500M;
# 前10MB不限制,之后限制为2M/s
limit_rate_after 10m;
limit_rate 2048k;
alias /app/vsftpd/$remote_user/;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
charset utf-8;
auth_basic "Restricted Access";
auth_basic_user_file /app/nginx/conf/ftp.passwd;
}
}
7.创建认证文件(为Web访问设置密码)
sudo yum install -y httpd-tools
htpasswd -c /app/nginx/conf/ftp.passwd u01
htpasswd -c /app/nginx/conf/ftp.passwd u02
htpasswd -c /app/nginx/conf/ftp.passwd u03
如果您不想安装 httpd-tools,也可以使用 OpenSSL 创建密码文件:
# 创建 u01 的密码(会提示输入密码)
printf "u01:$(openssl passwd -crypt)\n" | sudo tee /app/nginx/conf/ftp.passwd
# 添加 u02
printf "u02:$(openssl passwd -crypt)\n" | sudo tee -a /app/nginx/conf/ftp.passwd
# 添加 u03
printf "u03:$(openssl passwd -crypt)\n" | sudo tee -a /app/nginx/conf/ftp.passwd
8.检查并重启nginx
sudo nginx -t
sudo systemctl restart nginx
9.验证
http://xxx.xxx.xxx.xxx:{port}/files/
后续新增用户配置
比如新增用户u05
# 创建主目录结构
mkdir -p /app/vsftpd/u05
# 创建用户并设置主目录
sudo useradd -d /app/vsftpd/u05 -s /sbin/nologin u05
sudo passwd u05
# 设置目录权限
sudo chown u05:u05 /app/vsftpd/u05
sudo chmod 755 /app/vsftpd/u05
# 创建公共目录的符号链接到各用户目录
ln -s /app/vsftpd/public /app/vsftpd/u05/public
# 创建用户列表文件
echo "u05" >> /etc/vsftpd/user_list
# 重启vsftp服务
sudo systemctl restart vsftpd
# 设置用户在web页面上的访问密码(建议使用强算法)
htpasswd -B -C 12 /app/nginx/conf/ftp.passwd u05 # bcrypt, cost=12