服务器初始化操作
- 为了调试顺利,关闭selinux,firewall,iptables
- 如果不允许root账户直接登录,可以设置sshd_config
- 根据个人需求安装自己需要的程序。
yum -y install gcc lrzsz vim wget
科普
Port模式(主动模式):
当客户端C向服务端S连接后,使用的是Port模式,那么客户端C会发送一条命令告诉服务端S(客户端C在本地打开了一个端口N在等着你进行数据连接),当服务端S收到这个Port命令后,就会向客户端打开的那个端口N进行连接,这种数据连接就生成了。
Pasv模式(被动模式):
当客户端C向服务端S连接后,服务端S会发信息给客户端C,这个信息是(服务端S在本地打开了一个端口M,你现在去连接我吧),当客户端C收到这个信息后,就可以向服务端S的M端口进行连接,连接成功后,数据连接也建立了。
这种模式,可以直接用Win10的“资源管理器”打开 ftp。
环境介绍:
- CentOS 7.4
- IP:192.168.1.238
- Client:Win10
开始安装
1、安装 vsftp
yum -y install vsftpd
2、启动服务
systemctl start vsftpd.service
3、配置文件路径
cd /etc/vsftpd
功能一(匿名)
1、首先我们在企业中ftp服务器,一般情况下都会有个共享服务器,允许员工下载一些公司的软件或者常用的软件包(方便,不用再取外网去下载,也省带宽)
2、vsftp提供了匿名登录,默认anonymous_enable=YES
的情况下,就启用了匿名访问,这种情况下你只能把需要给用户的文件,存放到/var/ftp/pub
下(默认路径),如果想更改的话需要添加anon_root= /data/pub
,后面的路径就是匿名登录后实际访问的目录。如果,总是那么多如果,匿名用户也需要上传的功能的话(一般情况下不会的)
anonymous_enable=YES #允许匿名访问 anon_root= /data/pub #匿名访问的本地实际目录 local_enable=YES anon_upload_enable=YES #允许匿名用户上传文件(须将全局的write_enable=YES,默认YES) anon_mkdir_write_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
3、我们设置了匿名访问的目录是/data/pub里面,还是上传不了文件,有人说直接改成777就可以,但是改成777就无法访问了,这是由于vsftpd的安全性设置,我们需要在pub里面再创建一个upload的文件(文件夹名字随便起),给他一个777的权限就OK了。
功能二(虚拟用户):
1、首先修改配置文件
cd /etc/vsftpd cp vsftpd.conf vsftpd.conf.bak touch vsftpd.conf
2、配置文件内容(虚拟用户必须关闭匿名用户anonymous_enable=NO)
anonymous_enable=NO # 不允许匿名访问,禁用匿名登录 write_enable=YES chroot_local_user=YES # 启用限定用户在其主目录下 chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list #允许访问其他目录的用户名单 use_localtime=YES # 使用本地时(自行添加) local_enable=YES # 允许使用本地帐户进行FTP用户登录验证 allow_writeable_chroot=YES # 如果启用了限定用户在其主目录下需要添加这个配置,解决报错 500 OOPS: vsftpd: refusing to run with writable root inside chroot() xferlog_enable=YES # 启用上传和下载的日志功能,默认开启。 local_umask=022 # 设置本地用户默认文件掩码022,# FTP上本地的文件权限,默认是077,不过vsftpd安装后的配置文件里默认是022 pam_service_name=vsftpd listen_port=21 # 监听的端口号,默认:21 use_localtime=YES idle_session_timeout=120 data_connection_timeout=120 guest_enable=YES guest_username=ftpuser user_config_dir=/etc/vsftpd/vuser_conf # 虚拟用户,配置文件路径 virtual_use_local_privs=YES accept_timeout=5 connect_timeout=1 pasv_enable=YES # 开启【被动模式】 pasv_min_port=10060 #【被动模式】最小开放端口(需要到阿里云后台,开放端口访问权限) pasv_max_port=10090 #【被动模式】最大开放端口 pasv_address=113.64.52.56 #【被动模式】服务器端对外的IP(阿里云主机公网IP)
/etc/vsftpd/vsftpd.conf 文件内容如下(去掉了注释):
anonymous_enable=NO
write_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
use_localtime=YES
local_enable=YES
allow_writeable_chroot=YES
xferlog_enable=YES
local_umask=022
pam_service_name=vsftpd
use_localtime=YES
listen_port=21
chroot_local_user=YES
idle_session_timeout=120
data_connection_timeout=120
guest_enable=YES
guest_username=ftpuser
user_config_dir=/etc/vsftpd/vuser_conf
virtual_use_local_privs=YESaccept_timeout=5
connect_timeout=1
pasv_enable=YES
pasv_min_port=10060
pasv_max_port=10090
pasv_address=113.64.52.56
注意:当chroot_list_enable=YES
,chroot_local_user=YES
时,在/etc/vsftpd/chroot_list
文件中列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录。
另外,chroot_list如果不存在,需自行创建
touch /etc/vsftpd/chroot_list
3、创建宿主用户
# 创建用户 ftpuser 并指定 `/home/vsftpd` 目录
mkdir /home/vsftpd useradd -g root -M -d /home/vsftpd -s /sbin/nologin ftpuser
# 设置用户 ftpuser 的密码
passwd ftpuser
# 把 /home/vsftpd 的所有权给ftpuser.root
chown -R ftpuser.root /home/vsftpd
4、建立虚拟用户文件
touch /etc/vsftpd/vuser_passwd
# 编辑虚拟用户名单文件:(
# 第一行账号,第二行密码,注意:不能使用root做用户名,系统保留)
vim /etc/vsftpd/vuser_passwd
# 编辑内容,下面是 vuser_passwd 内容
ftp1 12345678 ftp2 12345678
#保存退出
:wq!
5、生成虚拟用户数据文件
db_load -T -t hash -f /etc/vsftpd/vuser_passwd /etc/vsftpd/vuser_passwd.db chmod 600 /etc/vsftpd/vuser_passwd.db
6、创建用户配置
mkdir /etc/vsftpd/vuser_conf # 建立虚拟用户个人vsftp的配置文件 cd /etc/vsftpd/vuser_conf # 进入目录 touch ftp1 ftp2
每个文件(ftp1和ftp2写入如下内容,local_root=/home/vsftpd/ftp1
#这里写入这个用户的实际存储路径)
# 本地文件夹根目录(注意:不一定是在 /home 目录下面,其他数据盘目录也可以) local_root=/home/vsftpd/ftp1 write_enable=YES anon_world_readable_only=NO anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
7、创建用户的“ftp数据目录”(注意:不一定是在 /home 目录下面,其他数据盘目录也可以)
mkdir -p /home/vsftpd/ftp1 mkdir -p /home/vsftpd/ftp2 # 重新调整目录权限 chown -R ftpuser.root /home/vsftpd/ftp1 chown -R ftpuser.root /home/vsftpd/ftp2
8、服务运维
systemctl restart vsftpd.service # 重启服务 systemctl start vsftpd.service # 启动服务 systemctl status vsftpd.service # 服务状态查看
9、生成虚拟用户的PAM文件
cd /etc/pam.d/ # 备份vsftpd文件 cp vsftpd vsftpd.bak
修改vsftpd文件内容(加入第二和第三行,下面的都全部注释,注意下面是64位操作系统,如果是32位的话lib64需要改成lib)
#%PAM-1.0 auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd #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
10、客户端调试
(1) 首先每次更改配置需要重启vsftpd服务。
(2) 上面每个配置文件中的内容最好是手动键入(曾经的我直接粘贴进去,cat就是没问题,但是粘贴进去就是不行)
附:启动 vsftpd报错:500 OOPS: bad bool value in config file for: pasv_enable
(3) 客户端windows打开cmd到后台进行连接,网页和资源管理器里面都会有缓存也看不到报错。
(4) 服务器tail -f /var/log/secure
查看日志(也可以tail -f /var/log/messages
,这个看不出什么,前者更精准)
(5) 客户端报错示例(坑了我好久,它说chroot没有读到/etc/vsftpd/chroot_list
这个文件,所以我们新建这个文件就行,记得重启服务)。
(6) 如果虚拟用户登录到自己的宿主目录后,不能上传文件的话,服务器端需要在宿主目录里面再新建一个文件夹,给这文件夹777权限,就可以了(直接把宿主目录设置777就会登录不了)
(7) 新增用户的话,需要在/etc/vsftpd/vsuser.passwd
里面追加用户(删除就是删除用户),记得使用db_load
重新生成vsuser.passwd
文件即可,vuser_config里面新建一个新建账户的权限文件,宿主目录记得新建存储文件。
(8) 建议使用ftp工具和cmd验证
C:\Users\Administrator>ftp 192.168.1.238 连接到 192.168.1.238。 220 (vsFTPd 3.0.2) 200 Always in UTF8 mode. 用户(192.168.1.238:(none)): ftp1 331 Please specify the password. 密码: 500 OOPS: could not read chroot() list file:/etc/vsftpd/chroot_list 500 OOPS: priv_sock_get_result 远程主机关闭连接。
(9) 连接成功
C:\Users\Administrator>ftp 192.168.1.238 连接到 192.168.1.238。 220 (vsFTPd 3.0.2) 200 Always in UTF8 mode. 用户(192.168.1.238:(none)): ftp1 331 Please specify the password. 密码: 230 Login successful.
11、修改端口号
(1) 在/etc/vsftpd/vsftpd.conf文件中增加listen_port=2121(这里修改为2121)
(2) 在vim /etc/services文件中修改如下内容
ftp 2121/tcp ftp 2121/udp
注意:上面修改的只是链接端口号,既然更改了连接端口号,别忘记访问的时候修改端口。
既然我们设置的是被动模式(服务器被动打开数据端口,只有在数据链接的时候才会使用,下面我们用ftp工具能成功连接,当打开某个文件夹的时候(请求数据的时候),才会使用该端口,但是我这里使用了iptables,之允许了2121通过我们设置的是10060到10090端口,具体如下)
cat /etc/vsftpd/vsftpd.conf
pasv_enable=YES # 开启【被动模式】
pasv_min_port=10060 #【被动模式】最小开放端口(需要到阿里云后台,开放端口范围访问权限 10060/10090)
pasv_max_port=10090 #【被动模式】最大开放端口
pasv_address=113.64.52.56 #【被动模式】服务器端对外的IP(阿里云主机公网IP)
设置iptables就可以了
参考:
- https://blog.csdn.net/hanchao_h/article/details/72731996
- https://www.cnblogs.com/lei0213/p/8657039.html
- filezilla 响应:425 Can't open data connection.错误:读取目录列表失败的解决办法
工作中的一次安装笔记
需求:需要给公司员工配置ftp,并且是可以用电脑的“资源管理器”直接打开的那种
1、只有配置成“被动模式”,才能使用电脑的“资源管理器”直接打开ftp(即不需要专业的Ftp客户端工具);
2、如果是阿里云主机,还得配置该主机的公网IP,即
pasv_address=113.64.52.56 #【被动模式】服务器端对外的IP(阿里云主机公网IP)
3、开放阿里云主机的端口访问权限
pasv_min_port=10060 #【被动模式】最小开放端口(需要到阿里云后台,开放端口范围访问权限 10060/10090) pasv_max_port=10090 #【被动模式】最大开放端口
4、需要把配置文件/etc/vsftpd/vsftpd.conf
中的所有注释和两边的空格去掉,否则报错,
参考:启动 vsftpd报错:500 OOPS: bad bool value in config file for: pasv_enable