阿里云搭建FTP服务器
阿里云搭建 FTP 服务器
前置条件
- 阿里云服务器
- vsftpd(介绍)
安装与配置
安装
yum install -y vsftpd
进入文件夹
cd /etc/vsftpd/

vsftpd.conf是核心配置文件ftpusers是黑名单文件,此文件里的用户不允许访问 FTP 服务器user_list是白名单文件,是允许访问 FTP 服务器的用户列表
常用配置
#允许匿名用户登录FTP
anonymous_enable=YES
#设置匿名用户的登录目录(如需要,需自己添加并修改)
anon_root=/var/ftp/pub
#打开匿名用户的上传权限
anon_upload_enable=YES
#打开匿名用户创建目录的权限
anon_mkdir_write_enable=YES
#打开匿名用户删除和重命名的权限(如需要,需自己添加)
anon_other_write_enable=YES
#匿名用户的掩码(如需要,需自己添加,含义:如umask是022,这时创建一个权限为666的文件,文件的实际权限为666-022=644)
anon_umask=022
vsftpd安装后默认开启了匿名 FTP 的功能,使用匿名 FTP,用户无需输入用户名密码即可登录 >FTP 服务器,但没有权限修改或上传文件
配置匿名用户上传文件权限
在此之前我们先复制一份配置文件如下:
cat vsftpd.conf |grep -v "#" | grep -v "^$" > vsftpd.conf1

在重命名一下,这样做的原因是把没有注释的成为主配置来使用
mv vsftpd.conf vsftpd.conf2mv vsftpd.conf1 vsftpd.conf

修改 vsftpd.conf 的配置文件的选项,可以赋予匿名 FTP 更多的权限。
vim /etc/vsftpd/vsftpd.conf
# 是否禁止匿名登录
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
# 是否允许登录用户的写入操作
allow_writeable_chroot=YES
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=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
# 是否关闭passive的安全检测
pasv_promiscuous=YES
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
运行以下命令更改/var/ftp/pub目录的权限,为 FTP用户添加写权限,并重新加载配置文件
chown root /var/ftp
chmod o+w /var/ftp/pub/systemctl restart vsftpd.service
配置本地用户登录
本地用户登录就是指用户使用 Linux 操作系统中的用户账号和密码登录 FTP 服务器
可在 ftpuser(黑名单)和 userlist(白名单)中添加用户
vsftpd 安装后默只支持匿名 FTP 登录,用户如果试图使用 Linux 操作系统中的账号登录服务器,将会被 vsftpd 拒绝,但可以在 vsftpd 里配置用户账号和密码登录。具体步骤如下:
cd /var/ftp/pub/useradd test1
passwd test1

添加test1本地帐户,下面是用业查询本地帐号,及黑名单
cat /etc/passwd

vi /etc/vsftpd/ftpusers

vi /etc/vsftpd/user_list

Windows FTP 来登录及测试
在用Windows连接前我们先做几个配置:
服务器就可以把安全组放开21端口,不是服务器也要放开 21端口那就先执行以下命令

firewall-cmd --zone=public --add-port=21/tcp --permanentfirewall-cmd --zone=public --permanent --add-port=30000-30999/tcpfirewall-cmd --reload



坚信vsftp安装后不对/etc/vsftpd/vsftpd.conf做任何修改就可以通过新建的Linux用户(本地用户)访问下载和上传文件
匿名用户配置
修改配置文件
vim /etc/vsftpd/vsftpd.conf
# 是否禁止匿名登录
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
# 是否允许登录用户的写入操作
allow_writeable_chroot=YES
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=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
# 是否关闭passive的安全检测
pasv_promiscuous=YES
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
重启服务器
systemctl restart vsftpd
touch /var/ftp/pub/xm.txtchown ftp /var/ftp/pub
服务器配置上面的就可以访问并上传文件到pub目录下
虚拟用户配置
1、添加虚拟用户口令文件并生成认证文件
vim /etc/vsftpd/vuser.txt
文件格式:用户名和密码分别占两行,用户名在前。
添加虚拟用户tom和jack,密码分别为 tom123 和 jack123。
tom
tom123
jack
jack123
下载依赖和配置
yum -y install db4-utilsdb_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db
2、编辑vsftpd的PAM认证文件
vim /etc/pam.d/vsftpd

#%PAM-1.0
#session optional pam_keyinit.so force revoke
#auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth required pam_shells.so
#auth include password-auth
#account include password-auth
#session required pam_loginuid.so
#session include password-auth
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
3、建立本地映射用户并设置宿主目录权限
useradd -d /home/vftproot -s /sbin/nologin vuserchmod 600 /home/vftproot/
4、修改配置文件,重启vsftpd服务,并测试
vi /etc/vsftpd/vsftpd.conf
把你之前的删除,只留现在我的
# 是否禁止匿名登录
anonymous_enable=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
# 是否允许登录用户的写入操作
allow_writeable_chroot=YES
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=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
# 是否关闭passive的安全检测
pasv_promiscuous=YES
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
##
guest_enable=YES
guest_username=vuser
重启服务器
systemctl restart vsftpd.service
5、调整虚拟用户权限,并继续设置:到此下载可以但上传是不是行的
mkdir /home/vftproot/pubchmod 777 /home/vftproot/publl -d /home//vftproot/pub


常用命令
http://vsftpd.beasts.org/vsftpd_conf.html
| 介绍 | 命令 |
|---|---|
| 开机自启vsftpd | systemctl enable vsftpd.service |
| 启动vsftpd | systemctl start vsftpd.service |
| 停止vsftpd | systemctl stop vsftpd.service |
| 重启vsftpd | systemctl restart vsftpd.service |
# 设置是否允许匿名用户登录
anonymous_enable=NO
# 匿名用户登录目录
anon_root=/home/anonymitys/# 用户只读配置
# 设置 NO 表示用户可以浏览 FTP 目录和下载文件
anon_world_readable_only=NO# 设置是否允许本地用户登录
local_enable=YES# 设置本地用户目录(因为是映射到另一个用户配置目录,所以这里暂时不需要指定目录)
local_root=/home/locals/robotlab2020# NO 不允许下载
#download_enable=NO# 不同用户不同权限,将不同用户不同权限的配置映射到其他目录下的文件去配置
#user_config_dir=/etc/vsftpd_user_conf# 是否允许本地用户对FTP服务器文件具有写权限,默认设置为YES允许
# 因为具体的是否有此权限调整到/etc/vsftpd_user_conf配置了,所以这里注释掉,不打开
#write_enable=YES# 掩码,本地用户掩码默认为777,也可直接设置为缺省的022
local_umask=022# 匿名用户是否允许上传,须将全局的write_enable=YES。默认为YES
anon_upload_enable=NO# 是否允许匿名用户创建新文件夹
#anon_mkdir_write_enable=YES###
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
#chown_uploads=YES
#chown_username=whoever
#xferlog_file=/var/log/xferlog
xferlog_std_format=YES
#idle_session_timeout=600
#data_connection_timeout=120
#nopriv_user=ftpsecure
#async_abor_enable=YES
#### 是否以ASCII方式传输数据。默认情况下,服务器会忽略ASCII方式的请求。
# 启用此选项将允许服务器以ASCII方式传输数据
#ascii_upload_enable=YES
#ascii_download_enable=YES###
#ftpd_banner=Welcome to blah FTP service.
#deny_email_enable=YES
#banned_email_file=/etc/vsftpd/banned_emails
#### 用于指定用户列表文件中的用户是否允许切换到上级目录。默认值为 NO。
chroot_local_user=YES# 设置是否启用 chroot_list_file 配置项指定的用户列表文件。默认值为 NO。
chroot_list_enable=NO# 用于指定用户列表文件,该文件用于控制哪些用户 可以 切换到用户家目录的 上级目录。
#chroot_list_file=/etc/vsftpd/chroot_list###########################
# 注:
#(1)当chroot_local_user=YES,chroot_list_enable=YES 时,在 /etc/vsftpd.chroot_list 文件中
#列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录。
#(2)当 chroot_local_user=NO,chroot_list_enable=YES 时,在 /etc/vsftpd.chroot_list 文件中
#列出的用户,不能切换到其他目录;未在文件中列出的用户,可以切换到其他目录。
# !!(3)当 chroot_local_user=YES, chroot_list_enable=NO 时,所有的用户均不能切换到其他目录。
#(4)当 chroot_local_user=NO, chroot_list_enable=NO 时,所有的用户均可以切换到其他目录。
############################ls_recurse_enable=YES# 是否允许监听。
# 如果设置为YES,则vsftpd将以独立模式运行,由vsftpd自己监听和处理IPv4端口的连接请求
listen=YES# 设定是否支持IPV6。如要同时监听IPv4和IPv6端口,
# 则必须运行两套vsftpd,采用两套配置文件
# 同时确保其中有一个监听选项是被注释掉的
#listen_ipv6=YES# 虚拟用户使用 PAM 认证方式
pam_service_name=vsftpd###
#控制用户访问 FTP 的文件,里面写着用户名称。一个用户名称一行。(用 userlist 来限制用户访问)
userlist_enable=YES# 名单中的人不允许访问
# userlist_deny=no # 限制名单文件放置的路径
# userlist_file=/etc/vsftpd/userlist_deny.chroottcp_wrappers=YES# 若设置为 YES,则使用 PASV 工作模式(被动模式);若设置为 NO,则使用 PORT 模式。默认值为 YES,即使用 PASV 工作模式。
pasv_enable=YES
# 设置 FTP 服务器在指定的 IP 地址上侦听用户的 FTP 请求。
pasv_address=<ip地址>
# 在 PASV 工作模式下,数据连接可以使用的端口范围的最小端口和最大端口,0表示任意端口。默认值为 0。
pasv_min_port=<最小端口号>
pasv_max_port=<最大端口号>#500 OOPS: vsftpd: refusing to run with writable root inside chroot ()错误时添加
# 从 2.3.5 之后,vsftpd 增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!
# 如果检查发现还有写权限,就会报该错误。
# 要修复这个错误,可以用命令 chmod a-w /home/dgut 去除用户主目录的写权限,注意把目录替换成你自己的;
# 或者可以在 vsftpd 的配置文件中增加下列项,将值设置为 YES
allow_writeable_chroot=YES
idea连接ftp
<dependency><groupId>cn.hutoolgroupId><artifactId>hutool-allartifactId><version>5.7.21version>
dependency><dependency><groupId>commons-netgroupId><artifactId>commons-netartifactId><version>3.8.0version>
dependency>
<dependency><groupId>antgroupId><artifactId>ant-jakarta-oroartifactId><version>1.6.1version>
dependency><dependency><groupId>org.springframeworkgroupId><artifactId>spring-contextartifactId><version>5.3.15version>
dependency>
Java 代码开始了
public class updateHootlFtp {public static void main(String[] args) throws IOException {insertFile("远程文件夹目录","test.txt");} /*** @param directory 远程目录的位置* @param winFilePath 本地文件名称* @throws IOException*/public static void insertFile(String directory,String winFilePath) throws IOException {//匿名登录(无需帐号密码的FTP服务器)//Ftp ftp = new Ftp("远程host", 服务端口号, "远程登录用户", "远程登录密码",Charset.forName("utf-8"));Ftp ftp = new Ftp("远程host", 21, "远程登录用户", "远程登录密码",Charset.forName("utf-8"));try {//启动被动模式ftp.setMode(FtpMode.Passive);//进入远程目录ftp.cd("/root/img/");//上传本地文件boolean flag = ftp.upload("/root/img/", FileUtil.file("E:\\Test\\"+winFilePath));System.err.println( flag ? "上传成功" : "上传失败!!");} catch (Exception e) {e.printStackTrace();} finally {//关闭连接ftp.close();}}}
idea查询本地文件夹中的文件
public class WinFile {public static void main(String[] args) {//输入一个路径String path = "E:\\Game\\test";getFile(path);System.out.println("统计完毕");}private static void getFile(String path) {File f = new File(path);File[] fs = f.listFiles();if (fs == null) {return;}for (File file : fs) {//将统计的文件的字节数(单位:B) 方便计算大小if (file.isFile()) {System.out.println("文件名:" + file.getName() + ",文件大小是:" + file.length());} else {getFile(file.getAbsolutePath());}}}
}
# 完成
参考文献
命令详解: https://blog.csdn.net/qq_57258570/article/details/121605842
FTP连接时出现“227 Entering Passive Mode”:https://www.cnblogs.com/bkywanly/p/9767246.html
CentOS7服务器环境下vsftpd安装及配置方法:https://www.yingsoo.com/news/posts/65516.html
vsftpd 配置文件超详细讲解(常用参数配置):https://blog.csdn.net/Awwwze/article/details/109405632
227 Entering Passive Mod:https://blog.51cto.com/whnba/1619597
虚拟用户:https://blog.csdn.net/owenxiaobai/article/details/128441281
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
