![](https://img.haomeiwen.com/i6044565/b67d6fe3771df452.png)
![](https://img.haomeiwen.com/i6044565/2abf9580a947731c.png)
FTP: File Transfer Protocol
基于C/S结构
双通道协议:数据和命令连接
数据传输格式:二进制(默认)和文本 二进制方式——数据不会损坏
两种模式:服务器角度
主动(PORT style):服务器主动连接
命令(控制):客户端:随机port ---服务器:tcp21
数据:客户端:随机port+1 ---服务器:tcp20
被动(PASV style):客户端主动连接
命令(控制):客户端:随机port ---服务器:tcp21
数据:客户端:随机port+1 ---服务器:随机port
服务器被动模式数据端口示例:
227 Entering Passive Mode (192,168,175,138,224,59)
服务器数据端口为:224*256+59
https://filezilla-project.org/
下载filezilla客户端(Windows版本),并安装,测试用
yum info vsftpd
linux 客户端默认使用被动模式
windows 客户端默认使用主动模式
centos5:
yum info gftp
yum install gftp
gftp 图形界面操作,呈现的界面与filezilla客户端相似
centos6
yum -y install ftp
ftp ftp_server_ip 连接ftp服务器
ftp/anonymous 匿名用户: ftp,anonymous,对应Linux用户ftp
回车 直接回车,不用输入密码即可登陆
? 此命令显示ftp服务器支持的命令
quit
cat /etc/nsswitch.conf 以前设置dns时,用过
状态码
1XX:信息 125:数据连接打开
2XX:成功类状态 200:命令OK 230:登录成功
3XX:补充类 331:用户名OK
4XX:客户端错误 425:不能打开数据连接
5XX:服务器错误 530:不能登录
centos7
装包——找到服务名——启动服务(开机启动和启动)
yum -y install vsftpd(ftp服务器)
rpm -qi vsftpd
rpm -ql vsftpd
/etc/vsftpd/vsftpd.conf 主配置文件
man 5 vsftpd.conf
格式:option=value
注意:=前后不要有空格
/usr/lib/systemd/system/vsftpd.service 服务名称
/usr/sbin/vsftpd 程序
/var/ftp 安装目录,默认为ftp服务器的根
/var/ftp/pub
ll -d /var/ftp/ root拥有
rpm -q --scripts vsftpd 脚本
systemctl enable vsftpd
systemctl start vsftpd
ss -ntl 默认21端口
getent passwd ftp 家目录是/var/ftp
cd /var/ftp; ls; cd pub/
dd if=/dev/zero of=f1 bs=1M count=1024 创建一个大文件
Windows命令窗口
ftp 192.168.29.127
ftp
回车
pwd 此处显示的/是/var/ftp
dir 此处显示不能连接,待查
cd /pub
get f1
cenos7: ss -nt 默认21端口,数据传输为20端口,即主动模式
!del f1 ftp客户端(Windows)里删除文件的命令
lcd d: 切换目录,表示下载的文件会下载至d盘,否则默认下载至刚进入的目录
dir
get f1
centos7
man 5 vsftpd.conf
搜索: /listen_port
cp /etc/vsftpd/vsftpd.conf{,.bak} 备份文件
vim /etc/vsftpd/vsftpd.conf
listen_port=2121 搜索没有listen_port,在文件最上方处添加此信息
anonymous_enable=YES 文件里就有,不用更改
systemctl restart vsftpd
ss -ntl 出现2121端口
centos6: ftp 192.168.29.127 2121
ss -nt 可以看到192.168.29.126用户在连接
禁用selinux,否则非标准端口不让使用
恢复默认
centos7
vim /etc/vsftpd/vsftpd.conf
搜索: /connect
connect_from_port_20=YES 主动模式端口为20,不用更改
ftp_data_port=2020 文件没有,添加此信息: 指定主动模式的端口,和上面设置相似
systemctl restart vsftpd
ss -ntl 还是tcp的21端口,只有下载文件的时候才会出现数据的传输端口
cd /var/ftp/pub
dd if=/dev/zero of=f1 bs=1M count=1024
centos6
ftp 192.168.29.127 连接到ftp服务器,下载文件
ftp,回车,cd pub,ls
passive 从被动模式切换为主动模式,如果再执行一次passive,就变为被动模式
或者
ftp -A 192.168.29.127 直接以主动模式连接,不用执行passive进行切换了
get f1
centos7: ss -nt 出现2020端口,下载完文件后,此端口就没了
如果再下载文件以主动模式,还有再执行一次passive,才会出现2020端口
恢复默认
centos7
vim /etc/vsftpd/vsftpd.conf
在 connect_from_port_20=YES 下面添加此信息
pasv_min_port=6000
pasv_max_port=6010
systemctl restart vsftpd
ss -ntl
ss -nt
centos6
ftp 192.168.29.127
ftp,回车,cd pub,ls
get f1
centos7
ss -nt 出现6000-6010之间的端口
ps -eHF 查看父进程和子进程
恢复默认
centos6
ftp 192.168.29.127
ftp,回车,cd pub,ls 可以看到文件的时间为"格林威治时间"
centos7
vim /etc/vsftpd/vsftpd.conf
connect_from_port_20=YES 不用更改,在此下面新添加信息
use_localtime=YES 使用当地时间(默认为NO,使用GMT)
systemctl restart vsftpd
centos6
ftp 192.168.29.127
ftp,回车,cd pub,ls 可以看到文件的时间发生变化,即当地时间
centos7
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO YES更改为NO,不允许匿名登陆
systemctl restart vsftpd
centos6
ftp 192.168.29.127
使用ftp/anonymous登陆不上
使用fgq可以登陆上
pwd 此时是fgq的家目录
cd /etc
get passwd 可以下载用户的密码文件到本机,不安全
原因是selinux禁用的结果
getsebool -a|grep ftp
ftp_home_dir --> off centos7上没有了这个选项
恢复默认
centos7
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
no_anon_password=YES (默认NO)匿名用户略过口令检查
systemctl restart vsftpd
centos6
ftp 192.168.29.127
输入ftp/anonymous就直接登陆,无需再回车
centos7
vim /etc/vsftpd/vsftpd.conf
#anon_upload_enable=YES 去掉注释;匿名上传,注意:文件系统权限
#anon_mkdir_write_enable=YES 去掉注释;可以创建文件夹了
systemctl restart vsftpd
cd /var/ftp; mkdir upload; ll ftp对此目录没有权限
centos6
ftp 192.168.29.127
ls; cd upload
put f1 不能上传,因为ftp对服务器上的upload文件夹没有写权限
centos7
setfacl -m u:ftp:rwx upload/
centos6
ftp 192.168.29.127
ls; cd upload
!ls 显示centos6上root目录下的文件
put f1 上传文件成功
mkdir dir1 创建文件夹成功
centos7
setfacl -m u:ftp:rwx /var/ftp/
systemctl restart vsftpd
centos6
ftp 192.168.29.127 登陆不上去,服务不可用
centos7
setfacl -b /var/ftp/ 删除根的写权限
因此如果想让ftp可以上传,可以建个子文件夹,就像upload一样
centos6
ftp 192.168.29.127
ls; cd upload
!ls
put fstab; ls 上传成功
del/delete fstab 不能删除此文件,这里的删除不能用: rm -rf
rmdir dir1 不能删除文件夹
权限禁止
centos7
vim /etc/vsftpd/vsftpd.conf
anon_mkdir_write_enable=YES在此信息的下面添加
anon_other_write_enable=YES 可删除和修改上传的文件
systemctl restart vsftpd
centos6
ftp 192.168.29.127
ls; cd upload; ls
del/delete fstab 删除成功
rmdir dir1 删除成功,删除文件夹,需要一个一个删除
mdel * 删除多个文件,不能删除文件夹
put fatab; ll 看到文件权限是600,相当于umask是666(文件)-600=066
centos7
vim /etc/vsftpd/vsftpd.conf
local_umask=022此信息下面添加
anon_umask=000 指定匿名上传umask,但对新建文件夹的权限也有影响
systemctl restart vsftpd
centos6
ftp 192.168.29.127
ls; cd upload; ls
put fatab2; ls 可以看到fstab2的文件权限为666,即666-000(umask)
mkdir dir2; ls 可以看到文件夹的权限为777,即777-000(umask)
centos7
vim /etc/vsftpd/vsftpd.conf
指定上传文件的默认的所有者和权限
chown_uploads=YES 去掉注释
chown_username=fgq 去掉注释,whoever更改为fgq
chown_upload_mode=0666 文件中没有,添加此信息
systemctl restart vsftpd
centos6
ftp 192.168.29.127
ls; cd upload; ls
put fatab; ls
centos7
cd /var/ftp/upload/; ll 可以看到上传的fstab文件的所有者为fgq,且权限为666
mkdir /app/ftproot
usermod -d /app/ftproot ftp 指定用户的家目录为/app/ftproot,其他用户在ftp访问时,访问的就是此目录
cd /app/ftproot; touch file1
centos6
ftp 192.168.29.127
ls; pwd 看到创建的文件file1,显示为/,即成功
centos7
useradd qiangge
echo 123456 |passwd --stdin qiangge
getent passwd qiangge 创建成功
vim /etc/vsftpd/vsftpd.conf
添加信息
guest_enable=YES 所有系统用户都映射成guest用户
guest_username=ftp 配合上面选项才生效,指定guest身份
即不论谁使用ftp登陆后,都会以ftp身份进入到ftp的家目录中,不能用root登陆,权限禁止
systemctl restart vsftpd
centos6
ftp 192.168.29.127
fgq/qiangge/ftp 输入密码后都是登陆到ftp的家目录中: /var/ftp
ls 看到pub文件夹
cd /etc 此时就不能进入到fgq或者qiangge的/etc文件夹里了,不能下载passwd文件,也是一种安全措施
centos7
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES 更改为 anonymous_enable=NO 禁止匿名用户登陆,默认是允许匿名用户登陆
systemctl restart vsftpd
centos6
ftp 192.168.29.127
ftp不能登陆,fgq/qiangge可以登陆
centos7
vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=fgq 映射为fgq的家目录
systemctl restart vsftpd
centos6
ftp 192.168.29.127
ftp 进入自己的家目录
fgq/qiangge 不能登陆,因为fgq的家目录有写权限,ftp的家目录没有写权限
centos7
chmod u-w /home/fgq/
chmod a+rx /home/fgq/
ll -d /home/fgq
touch /home/fgq/file2
centos6
ftp 192.168.29.127
ftp 进入自己的家目录
fgq/qiangge 可以登陆到fgq的家目录中,看到file2文件
恢复默认,重启服务
local_enable=YES 是否允许linux用户登录
write_enable=YES 允许linux用户上传文件
local_umask=022 指定系统用户上传文件的默认权限
local_root=/ftproot 非匿名用户登录所在目录
centos6
ftp 192.168.29.127
fgq 进入自己的家目录
cd /etc; get passwd 可下载重要文件,需要做安全措施
centos7
vim /etc/vsftpd/vsftpd.conf
搜索: /chroot 去掉注释即可
chroot_local_user=YES(默认NO,不禁锢) 所有ftp系统用户(fgq,qiangge)不能登陆,匿名用户(ftp)可以登陆
与guest_enable=YES; guest_username=fgq取得的效果相同
systemctl restart vsftpd
centos6
ftp 192.168.29.127
ftp 进入自己的家目录
fgq/qiangge 不能登陆,因为fgq的家目录有写权限,ftp的家目录没有写权限
centos7
vim /etc/vsftpd/vsftpd.conf
去掉下面3项的注释即可
chroot_local_user=YES
与上面设置互斥,在/etc/vsftpd/chroot_list文件里的用户可以登陆到自己的家目录中
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
systemctl restart vsftpd
vim /etc/vsftpd/chroot_list 没有此文件
fgq 添加此信息即可
centos6
ftp 192.168.29.127
ftp 进入自己的家目录/var/ftp
fgq 登陆
qiangge 不能登陆
centos7
vim /etc/vsftpd/vsftpd.conf
#chroot_local_user=YES 或者把YES改为NO
在/etc/vsftpd/chroot_list文件里的用户不能登陆,不在此文件里的用户可以登陆
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
systemctl restart vsftpd
vim /etc/vsftpd/chroot_list
fgq
centos6
ftp 192.168.29.127
ftp 进入自己的家目录/var/ftp
fgq 不能登陆
qiangge 能登陆
恢复默认值
centos7
vim /etc/vsftpd/vsftpd.conf
wu-ftp日志 默认启动
xferlog_enable=YES 启用记录上传下载日志,默认启用,不用添加
xferlog_std_format=YES 使用wu-ftp日志格式,默认启用,不用添加
#xferlog_file=/var/log/xferlog 虽注释,默认可自动生成;
ll /var/log/xferlog有
vsftpd日志 默认不启动
dual_log_enable=YES 使用vsftpd日志格式,需要手动添加
vsftpd_log_file=/var/log/vsftpd.log 默认可自动生成,不用添加
ll /var/log/vsftpd.log还未生成
搜索: /banner
登陆提示信息
ftpd_banner=Welcome to blah FTP service. 去掉注释
banner_file=/etc/ftp.txt 手工添加,上面的信息就会失效了
vim /etc/ftp.txt
Welcome to ftp lol !
Do you have a good day !
目录访问提示信息
dirmessage_enable=YES 默认有,不用手工添加
cd /var/ftp/upload; ls
echo "Fuction: you can upload the files." > .message; ls -a
systemctl restart vsftpd
centos6
ftp 192.168.29.127 or lftp 192.168.29.127 (-u fgq) ftp工具会出现提示信息
出现登陆提示信息......
fgq登陆
get file2
quit
ftp 192.168.29.127
ftp登陆
cd upload
出现文件夹的提示信息
centos7
ll /var/log/xferlog; cat /var/log/xferlog 记录上传下载日志
ll /var/log/vsftpd.log; cat /var/log/vsftpd.log 记录所有日志,包括上传和下载的日志
Windows界面
ftp://192.168.29.127 可以看到文件夹pub,upload,无提示信息
也可以右键——登陆——输入账号和密码
浏览器: ftp://192.168.29.127 可以看到文件夹pub,upload,无提示信息
FileZilla界面
192.168.29.127,ftp登陆,无提示信息
centos7
tcpdump -nn -X -i ens33 可以抓包
tcpdump -nn -X -i ens33 > ftp.log
centos6
ftp 192.168.29.127
fgq 输入账号和密码后登陆
centos7
tcpdump -nn -X -i ens33 > ftp.log 接着上一步的操作,ctrl+c退出
cat ftp.log |grep USER
cat ftp.log |grep PASS 账号和密码就可以抓到
centos7
vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd 默认开启,不用添加
使用pam完成用户认证
pam配置文件: /etc/pam.d/vsftpd
cat /etc/pam.d/vsftpd 看一下即可
vim /etc/vsftpd/ftpusers
文件中用户拒绝登录,使用模块,不用重启服务,就会立即生效
#root 还是无法登陆
fgq 拒绝登陆
centos6
ftp 192.168.29.127
root 还是拒绝登陆
fgq 拒绝登陆
qiangge 可以登陆
centos7
vim /etc/pam.d/vsftpd
auth required pam_listfile.so item=user sense=allow file=/etc/vsftpd/ftpusers onerr=succeed
sense=deny 变为 sense=allow 在/etc/vsftpd/ftpusers文件的用户允许登陆
centos6
ftp 192.168.29.127
root 还是拒绝登陆
fgq 可以登陆
qiangge 拒绝登陆
centos7
pam_listfile.so 此模块并不是特有的,别的服务配合这个模块也可以
locate pam_listfile.so
rpm -qf `locate pam_listfile.so`
rpm -ql pam
centos7
vim /etc/vsftpd/vsftpd.conf
userlist_enable=YES 默认有,不用添加
man vsftpd.conf
搜索: /userlist
vim /etc/vsftpd/ftpusers
#root
vim /etc/vsftpd/user_list
#root
/etc/vsftpd/ftpusers 和 /etc/vsftpd/user_list
都是控制用户登录的列表文件,把root从文件中删除,root即可登陆
centos6
ftp 192.168.29.127
root 可以登陆
恢复默认
centos7
vim /etc/vsftpd/vsftpd.conf
userlist_enable=YES
userlist_deny=NO 不写,默认是YES,需要手动添加此信息
NO为白名单,此/etc/vsftpd/users_list文件的用户可以ftp工具登陆
vim /etc/vsftpd/ftpusers
#root
vim /etc/vsftpd/user_list
root
#fgq 去掉注释,centos6就可以登陆
centos6
ftp 192.168.29.127
root 可以登陆
fgq 不可以登陆
qiangge 不可以登陆
ftp 不可以登陆
恢复默认
centos7
vim /etc/vsftpd/vsftpd.conf
userlist_enable=YES 在下面添加信息
max_clients=2
systemctl restart vsftpd
centos6
ftp 192.168.29.127 连接成功
centos5
ftp 192.168.29.127 连接成功
centos6-3
ftp 192.168.29.127 拒绝连接
显示信息: There are too many connected users, please try later
centos7
vim /etc/vsftpd/vsftpd.conf
userlist_enable=YES 在下面添加信息
连接限制
max_clients=20 最大并发连接数
max_per_ip=1 每个IP同时发起的最大连接数,防止一个IP开启的程序过多,拖垮服务器
systemctl restart vsftpd
centos6
ftp 192.168.29.127 连接成功
centos6 另一个终端
ftp 192.168.29.127 拒绝连接
显示信息: There are too many connections from your internet address
centos6 再一个终端
ftp 192.168.1.7 连接成功,连接centos7的另一个IP
centos5
ftp 192.168.29.127 连接成功
centos6-3
ftp 192.168.29.127 连接成功
centos7
ps aux; pstree -p
二者结合可以发现: 父进程root,子进程nobody,孙子进程fgq
恢复默认
centos7
useradd -r -s /sbin/nologin ftpd -r选项不会创建家目录
ll /home
getent passwd ftpd
vim /etc/vsftpd/vsftpd.conf
搜索: /priv
#nopriv_user=ftpsecure 变为 nopriv_user=ftpd vsftpd服务指定用户身份运行
systemctl restart vsftpd
centos6
ftp 192.168.29.127 fgq,qiangge,ftp分别登陆不同终端
centos5
ftp 192.168.29.127 fgq,qiangge,ftp分别登陆不同终端
centos6-3
ftp 192.168.29.127 fgq,qiangge,ftp分别登陆不同终端
centos7
ps aux; pstree -p
二者结合可以发现: 父进程root,子进程从nobody变为ftpd,孙子进程fgq,qiangge,ftp
getent passwd nobody 默认为nobody,可以自己更改
centos7
vim /etc/vsftpd/vsftpd.conf
传输速率:字节/秒
anon_max_rate=0 匿名用户的最大传输速率,手动添加(做实验)
local_max_rate=0 本地用户的最大传输速率,手动添加
连接时间:秒为单位
connect_timeout=60 主动模式数据连接超时时长,手动添加
accept_timeout=60 被动模式数据连接超时时长,手动添加
data_connection_timeout=300 数据连接无数据传输超时时长,本身有
idle_session_timeout=60 无命令操作超时时长,本身有
优先以文本方式传输
ascii_upload_enable=YES 本身有,去掉注释,最好不要开启
ascii_download_enable=YES 本身有,去掉注释,最好不要开启
cd /var/ftp/upload
dd if=/dev/zero of=/var/ftp/upload/bigfile bs=1M count=1024M
centos6
ftp 192.168.29.127
ftp登陆
登陆后还是会看到以二进制方式传输文件
cd upload
get fstab
下载完成后,会看到传输文件速度的大小
lftpget ftp://192.168.29.127/upload/bigfile 下载的文件需要足够大,才会显示传输的速度
文本传输的选项虽然生效,但Linux下载文件,还是以二进制方式传输文件
Windows命令行
ftp下载文件,以文本方式下载文件,文件会被破环
ftp上传文件至Linux,以文本方式上传,在Linux里会转换成二进制,文件会被破坏
最好不要开启这两个选项
centos6: 配置FTP服务以非独立服务方运行: listen=NO,默认为独立方式
centos7
vim /etc/vsftpd/vsftpd.conf
listen=NO 表示: vsftp是非独立服务
centos7上的所有服务都是非独立服务,都由systemd来管理,需要时叫醒你
centos6
vim /etc/vsftpd/vsftpd.conf
listen=YES 表示: vsftp是独立服务
把vsftp变为非独立服务
vim /etc/vsftpd/vsftpd.conf
listen=NO YES变为NO
chkconfig --list xinetd 没有
yum -y install telnet-server
chkconfig --list xinetd 有
cp /etc/xinetd.d/telnet /etc/xinetd.d/vsftpd
vim /etc/xinetd.d/vsftpd
更改3处
service ftp(1处)
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd(2处)
log_on_failure += USERID
disable = no(3处)
}
service xinetd start
service xinetd restart
chkconfig --list
ss -ntlp 21端口,xinetd监控
centos7
ftp 192.168.29.126
centos6
ss -ntp ftpd提供服务,xinetd只是帮监听
如果centos7断开ftp连接,那么就由xinetd来监听了; ss -ntlp 可以看到
实现基于SSL的FTPS
centos7
(umask 077; openssl genrsa -out /etc/vsftpd/ftp.key 2048) 私钥
ll /etc/vsftpd/ftp.key
cat /etc/vsftpd/ftp.key
cd /etc/vsftpd
openssl req -new -x509 -key ftp.key -out ftp.pem -days 365
CN,henan,zhengzhou,fgq.com,ftp,ftp.fgq.com,回车 邮箱不用了
ll
openssl x509 -in ftp.pem -noout -text
cat ftp.key >> ftp.pem 把私钥打入公钥里(打入一个文件里),因为需要指明证书文件和私钥文件路径
cat ftp.pem
vim /etc/vsftpd/vsftpd.conf
配置vsftpd服务支持SSL
ssl_enable=YES 启用SSL
allow_anon_ssl=NO 匿名不支持SSL
force_local_logins_ssl=YES 本地用户登录加密
force_local_data_ssl=YES 本地用户数据传输加密
rsa_cert_file=/etc/vsftpd/ftp.pem
systemctl restart vsftpd
centos6
ftp 192.168.29.127
ftp 可以登陆
fgq/qiangge 拒绝登陆: Non-anonymous sessions must use encryption.
FileZilla软件测试
新建站点
主机: 192.168.29.127
加密: 要求显示的FTP over TLS
登陆类型: 正常
输入用户和密码并连接,就会出现证书,如图1
centos7
创建证书的简单方法
查看是否支持SSL
ldd `which vsftpd` 查看到libssl.so
创建自签名证书
cd /etc/pki/tls/certs/
make vsftpd.pem
CN,beijing,chaoyang,fgq.com,beiguo,ftpserver.fgq.com,回车 邮箱不用了
ll
openssl x509 -in vsftpd.pem -noout -text
cat vsftpd.pem; pwd 注意路径
vim /etc/vsftpd/vsftpd.conf
ssl_enable=YES
allow_anon_ssl=NO
force_local_logins_ssl=YES
force_local_data_ssl=YES
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem 仅更此处路径即可
systemctl restart vsftpd
FileZilla软件测试和上面的步骤相似
图1
![](https://img.haomeiwen.com/i6044565/24c57ddba9aab680.png)
图2
![](https://img.haomeiwen.com/i6044565/71a7445e8a15bde7.png)
实现基于文件验证的vsftpd虚拟用户 图2
centos7
恢复默认
一、创建用户数据库文件
vim /etc/vsftpd/vusers.txt
格式: 奇数行——用户名,偶数行——用户名密码
ftp1
123456
ftp2
1234567
ftp3
12345678
cd /etc/vsftpd/
db_load -T -t hash -f vusers.txt vusers.db
chmod 600 vusers.db 设置权限,避免文件泄露
chmod 600 vusers.txt
二、创建需要访问FTP目录
useradd -r -d /var/ftproot -m -s /sbin/nologin ftpuser
文件权限-m选项自动设置属主和属组,不用更改
chmod +rx /var/ftproot/ (不做,进入到/var/ftpuser,不能看到当前目录里的文件和文件夹)
centos7 还需要执行以下操作
chmod -w /var/ftproot/ 定位至家目录,有"写权限"会禁止登陆,所以要去掉
ll -d /var/ftproot
mkdir /var/ftproot/upload 建立一个子文件夹,使用户可以上传文件
chown ftpuser /var/ftproot/upload 或者 setfacl -m u:ftpuser:rwx /var/ftproot/upload
ll /var/ftproot/upload/ -d
三、创建pam配置文件
man pam_userdb
cat /etc/pam.d/vsftpd 不用此文件
vim /etc/pam.d/vsftpd.db 没有此文件,加.db区分上面的文件
auth required pam_userdb.so db=/etc/vsftpd/vusers 不用加.db
account required pam_userdb.so db=/etc/vsftpd/vusers
四、指定pam配置文件
vim /etc/vsftpd/vsftpd.conf
guest_enable=YES 手动添加
guest_username=ftpuser 手动添加
pam_service_name=vsftpd.db vsftpd更改为vsftpd.db
五、SELinux设置
禁用SELinux
setsebool -P ftpd_full_access 1
如果禁用了,就不用操作
systemctl restart vsftpd
centos6
ftp 192.168.29.127
ftp1/2/3 都可以登陆,都进入/var/ftproot里
put fstab 都不能上传文件,权限受限制
centos7
ps -eFH 进程: root-nobody-ftpuser
六、虚拟用户建立独立的配置文件(不同用户有不同权限)
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.d/ 手动添加
mkdir /etc/vsftpd/vusers.d/
cd /etc/vsftpd/vusers.d/
允许ftp1用户可读写,其它用户只读
vim ftp1 文件名对应用户名,系统才会识别
anon_upload_enable=YES 匿名上传
anon_mkdir_write_enable=YES 创建文件夹
anon_other_write_enable=YES 删除和修改上传的文件
vim ftp2
local_root=/var/ftproot2 登录目录改变至指定的目录
mkdir /var/ftproot2
chmod -w /var/ftproot2
touch /var/ftproot2/ftproot2_file
ll -d /var/ftproot2
systemctl restart vsftpd
centos6
ftp 192.168.29.127
ftp1 可以登陆
put fstab 能上传文件
del fstab 能删除文件
mkdir dir1 能建立文件夹
rmdir dir1 能删除文件夹
ftp 192.168.29.127
ftp2 可以登陆
进入到/ftproot2,与ftp1进入的目录不同
put fstab2 不能上传文件,权限受限制
实现基于MYSQL验证的vsftpd虚拟用户
恢复快照最初状态
centos7数据库服务器,centos7-3FTP服务器
克隆centos7变为centos7.3-3: 192.168.29.129
cdnet
vim ifcfg-ens33 删除uuid和hardware(与centos7相同,所以要删除,避免冲突)
vim ifcfg-ens34 删除uuid
一、安装所需要包和包组
数据库服务器
Centos7
yum -y install mariadb-server (Centos6: mysql-server已经安装,重启mysqld)
systemctl start mariadb.service
systemctl enable mariadb
ss -ntl 3306端口
mysql_secure_installation 删除匿名用户
mysql -uroot -p 尝试登陆
show databases
FTP服务器
centos6 (没有挑战性,不做)
pam_mysql由epel6的源中提供
yum install vsftpd pam_mysql
centos7-3
yum -y groupinstall "Development tools"
yum -y install mariadb-devel pam-devel vsftpd
pam_mysql无对应rpm包,需手动编译安装
下载pam_mysql-0.7RC1.tar.gz(文件包里有)
地址: http://pam-mysql.sourceforge.net/
点击 pam_mysql-0.7RC1.tar.gz
rz 上传至根下
tar xvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1/
rpm -ql mariadb-devel
rpm -ql pam-devel
./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security
make && make install
cd /lib64/security; ll -tr
二、在数据库服务器上创建虚拟用户账号
centos7
1.建立存储虚拟用户的数据库,示例创建为vsftpd数据库
mysql -uroot -p
create database ftpdb
show databases;
ftp服务和mysql不在同一主机:
grant all on ftpdb.* to ftpuser@'192.168.29.%' identified by '123456';
select host,user,password from mysql.user;
flush privileges;
ftp服务和mysql在同一主机:
grant all on ftpdb.* to ftpuser@'localhost' identified by '123456';
grant all on ftpdb.* to ftpuser@'127.0.0.1' identified by '123456';
2.准备相关表
mysql -uftpuser -p -h 192.168.29.127
show databases;
use ftpdb
show tables;
create table users(id int unsigned auto_increment primary key,name char(30) binary not null,password char(50) binary not null);
desc users;
3.添加测试的虚拟用户
根据需要添加所需要的用户,为了安全应该使用password函数加密其密码后存储
select password('xxxxxabsc'); 因为char,所以是固定长度的加密密码
insert into users (name,password) values('ftp1',password('1234567')),('ftp2',password('12345678'));
show tables;
select * from users;
三、在FTP服务器上配置vsftpd服务
centos7-3
1.在FTP服务器上建立pam认证所需文件
cat /etc/pam.d/vsftpd
vim /root/pam_mysql-0.7RC1/README
搜索: /crypt
注意:参考README文档,选择正确的加密方式
crypt是加密方式:
0表示不加密,1表示crypt(3)加密,2表示使用mysql password()函数加密,3表示md5加密,4表示sha1加密
vim /etc/pam.d/vsftpd.mysql
添加如下两行
auth required pam_mysql.so user=ftpuser passwd=123456 host=192.168.29.127 db=ftpdb table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=ftpuser passwd=123456 host=192.168.29.127 db=ftpdb table=users usercolumn=name passwdcolumn=password crypt=2
----------------------------------------------------------------------------------------
配置字段说明
• auth 表示认证
• account 验证账号密码正常使用
• required 表示认证要通过
• pam_mysql.so模块是默认的相对路径,
是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
• user=ftpuser为登录mysql的用户
• passwd=123456 登录mysql的的密码
• host=192.168.29.127 mysql服务器的主机名或ip地址
• db=vsftpd 指定连接msyql的数据库名称
• table=users 指定连接数据库中的表名
• usercolumn=name 当做用户名的字段
• passwdcolumn=password 当做用户名字段的密码
• crypt=2 密码的加密方式为mysql password()函数加密
----------------------------------------------------------------------------------------
2.建立相应用户和修改vsftpd配置文件,使其适应mysql认证
建立虚拟用户映射的系统用户及对应的目录
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES 确保已经启用
pam_service_name=vsftpd.mysql 修改好了
guest_enable=YES 添加
guest_username=vuser 添加
useradd -r -s /sbin/nologin -m -d /var/ftproot vuser
ll -d /var/ftproot/
chmod 555 /var/ftproot/ 需除去ftp根目录的写权限
ll -d /var/ftproot/
mkdir /var/ftproot/{pub,upload}
chown vuser /var/ftproot/upload or setfacl -m u:vuser:rwx /var/ftproot/upload
ll /var/ftproot/upload/ -d
四、启动vsftpd服务
centos7-3
service vsftpd start; systemctl start vsftpd
chkconfig vsftpd on; systemctl enable vsftpd
netstat/ss -tnlp |grep :21 查看端口开启情况
五、Selinux相关设置:在FTP服务器上执行(如果禁用,则不考虑即可)
restorecon -R /lib64/security
setsebool -P ftpd_connect_db 1
setsebool -P ftp_home_dir 1
chcon -R -t public_content_rw_t /var/ftproot/
六、测试:利用FTP客户端工具,以虚拟用户登录验证结果
centos6
ftp 192.168.29.129
ftp 登陆到/var/ftp
get f1 下载可以
put fstab 上传不行
ftp1/2 以vuser身份登陆/var/ftproot
cd upload
get f1 下载可以
put fstab 上传不行
centos7-3
ps -eFH
tail /var/log/secure
七、在FTP服务器上配置虚拟用户具有不同的访问权限
vsftpd可以在配置文件目录中为每个用户提供
单独的配置文件以定义其ftp服务访问权限,
每个虚拟用户的配置文件名同虚拟用户的用户名。
配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可
centos7-3
1、配置vsftpd为虚拟用户使用配置文件目录
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers 添加
2、创建所需要目录,并为虚拟用户提供配置文件
mkdir /etc/vsftpd/vusers
3、配置虚拟用户的访问权限
虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。
如果需要让用户ftp1具有上传文件的权限,
可以修改/etc/vsftpd/vusers_config/ftp1文件,
在里面添加如下选项并设置为YES即可,只读则设为NO
注意:需确保对应的映射用户对于文件系统有写权限
cd /etc/vsftpd/vusers
vim ftp1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
vim ftp2
local_root=/app/ftproot2 登录目录改变至指定的目录
mkdir /app/ftproot2
chmod -w /app/ftproot2
touch /app/ftproot2/ftproot2_file
ll -d /var/ftproot2
systemctl restart vsftpd
测试
centos6
ftp 192.168.29.129
ftp 登陆
ftp1 登陆
put fstab 能上传文件
del fstab 能删除文件
get f1 能下载
mkdir dir1 能建立文件夹
rmdir dir1 能删除文件夹
ftp 192.168.29.129
ftp2 登陆
进入到/ftproot2,与ftp1进入的目录不同
put fstab2 不能上传文件,权限受限制
get ftproot2_file 可以下载
工具测试
centos7-3
cd /var/ftp/pub
dd if=/dev/zero of=f1 bs=1M count=2048
yum -y install httpd
cp f1 /var/www/html
ll -h f1
ll -h /var/www/html
systemctl start httpd
centos6
yum -y install lftp
lftpget ftp://192.168.29.129/pub/f1
lftpget http://192.168.29.129/f2 http下载更快
第二次下载ftp更快,可能是缓存原因
Axel: 网络客户端工具
下载安装axel(没有此包)
地址: http://axel.alioth.debian.org/ 没有开源精神,wget也可以下载文件
rpm -ivh axel-2.4-1.el6.rf.x86_64.rpm
axel -n 3 -o /root ftp://192.168.29.129/pub/f1
下载lnmp安装包指定10个线程,存到/tmp/:
axel -n 10 -o /tmp/ http://www.linuxde.net/lnmp.tar.gz
axel --h
--max-speed=x -s x 最大速度 (字节/秒)
--num-connections=x -n x 最大连接数
--output=f -o f 指定文件名
--search[=x] -S [x] Search for mirrors and download from x servers 搜索镜像
--header=x -H x 添加header(指定 HTTP header)
--user-agent=x -U x 设置用户代理(指定 HTTP user agent)
--no-proxy -N 不使用任何代理
--quiet -q Leave stdout alone
--verbose -v 显示更多状态信息
--alternate -a 显示简单进度条
--help -h 帮助
--version -V 版本信息
网友评论