文章目录
一、概述
-
FTP服务器为vsftpd,客户端为ftp。
-
默认FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。但是,是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。如果服务器有防火墙,则建议设置为被动模式,额外开放指定数据端口。
版本信息
[root@VM-4-11-centos ~]# uname -r
3.10.0-1160.11.1.el7.x86_64
[root@VM-4-11-centos ~]# cat /proc/version
Linux version 3.10.0-1160.11.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Fri Dec 18 16:34:56 UTC 2020
二、安装vsftpd
# 1. 检查是否安装了ftp
rpm -qa |grep vsftpd
vsftpd -v
# 2. yum安装ftp
yum install -y vsftpd
# 3.启动ftp服务
service vsftpd start
# 4.查看ftp服务状态
service vsftpd status
# 查看当前端口开放情况
netstat -nlpt
netstat -nltp | grep 21
# 查看FTP目录
curl ftp://10.0.4.11
三、配置vsftpd
# 默认安装目录
[root@VM-4-11-centos ~]# cd /etc/vsftpd
[root@VM-4-11-centos vsftpd]# ll
总用量 20
-rw------- 1 root root 125 6月 10 00:15 ftpusers # 禁止登录ftp用户
-rw------- 1 root root 361 6月 10 00:15 user_list # 待授权访问的用户
-rw------- 1 root root 5116 6月 10 00:15 vsftpd.conf # 配置文件
-rwxr--r-- 1 root root 338 6月 10 00:15 vsftpd_conf_migrate.sh
# 如果vsftpd.conf 中 userlist_deny=YES(默认),则决不允许user_list中的用户使用ftp登陆。userlist_deny=NO,则仅允许此文件中的用户。
# 默认情况下vsftpd还检查ftpusers文件里有哪些用户被拒绝。
# 禁用匿名访问和切换根目录
vim /etc/vsftpd/vsftpd.conf
# 禁用匿名用户
anonymous_enable=NO
# 禁止切换根目录(还需要设置allow_writeable_chroot,否则无法登录)
# chroot_local_user=YES
# allow_writeable_chroot=YES
# 重启
service vsftpd restart
# 创建 FTP 用户
useradd ftp_wangfugui
# 设置密码
echo "123456" | passwd ftp_wangfugui --stdin
# 限制该用户仅能通过 FTP 访问,不能登录系统
usermod -s /sbin/nologin ftp_wangfugui
# 为用户分配主目录
mkdir -p /home/ftp_wangfugui/ftp/pub
# /home/ftp_wangfugui/ftp 为主目录, 该目录不可上传文件
# /home/ftp_wangfugui/ftp/pub 文件只能上传到该目录下
chmod a-w /home/ftp_wangfugui/ftp && chmod 777 -R /home/ftp_wangfugui/ftp/pub
# 创建登录欢迎文件
echo "Welcome to use FTP service." > /home/ftp_wangfugui/ftp/welcome.txt
# 设置为用户的主目录,-d <登录目录>
usermod -d /home/ftp_wangfugui/ftp ftp_wangfugui
# 访问FTP
# 关闭SELinux服务
setenforce 0
# 关闭防火墙
service iptables stop 或 iptables -F
四、客户端ftp
基础命令
yum install -y ftp
# 登录
ftp 10.0.3.11 21
echo "hello world" > aa.txt
# 上传xxx.txt
put xxx.txt
# 下载xxx.txt
get xxx.txt
无法登录
# 检查 pam 保护机制:该配置项的含义为仅允许用户的shell为/etc/shells文件内的shell命令时,才能够成功,而创建ftp用户时,为了禁止ssh登录,一般多为/bin/false 、/usr/sbin/nologin 等,显然不是一个有效的bash,也就无法登录了。
vim /etc/pam.d/vsftpd
# 将 auth required pam_shells.so 修改为-> auth required pam_nologin.so
auth required pam_nologin.so
或者直接注释掉
#auth required pam_shells.so
# 重启vsftpd
service vsftpd restart
登录慢卡
当客户端连接服务器时,服务器会执行一个DNS查找,来确认域名,如果所用DNS解析不到,会等到超时为止。
vim /etc/vsftpd/vsftpd.conf
# 不查找dns服务器
reverse_lookup_enable=NO
# 重启
service vsftpd restart
FTP客户端切换模式
# 关闭被动模式,再次执行该命令就可以启用
ftp> passive
Passive mode off.
可登录,无法读写
报错:
curl: (67) Access denied: 530
553 Could not create file.
550 Failed to open file.
解决1:检查目录
我们的工作目录是/home/ftpserver/ftp/pub,客户端登录默认为/home/ftpserver/ftp。
-
如果使用ftp客户端工具,则需要:
ftp> cd pub
-
如果是Java客户端
// 转移工作目录至指定目录下 client.changeWorkingDirectory("pub");
解决2:检查权限
检查ftp工作目录的权限。
ls -l /home/ftpserver
dr-xr-xr-x 3 root root 4096 6月 6 16:36 ftp # 无写入权限
# 加入写权限
chmod +w /home/ftpserver
解决3:主被动模式
PORT(主动 - active mode)模式:服务器的21准入和20准出,客户端配置允许服务器连接。
PASV(被动 - passive mode)模式:服务器随机打开大于1024的tcp端口和21端口。(服务器有防火墙应该设置为被动模式,服务端配置端口区间。)
开启被动模式:
(1)修改/etc/vsftpd/vsftpd.conf
文件配置
# 服务器开放21,20,10022端口
pasv_enable=yes
#pasv_promiscuous=no (Default: NO) 是否屏蔽对pasv进行安全检查,(当有安全隧道时可禁用)
pasv_max_port=10022
pasv_min_port=10022
# 重启
service vsftpd restart
(2)Java使用FTPClient客户端
// 启动被动模式
client.enterLocalPassiveMode();
五、卸载vsftpd
service vsftpd stop
yum remove vsftpd
rpm -qa |grep vsftp
六、使用
FTP服务:10.0.3.11 21
FTP用户:ftp_wangfugui
FTP密码:123456
FTP目录:/home/ftp_wangfugui/ftp/pub
Java客户端
# 转移工作目录至指定目录下 /home/ftp_wangfugui/ftp/pub
client.changeWorkingDirectory("pub");