FTP服务器filezilla ftp服务器
一、简介
1、概述
FTP是File Transfer Protocol(文件传输协议)的英文简称,用于Internet上的文件的双向传输
使用FTP来传输时,具有一定程度的危险性,因为数据在因特网上面试完全没有受到保护的明文传输方式
2、工作流程
FTP会话包含两个通道,控制通道和数据通道,FTP的工作有两种方式,主动模式和被动模式
以FTP服务器为参照物,
主动模式,客户端提供数据端口,服务器主动连接客户端数据端口,
被动模式,客户端发送PASV命令,服务器提供数据端口,客户端连接服务器数据端口
a、主动模式
b、被动模式
3、vsftp传输模式
Binary模式:不对数据进行任何处理,适合进行可执行文件、压缩文件、图片等
ASCII模式:进行文本传输时,自动适应目标操作系统的结束符,如回车符
linux的红帽发行版中VSFTP默认采用的是Binary模式,这样能保证绝大多数文件传输后能正常使用
二、试验
1、环境介绍
基础环境:192.168.10.132 ftp服务器
yum install -y vsftpd
192.168.10.131 ftp客户端
yum install -y ftp
环境要求
关闭防火墙:
systemctl stop firewalld ; systemctl disable firewalld
关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
配置文件介绍
/etc/vsftpd/vsftpd.conf:vsftpd 的核心配置文件
/etc/vsftpd/ftpusers:用于指定哪些用户不能访问FTP 服务器。 黑名单
/etc/vsftpd/user_list:指定允许使用vsftpd 的用户列表文件。 白名单
[root@k8s02 ~]# cat /etc/vsftpd/user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
# 如果userlist_deny= YES(默认),绝不允许在这个文件中的用户登录ftp,甚至不提示输入密码
#prompt 提示
/etc/vsftpd/vsftpd_conf_migrate.sh:是vsftpd 操作的一些变量和设置脚本
/var/ftp/:默认情况下匿名用户的根目录
启动服务
systemctl start vsftpd
systemctl enable vsftpd
默认使用21端口
[root@k8s02 ~]# netstat -antup | grep ftp
tcp6 0 0 :::21 :::* LISTEN 8292/vsftpd
2、匿名用户
anonymous_enable=YES 是否允许匿名用户登录write_enable=YES 是否允许登录用户有写权限
anon_root=/var/ftp 匿名用户登录后的目录,ftp目录不能是777权限属性,即匿名用户的家目录不能为777,(这个目录就是ftp用户的家目录)
[root@k8s02 ~]# cat /etc/passwd |grep ftp
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
anon_mkdir_write_enable=YES 是否允许匿名用户创建目录
anon_upload_enable=YES 是否允许匿名用户有上传文件权限
anon_world_readable_only=YES 允许匿名用户下载可阅读的文档
anon_other_write_enable=YES 允许匿名用户删除,重命名,覆盖
no_anon_password=YES 匿名用户登录时,不会询问密码
chown_uploads=YES 是否修改匿名用户上传文件的属主
chown_username=tom 设置匿名用户上传文件的属主名为tom
anon_umask=077 匿名用户上传文件的权限为700
anon_max_rate=0 限制最大传输速率(0为不限制)
FTP的匿名登录一般有三种:
1、 用户名:anonymous 密码:Email或者为空
2、 用户名:FTP 密码:FTP或者为空
3、 用户名:USER 密码:pass
案例一、匿名上传下载
服务器:允许所有员工上传和下载文件,并允许创建用户自己的目录
anonymous_enable=YES #允许匿名
anon_upload_enable=YES #允许上传
anon_mkdir_write_enable=YES #允许匿名创建目录
anon_other_write_enable=YES #允许匿名删除文件,覆盖文件 权限有点大
systemctl restart vsftpd
mkdir /var/ftp/xiangmu
chown ftp.ftp /var/ftp/xiangmu
客户端:
touch test{1..10}
[root@k8s01 ~]# ftp 192.168.10.132
Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): ftp
331 Please specify the password.
Password: ###密码处直接回车
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
服务器:
ftp> cd /var/ftp/xiangmu ##切换目录
ftp> put test1 ###上传文件
ftp> mkdir dir_a ##创建目录
ftp> rename test1 test2 ##更改名字
ftp> rm dir_a ##删除目录
ftp> delete test1 ##删除文件,用rm没法删除文件
计算ftp服务器数据端口
ftp> mput test*
mput test1? y
227 Entering Passive Mode (192,168,10,132,23,151).
227 Entering Passive Mode (192,168,10,132,60,189).
ftp服务器数据端口:60*253+189=15369
坑一,重新登录匿名用户无法登陆
[root@k8s01 ~]# ftp 192.168.10.132Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): ftp
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
再次登录会显示匿名用户无法登录
从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。
要修复这个错误,可以用命令chmod a-w /var/ftp/去除用户主目录的写权限,注意把目录替换成你自己的。或者你可以在vsftpd的配置文件中增加:
allow_writeable_chroot=YES
3、本地用户
connect_from_port_20=YES #使用20作为数据端口listen_port=9999 ##连接端口
pasv_enable=YES #开启被动模式
pasv_min_port=35000 ##数据端口最小
pasv_max_port=36000 ##数据端口最大
file_open_mode=0755 ##本地用户上传文件后的文件权限
ftpd_banner=Welcome #用户登录时显示的欢迎信息
userlist_enable=YES & userlist_deny=YES #禁止/etc/vsftpd/user_list文件中出现的用户名登录FTP
userlist_enable=YES & userlist_deny=NO #只允许/etc/vsftpd/user_list文件中出现的用户名登录FTP
ftpusers #禁止/etc/vsftpd/ftpusers文件中出现的用户登录FTP,权限比user_list更高,即时生效
local_enable=YES:允许本地用户登录
local_root=/var/www/html:设置所有本地用户的根目录
chroot_list_enable=YES:激chroot 功能
chroot_list_file=/etc/vsftpd/chroot_list:设置锁定用户在根目录中的列表文件。此文件存放要锁定的用户名
allow_writeable_chroot=YES :允许锁定的用户有写的权限
chroot_local_user=YES 将用户锁定在自己的家目录
1、当chroot_list_enable=YES,chroot_local_user=YES时,chroot_list_file中的用户可以切换到其他目录,不在列表中的无法切换
2、当chroot_list_enable=YES,chroot_local_user=NO时,chroot_list_file中的用户不可以切换到其他目录,不在列表中的可以切换
3、当chroot_list_enable=NO,chroot_local_user=YES时,所有用户均不可以切换到其他目录
4、当chroot_list_enable=NO,chroot_local_user=NO时,所有用户均可以切换到其他目录
useradd -s /sbin/nologin team1
useradd -s /sbin/nologin team2
echo "123456" | passwd --stdin team1
echo "123456" | passwd --stdin team2
用户是/sbin/nologin,需要在vi /etc/shells下面添加一行/sbin/nologin,否则这个类型的无法登录
[root@k8s01 ~]# ftp 192.168.10.132
Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): team1
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
案例一、本地用户锁家目录
服务器:anonymous_enable=NO 关闭匿名用户
allow_writeable_chroot=YES :允许锁定的用户有写的权限
chroot_local_user=YES 将用户锁定在自己的家目录
systemctl restart vsftpd
touch /home/team1/b
客户端:
[root@k8s01 ~]# ftp 192.168.10.132
Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): team1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd ###还是会显示根目录
257 "/"
ftp> ls
227 Entering Passive Mode (192,168,10,132,143,6).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Jan 04 11:15 b
226 Directory send OK.
案例二、根目录限制
team1不做修改,team2工作目录限制为/var/www/html
服务器:allow_writeable_chroot=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
local_root=/var/www/html
mkdir /var/www/html -p
chmod a+w /var/www/html/ ##如果不加写入权限,会无法上传文件
touch /var/www/html/c ##方便查看当前目录下的文件
cat >/etc/vsftpd/chroot_list <<EOF
team2
EOF
systemctl restart vsftpd
客户端:
[root@k8s01 ~]# ftp 192.168.10.132
Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): team1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /home/team1 ###############会发现登陆以后也在新目录下面,只是没法切换目录
550 Failed to change directory.
[root@k8s01 ~]# ftp 192.168.10.132
Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): team2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /home/team2
ftp> cd /var/www/html/
ftp> put test1
ftp> delete test1
ftp> mkdir dir_a
ftp> rename dir_a dir_b
ftp> rm dir_b
案例三、开启被动模式,限制连接端口,数据端口
将原来的配置文件备份cp vsftpd.conf vsftpd.conf.bk
配置连接端口为32000,数据端口限制到35000-36000
connect_from_port_20=NO
listen_port=32000
pasv_enable=YES
pasv_min_port=35000
pasv_max_port=36000
###如果最大端口和最小端口一致,那就数据端口限制死了只能通过指定端口
systemctl restart vsftpd
客户端:
[root@k8s01 ~]# ftp 192.168.10.132 32000
Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): team1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,10,132,139,126). ##自动就是被动模式,数据端口139*256+126=35710
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Jan 04 11:23 a
-rw-r--r-- 1 0 0 0 Jan 04 11:23 b
ftp> passive
Passive mode off.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Jan 04 11:23 a
-rw-r--r-- 1 0 0 0 Jan 04 11:23 b
226 Directory send OK.
4、虚拟用户
1、创建虚拟用户用来代替本地用户,减少本地用户曝光率
2、使用本地用户作为虚拟用户的映射用户,为虚拟用户提供工作目录和权限控制
3、能够设置严格的权限(为每一个用户生成单独的配置文件)
virtual_use_local_privs=NO #该参数激活时,虚拟用户使用与本地用户相同的权限,关闭时,虚拟用户使用与匿名用户相同的权限pam_service_name=vsftpd.pam #设置PAM使用的名称
guest_enable=YES #开启虚拟用户功能
guest_username=virtual #指定虚拟用户的宿主用户
user_config_dir=/etc/vsftpd/dir #指定虚拟用户权限配置文件目录
虚拟用户
cd /etc/vsftpd
vim vsftpd.user ##奇数行为账号,偶数行为密码
a1
123456
a2
123456
a3
123456
db_load -T -t hash -f vsftpd.user vsftpd.db
chmod 600 vsftpd.db
创建FTP虚拟用户的映射用户,并指定其用户家目录
useradd -d /var/ftproot -s /sbin/nologin virtual
建立支持虚拟用户的PAM认证文件,添加虚拟用户支持
cp -a /etc/pam.d/vsftpd /etc/pam.d/vsftpd.pam
编辑新生成的文件
vi /etc/pam.d/vsftpd.pam
注释文中全部内容(第一行需要保留)添加下列两行
auth required pam_userdb.so db=/etc/vsftpd/vsftpd
account required pam_userdb.so db=/etc/vsftpd/vsftpd
##完整路径/usr/lib64/security/pam_userdb.so
在vsftpd.conf文件中添加支持配置
vi /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.pam
guest_enable=YES
guest_username=virtual
user_config_dir=/etc/vsftpd/dir
做虚拟用户配置文件设置时,将主配置文件中的自定义匿名用户相关设置注释掉,vsftpd.conf全局变量会导致后面的自定义变量失效
anonymous_enable=YES
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES
需要额外关闭一些配置
chroot_local_user=YES #将用户锁定在自己的家目录,可以保留
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
#local_root=/var/www/html #这个开启会搞得用户登录都是这个目录
##虚拟用户使用的是匿名用户的配置
创建目录mkdir -p /etc/vsftpd/dir
cd /etc/vsftpd/dir
vi a1 ##a1有上传文件权限
anon_upload_enable=YES
vi a2 ##a2有创建目录权限
anon_mkdir_write_enable=YES
vi a3 ##a3有上传文件和删除修改文件权限
anon_upload_enable=YES
anon_other_write_enable=YES
systemctl restart vsftpd.service
给映射目录的家目录,设置o+r让虚拟用户有读权限
chmod o+r /var/ftproot/
touch /var/ftproot/a 便于识别
客户端:
[root@k8s01 ~]# ftp 192.168.10.132 32000
可以测试a1可以上传东西,下载东西,但是不能删除东西
a2可以创建目录
a3可以删除目录,删除文件,上传文件
5、openssl+vsftpd加密验证
ftp默认是明文传输,做了什么都可以抓包抓到
tcpdump -i ens33 -nn -X -vv tcp port 32000 and ip host 192.168.10.1320x0030: 0029 4b26 5553 4552 2061 310d 0a .)K&USER.a1..
0x0030: 0029 5483 5041 5353 2031 3233 3435 360d .)T.PASS.123456.
0x0030: 002a bac7 5354 4f52 2074 6573 7431 0d0a .*..STOR.test1..
-i #interface:指定tcpdump需要监听的接口
-m #对地址以数字方式显示,否则显示为主机名
-nn #除了-n的作用外,还把端口显示为数值,否则显示端口服务名
-X #输出包的头部数据,会以16进制和ASCII两种方式同时输出
-vv #产生更详细的输出
1、查看是否安装openssl
rpm -q openssl
2、查看vsftpd是否支持openssl
ldd /usr/sbin/vsftpd |grep libssl
3、生成加密信息的密钥和证书文件
cd /etc/vsftpd/
openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem -days 3560 #可以一路回车,也可以部分填写
OpenSSL 简单参数解释:
req - 是 X.509 Certificate Signing Request (CSR,证书签名请求)管理的一个命令。
x509 - X.509 证书数据管理。
days - 定义证书的有效日期。
newkey - 指定证书密钥处理器。
keyout - 设置密钥存储文件。
out - 设置证书存储文件,注意证书和密钥都保存在一个相同的文件
4、创建证书文件存放目录
mkdir .sslkey
cp vsftpd.pem .sslkey/
chmod 400 .sslkey/vsftpd.pem
5、修改配置文件,支持SSL
vim vsftpd.conf
ssl_enable=YES #启用SSL支持
allow_anon_ssl=YES #允许匿名用户(虚拟用户)
#本地登录和传输时强制使用ssl
force_local_data_ssl=YES
force_local_logins_ssl=YES
#匿名登录和传输时强制使用ssl
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
ssl_tlsv1=YES #指定vsftpd支持TLS v1[
ssl_sslv2=YES #指定vsftpd支持SSL v2
ssl_sslv3=YES #指定vsftpd支持SSL v3
require_ssl_reuse=NO #不重用SSL会话,安全配置项
ssl_ciphers=HIGH #允许用于加密 SSL 连接的 SSL 算法。这可以极大地限制那些尝试发现使用存在缺陷的特定算法的攻击者
rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/.sslkey/vsftpd.pem
#定义 SSL 证书和密钥文件的位置
注意:上面的配置项不要添加到vsftpd.conf 文件最后,否则启动报错
systemctl restart vsftpd.service
但是升级以后使用FileZilla可以连接,但是ftp没法直接连接了,内网没必要这么配置
[root@k8s01 ~]# ftp 192.168.10.132 32000Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): a1
530 Non-anonymous sessions must use encryption.
Login failed.
421 Service not available, remote server has closed connection
6、其他参数设置
日志相关:xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=NO #如果启动,则日志文件将会写成xferlog的标准格式
log_ftp_protocol=NO #启用此选项,所有的ftp请求和相应都会被记录到日志
启用此选项时,xferlog_std_format不能被激活
消息设置:
dirmessage_enable=YES
##这个开启后,当客户端cd到某个目录,该目录下有.message文件,则会显示该.message文件内容
message_file=.message
banner_file=/etc/vsftpd/banner
#当使用者登入时,会显示此设定所在的档案内容
ftpd_banner=Welcome
#定义欢迎语句的字符串,banner_file是档案的形式,ftpd_banner是字符串的形式
访问控制设置
tcp_wrappers=YES
#设置vsftpd是否与tcp_wrappers相结合来进行主机的访问控制,默认YES,如果启用,则vsftpd
服务器会检查/etc/hosts.allow和/etc/hosts.deny中设置,来决定请求连接的主机是否允许访问该ftp
比如仅允许192.168.0.1-192.168.0.254d的用户可以连接FTP服务器,则在/etc/hosts.allow
添加内容:
vsftpd:192.168.0. :allow
all:all :deny
访问速率:
anon_max_rate=0 #匿名登录者使用最大传输速度,0不限制,单位B/s
local_max_rate=0 #本地用户登录者使用最大传输速度,0不限制,单位B/s
超时时间设置:
accept_timeout=60 #设置建立ftp连接的超时时间,单位秒
connect_timeout #port方式下建立数据连接的超时时间,单位秒
data_connection_timeout=120 #建立ftp连接的超时时间
idle_session_timeout=300 #多长时间不对ftp服务器进行操作,断开连接
定义用户配置文件:
user_config_dir=/etc/vsftpd/userconf
#用户登录服务器,系统就会到这个目录下,读取与当前用户名相同的文件,根据文件中的配置命令
对当前用户进行更进一步的配置,比如控制访问速度等
ftp端口:
listen_port=21 #ftp服务器建立连接所监听的端口
ftp_data_port=20 #设置在PORT模式下,数据连接可以使用的端口
connect_from_port_20=YES 指定ftp使用20端口进行数据传输
(Make sure PORT transfer connections originate from port 20 (ftp-data).)
[root@k8s01 ~]# cat /etc/services|grep ftp-data
ftp-data 20/tcp
ftp-data 20/udp
ftp-data 20/sctp # FTP
kftp-data 6620/tcp # Kerberos V5 FTP Data
kftp-data 6620/udp # Kerberos V5 FTP Data
连接设置:
listen=YES#如果为NO,则vsftpd不以独立的服务运行,要收到xinetd服务管控,如果YES,以standalone模式运行
max_clients=0 #设置vsftpd允许的最大连接数,0位不限制,只有在standalone模式生效
max_per_ip=0 #允许每个IP与ftp服务器同时建立连接的数据,0不受限制,只有在standalone模式生效
listen_address=IP地址 #设置ftp服务器在指定的IP地址上侦听用户的ftp请求,若不设置,则对服务器绑定的所有IP地址进行侦听,只有在standalone模式生效
setproctitle_enable=NO #每个与FTP服务器的连接,是否以不同的进程表现出来,如果为YES则每个连接都有一个vsftpd进程
其他设置:
text_userdb_names=NO #设置在执行ls -la之类的命令时,显示UID、GID还是显示出具体的用户名和组名,若NO,则显示UID和GID
ls_recurse_enable=NO #启用此功能,则允许登录者使用ls -R(可以查看当前目录下子目录中的文件)
hide_ids=NO #若启用,所用档案的所有者和群组都是ftp,登录者使用ls -la之类的命令,看到的档案拥有者和群组都是ftp
download_enable=NO #如果NO,所有的文件都不能下载到本地,文件夹不受影响,默认YES
三、ftp命令大全
1、help、?、rhelp①help显示LOCAL端(本地端)的命令说明,若不接受则显示所有可用命令;
②?,相当于help,例如:?cd;
③rhelp同help,只是它用来显示REMOTE端(远程端)的命令说明。
2、ascii、binary、Image、type
①ascii切换传输模式为文字模式;
②binary切换传输模式为二进制模式;
③image相当于binary;
④type用于更改或显示目前传输模式。
3、bye、quit
①bye退出FTP服务器;
②quit相当于bye。
4、cd、cdup、lcd、pwd、!
①cd改变当前工作目录;
②cdup回到上一层目录,相当于“cd..”;
③Icd用于更改或显示LOCAL端的工作目录;
④pwd显示目前的工作目录(REMOTE端);
⑤!,用于执行外壳命令,例如“!ls”。
5、delete、mdelete、rename
①delete删除REMOTE端的文件:
②mdelete批量删除文件;
③rename更改REMOTE端的文件名。
6、get、mget、put、mput、recv、send
①get下载文件;
②mget批量下载文件;
③put上传文件;
④mput批量上传文件;
⑤recv相当于get;
⑥send相当于put。
7、hash、verbose、status、bell
①hash当有数据传送时,显示#号,每一个#号表示传送了1024B或8192b;
②verbose切换所有文件传输过程的显示;
③status显示目前的一些参数;
④bell当指令做完时会发出叫声。
8、ls、dir、mls、mdir、mkdir、rmdir
①ls有点像Unix下的ls(list)命令;
②dir相当于“ls-l”;
③mls只是将远端某目录下的文件存于LOCAL端的某文件里;
④mdir相当于mls;
⑤mkdir像DOS下的md(创建了目录)一样;
⑥rmdir像DOS下的rd(删除了目录)一样。
9、open、close、disconnect、user
①open连接某个远端FTP服务器;
②close关闭目前的连接;
③disconnect相当于close;
④user再输入一次用户名和密码(有点像Linux下的su)。
10、prompt off:设置多个文件传输时的交互提示。