ftp
介绍
FTP:File transfer protocol 文件传输协议
端口
TCP21:命令
TCP20:数据
原理
默认采用被动模式
被动模式FTP
为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被
动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。在被动方式FTP中,命令连接和数据连接都由客户端,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N >; 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P >; 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
FTP服务器命令(21)端口接受客户端任意端口(客户端初始连接)
FTP服务器命令(21)端口到客户端端口(>1023)(服务器响应客户端命令)
FTP服务器数据端口(>1023)接受客户端端口(>1023)(客户端初始化数据连接到服务器指定的任意端口)
FTP服务器数据端口(>1023)到客户端端口(>1023)(服务器发送ACK响应和数据到客户端的数据端口)
NFS,基于主机认证,只是局域网之间文件传输
FTP,可以实现用户之间的认证
Real:本地用户 ,服务端用户
匿名用户
虚拟(游客)用户
(只需要一台服务机)
FTP状态码
1xx – 肯定的初步答复
这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。
●110 重新启动标记答复。
●120 服务已就绪,在 nnn 分钟后开始。
●125 数据连接已打开,正在开始传输。
●150 文件状态正常,准备打开数据连接。
2xx – 肯定的完成答复
一项操作已经成功完成。客户端可以执行新命令。
● 200 命令确定。
● 202 未执行命令,站点上的命令过多。
● 211 系统状态,或系统帮助答复。
● 212 目录状态。
● 213 文件状态。
● 214 帮助消息。
● 215 NAME 系统类型,其中,NAME 是 Assigned Numbers 文档中所列的正式系统名称。
● 220 服务就绪,可以执行新用户的请求。
● 221 服务关闭控制连接。如果适当,请注销。
● 225 数据连接打开,没有进行中的传输。
● 226 关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。
● 227 进入被动模式 (h1,h2,h3,h4,p1,p2)。
● 230 用户已登录,继续进行。
● 250 请求的文件操作正确,已完成。
● 257 已创建“PATHNAME”。
3xx – 肯定的中间答复
该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。
● 331 用户名正确,需要密码。
● 332 需要登录帐户。
● 350 请求的文件操作正在等待进一步的信息。
4xx – 瞬态否定的完成答复
该命令不成功,但错误是暂时的。如果客户端重试命令,可能会执行成功。
● 421 服务不可用,正在关闭控制连接。如果服务确定它必须关闭,将向任何命令发送这一应答。
● 425 无法打开数据连接。
● 426 Connection closed; transfer aborted.
● 450 未执行请求的文件操作。文件不可用(例如,文件繁忙)。
● 451 请求的操作异常终止:正在处理本地错误。
● 452 未执行请求的操作。系统存储空间不够。
5xx – 永久性否定的完成答复
该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。
● 500 语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误。
● 501 在参数中有语法错误。
● 502 未执行命令。
● 503 错误的命令序列。
● 504 未执行该参数的命令。
● 530 未登录。
● 532 存储文件需要帐户。
● 550 未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。
● 551 请求的操作异常终止:未知的页面类型。
● 552 请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。
● 553 未执行请求的操作。不允许的文件名。
常见的FTP 状态代码及其原因
● 150 – FTP 使用两个端口:21 用于发送命令,20 用于发送数据。状态代码 150 表示服务器准备在端口 20 上打开新连接,发送一些数据。
● 226 – 命令在端口 20 上打开数据连接以执行操作,如传输文件。该操作成功完成,数据连接已关闭。
● 230 – 客户端发送正确的密码后,显示该状态代码。它表示用户已成功登录。
● 331 – 客户端发送用户名后,显示该状态代码。无论所提供的用户名是否为系统中的有效帐户,都将显示该状态代码。
● 426 – 命令打开数据连接以执行操作,但该操作已被取消,数据连接已关闭。
● 530 – 该状态代码表示用户无法登录,因为用户名和密码组合无效。如果使用某个用户帐户登录,可能键入错误的用户名或密码,也可能选择只允许匿名访问。如果使用匿名帐户登录,IIS 的配置可能拒绝匿名访问。
● 550 – 命令未被执行,因为指定的文件不可用。例如,要 GET 的文件并不存在,或试图将文件 PUT 到您没有写入权限的目录。
配置文件
1.3 配置文件
主配置文件:
vim /etc/vsftpd/vsftpd.conf
从配置文件
vim /var/ftp/pub
主配置文件详解
anonymous_enable=YES 是否启用匿名用户
local_enable=YES
write_enable=YES 允许写入(无论是匿名用户还是本地用户要实现上传就需要快开启它)
local_umask=022 默认本地用户上传文件权限755
dirmessage_enable=YES 显示每个目录下的文件信息
xferlog_enable=YES 日志启用
connect_from_port_20=YES 主动请求的数据端口
chown_uploads=YES 所有匿名用户上传的文件所属用户将会被改成chown_username
chown_username=whoever 匿名上传的所属用户名是whoever
xferlog_file=/var/log/xferlog 启用的日志文件
xferlog_std_format=YES
idle_session_timeout=600 空闲连接超时
data_connection_timeout=120 数据连接超时
nopriv_user=ftpsecure 当服务器运行于最底层时使用的用户名
chroot_list_enable=YES chroot_local_user=YES 所有文件列出用户, 可以切换到其他目录
chroot_list_file=/etc/vsftpd/chroot_list
listen=NO 服务将自己监听处理listen_ipv6=YES
pam_service_name=vsftpd 设置PAM认证模块使用名称预设为vsftpd
userlist_enable=YES
tcp_wrappers=YES 服务端和客户端访问控制策略(服务器级别的一种防火墙)、
2.1匿名用户
默认访问/ftp/pub
2.1.1 准备工作
1)安装vsftpd
[root@localhost ~]# mount /dev/sr0 /mnt
mount: /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# yum install vsftpd –y
2)关闭起vsftpd服务,关闭防火墙和SE linux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl restart vsftpd
虚拟用户配置
创建账号数据
vsftpd服务使用Berkeley DB格式的数据库文件来存放虚拟用户账号。建立这种数据库文件需要用到db_load工具,db_load工具由db4-utils软件包提供,默认已安装。
① 创建文本格式的用户名、密码列表。
奇数行:账号名,偶数行:密码(即上一行中账号的密码)
② 转化为Berkeley DB 格式的数据文件
需要db_load 转换工具,默认已安装。
l “-f”用于指定数据源文件
l “-T”表示允许非Berkeley DB的应用程序使用从文本格式转换的DB数据文件
l “-t hash”用于指定读取数据文件的基本方法
③ 为了提高虚拟用户账号文件的安全性,应将文件权限设置为600,以免数据外泄。
如下:
[root@ftp ~]# vi /etc/vsftpd/users.confzhangsan1234zhaogao5678[root@ftp ~]# db_load -T -t hash -f /etc/vsftpd/users.conf /etc/vsftpd/users.db[root@ftp ~]# chmod 600 /etc/vsftpd/users.*[root@ftp ~]# ls -lh /etc/vsftpd/users.*-rw-------. 1 root root 27 3月 7 22:53 /etc/vsftpd/users.conf-rw-------. 1 root root 12K 3月 7 22:59 /etc/vsftpd/users.db
④ 创建FTP 根目录及虚拟用户映射的系统用户(此账号无需设置密码及登录shell)。如下:
[root@ftp ~]# useradd vsftpd -d /home/vsftpd -s /sbin/nologin[root@ftp ~]# mkdir -p /home/vsftpd/xmcsxy[root@ftp ~]# chmod -R 755 /home/vsftpd
⑤ 建立支持虚拟用户的PAM认证文件
创建好虚拟用户的账号数据文件后,还需要对vsftpd服务的配置做相应的调整,以便识别并读取新的用户信息。在vsftpd服务器中,用户认证是通过PAM(Pluggable Authentication Module,可插拔认证模块)机制来实现的,该机制包含灵活的选择认证方式。Vsftpd服务默认的PAM认证文件位于/etc/pam.d/vsftpd,该文件适用于以Linux主机的系统用户账号进行认证。若要读取虚拟用户的账号数据文件,则需要创建新的PAM认证配置。
如下:
[root@ftp ~]# vi /etc/pam.d/vsftpdauth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/usersaccount sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/users
2.添加虚拟用户支持
① 在vsftpd.conf 文件中添加虚拟用户支持配置。如下:
[root@ftp ~]# vi /etc/vsftpd/vsftpd.confanonymous_enable=NO #禁止匿名用户登录增加下面配置参数:chroot_local_user=YES #禁止用户访问除主目录以外的目录guest_enable=YES #启用虚拟用户allow_writeable_chroot=YES # 允许写入用户主目录
② 为不同的虚拟用户建立独立的配置文件
通过前面的几个步骤,实际上已经可以重新加载vsftpd并提供服务了,使用任一个虚拟用户账号都可以登录FTP服务器并下载文件。但因为所有的虚拟用户都映射到同一个系统用户账号,因此FTP访问权限也是相同的,要么只能下载,要么只能上传。
若要为不同的虚拟用户账号设置不同的访问权限,可以通过为每个虚拟用户建立单独的配置文件来实现。为FTP用户启用独立配置文件,需要修改vsftpd.conf配置文件,添加“user_config_dir”配置项。如下:
[root@ftp ~]# vi /etc/vsftpd/vsftpd.confuser_config_dir=/etc/vsftpd/vsftpd_user_conf #虚拟用户使用的配置文件目录
③ 有了上述配置以后,就可以在/etc/vsftpd/vsftpd_user_conf 目录中为每个虚拟用户分别建立配置文件了。如下:
[root@ftp ~]# mkdir -p /etc/vsftpd/vsftpd_user_conf[root@ftp ~]# cd /etc/vsftpd/vsftpd_user_conf/[root@ftp vsftpd_user_conf]# vi zhangsanlocal_root=/home/vsftpd/xmcsxy # 当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录。anon_upload_enable=YES # 是否允许登陆用户有上传权限。write_enable=YES # 是否允许登陆用户有写权限。
在vsftpd.conf文件中启用了“user_config_dir”配置项以后,应该为每一个虚拟用户都建立一个单独的配置文件(可以是空文件),否则该用户可能无法登录。在每个用户的独立配置文件中,可以添加新的配置项来限制访问权限、下载速率等。
重启服务并测试
重启服务生效配置文件:
[root@ftp ~]# systemctl restart vsftpd[root@ftp ~]# systemctl enable vsftpdCreated symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to/usr/lib/systemd/system/vsftpd.service.
使用虚拟FTP 账户访问测试:
zhangsan用户可以登录,并可以浏览、下载,也可以上传。
测试之前:关闭防火墙以及安全规则;
[root@ftp vsftpd_user_conf]# systemctl stop firewalld[root@ftp vsftpd_user_conf]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.[root@ftp vsftpd_user_conf]# setenforce 0
先往家目录写入一个文件:
[root@ftp ~]# cd /home/vsftpd/xmcsxy/[root@ftp xmcsxy]# touch a.txt
运用windows图形化FTP工具(Filezilla):
登录
上传
下载
可以通过日志查看登录是否报错:
[root@ftp ~]# tail -f /var/log/secure
访问限制黑白名单
设置ftp黑白名单:(系统账号FTP登录限制文件)
ftpusers和user_list两个文件用途和区别:
ftpusers它不受任何配置项影响,总是有效,是黑名单!
创建2个测试账号:test1和test2
[root@localhost vsftpd]# useradd test1
[root@localhost vsftpd]# useradd test2
[root@localhost vsftpd]# passwd test1
Changing password for user test1.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost vsftpd]# passwd test2
Changing password for user test2.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
测试将test1加入黑名单:
[root@localhost vsftpd]# vi ftpusers
nfs
检查环境:
[root@localhost vsftpd]# uname -aLinux localhost.localdomain 3.10.0-327.el7.x86_64 #1SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
安装所需依赖包:
[root@l ~]# yum -y install nfs-utils rpcbind
安装完后查看nfsnobody用户在不在:
[root@l ~]# id nfsnobodyuid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
启动rpc服务:
[root@l ~]# systemctl start rpcbind[root@l ~]# systemctl enable rpcbind
查看rpc端口:
[root@l ~]# netstat -tnulp|grep rpctcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 919rpcbindtcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 1176/rpc.mountdtcp 0 0 0.0.0.0:49660 0.0.0.0:* LISTEN 1159/rpc.statdtcp6 0 0 :::111 :::* LISTEN 919rpcbind
查看端口映射情况:
[root@l ~]# rpcinfo -p localhost #这里nfs服务没启动,看不到nfs端口的映射情况program vers proto port service100000 4 tcp 111 portmapper100000 3 tcp 111 portmapper100000 2 tcp 111 portmapper100000 4 udp 111 portmapper100000 3 udp 111 portmapper100000 2 udp 111 portmapper
启动nfs服务:
[rootl ~]# systemctl start nfs[root@l ~]# systemctl enable nfs
关闭防火墙及安全规则:
[root@l~]# systemctl stop firewalld[root@l ~]# systemctl disable firewalld[root@l ~]# setenforce 0
过程
# 基本环境准备[root@localhost ~]# hostnamectl set-hostname nfs[root@localhost ~]# bash[root@nfs ~]# systemctl stop firewalld[root@nfs ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.[root@nfs ~]# setenforce 0
# NFS配置[root@nfs ~]# yum install -y vim net-tools[root@nfs ~]# yum install -y nfs-utils rpcbind# 确认是否有这个用户[root@nfs ~]# id nfsnobodyuid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)# 启动服务、开机自启[root@nfs ~]# systemctl start rpcbind[root@nfs ~]# systemctl enable rpcbind[root@nfs ~]# systemctl enable nfsCreated symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.[root@nfs ~]# systemctl start nfs[root@nfs ~]# netstat -ntlp |grep rpctcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 1622/rpc.mountdtcp 0 0 0.0.0.0:37267 0.0.0.0:* LISTEN 1602/rpc.statdtcp6 0 0 :::36077 :::* LISTEN 1602/rpc.statdtcp6 0 0 :::20048 :::* LISTEN 1622/rpc.mountd# 创建存放数据目录[root@nfs ~]# mkdir /data[root@nfs ~]# chown -R nfsnobody:nfsnobody /data/[root@nfs ~]# chmod 755 -R /data
# 添加磁盘 分区挂载[root@nfs ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 0 40G 0 disk├─sda1 8:1 0 1G 0 part /boot└─sda2 8:2 0 39G 0 part├─centos-root 253:0 0 37G 0 lvm /└─centos-swap 253:1 0 2G 0 lvm [SWAP]sdb 8:16 0 20G 0 disksr0 11:0 1 4.4G 0 rom[root@nfs ~]# fdisk /dev/sdbWelcome to fdisk (util-linux 2.23.2).Changes will remain in memory only, until you decide to write them.Be careful before using the write command.Device does not contain a recognized partition tableBuilding a new DOS disklabel with disk identifier 0xb1ae8ff6.Command (m for help): nPartition type:p primary (0 primary, 0 extended, 4 free)e extendedSelect (default p):Using default response pPartition number (1-4, default 1):First sector (2048-41943039, default 2048):Using default value 2048Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039):Using default value 41943039Partition 1 of type Linux and of size 20 GiB is setCommand (m for help): pDisk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk label type: dosDisk identifier: 0xb1ae8ff6Device Boot Start End Blocks Id System/dev/sdb1 2048 41943039 20970496 83 LinuxCommand (m for help): wThe partition table has been altered!Calling ioctl() to re-read partition table.Syncing disks.[root@nfs ~]# mkfs.ext4 /dev/sdb1mke2fs 1.42.9 (28-Dec-2013)Filesystem label=OS type: LinuxBlock size=4096 (log=2)Fragment size=4096 (log=2)Stride=0 blocks, Stripe width=0 blocks1310720 inodes, 5242624 blocks262131 blocks (5.00%) reserved for the super userFirst data block=0Maximum filesystem blocks=2153775104160 block groups32768 blocks per group, 32768 fragments per group8192 inodes per groupSuperblock backups stored on blocks:32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,4096000Allocating group tables: doneWriting inode tables: doneCreating journal (32768 blocks): doneWriting superblocks and filesystem accounting information: done# 写入配置文件自动挂载[root@nfs ~]# vim /etc/fstab/dev/sdb1 /data ext4 defaults 0 0[root@nfs ~]# mount -a[root@nfs ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/centos-root 37G 1.1G 36G 3% /devtmpfs 899M 0 899M 0% /devtmpfs 911M 0 911M 0% /dev/shmtmpfs 911M 9.5M 902M 2% /runtmpfs 911M 0 911M 0% /sys/fs/cgroup/dev/sda1 1014M 142M 873M 14% /boottmpfs 183M 0 183M 0% /run/user/0/dev/sdb1 20G 45M 19G 1% /data# 配置nfs共享目录[root@nfs ~]# vim /etc/exports/data 192.168.200.0/24(rw,no_root_squash,async) //分配权限[root@nfs ~]# exportfs -rvexporting 192.168.200.0/24:/data#检测 nfs 共享目录创建成果[root@nfs ~]# showmount -e 192.168.200.12Export list for 192.168.200.12:/data 192.168.200.0/24
# ftp节点配置[root@ftp vsftpd_conf]# yum install -y nfs-utils rpcbind#将/data 目录挂载到/home/vsftpd/xmcsxy/目录上[root@ftp vsftpd_conf]# mount -t nfs 192.168.200.12:/data /home/vsftpd/xmcsxy/[root@ftp vsftpd_conf]# cd /home/vsftpd/xmcsxy/[root@ftp xmcsxy]# mkdir yunyunwei dashujv xiaocheng[root@ftp xmcsxy]# lsdashujv lost+found xiaocheng yunyunwei# nfs编写脚本[root@nfs ~]# vim /usr/local/sbin/backup.sha=`date '+%Y%m%d'` #定义时间b=/backup/weekbackup #定义备份目录路径c=/var/log/backup.log #定义输出日志路径pname=$(rpm -qa | grep rsync) #定义rsync安装包检查#判断rsync是否存在if [ $? -eq 0 ]thenecho "软件包rsync已经安装。"elseecho "软件包rsync没有安装"yum -y install rsync >> /dev/nullif [ $? -eq 0 ];thenecho "安装rsync完成。"elseecho "安装rsync失败。"fifi#判断备份目录是否存在,并增量备份。if [ ! -d "$b" ];thenmkdir -p $becho "$a Backup File missing!" >> /var/log/backup.logrsync -rvz /data $b/$aelsersync -rvz /data $b/$aif [ -d $b/$a ];thenecho "$a Backup success." >> /var/log/backup.logfind $b -mtime +14 | xargs rm -rfelseecho "$a Backup failed." >> /var/log/backup.logfifi# 执行脚本[root@nfs ~]# sh -x /usr/local/sbin/backup.sh++ date +%Y%m%d+ a=20210923+ b=/backup/weekbackup+ c=/var/log/backup.log++ rpm -qa++ grep rsync+ pname=+ '[' 1 -eq 0 ']'+ echo 软件包rsync没有安装软件包rsync没有安装+ yum -y install rsync+ '[' 0 -eq 0 ']'+ echo 安装rsync完成。安装rsync完成。+ '[' '!' -d /backup/weekbackup ']'+ rsync -rvz /data /backup/weekbackup/20210923sending incremental file listcreated directory /backup/weekbackup/20210923data/data/dashujv/data/dashujv/1.txtdata/lost+found/data/xiaocheng/data/yunyunwei/sent 270 bytes received 109 bytes 758.00 bytes/sectotal size is 6 speedup is 0.02+ '[' -d /backup/weekbackup/20210923 ']'+ echo '20210923 Backup success.'+ find /backup/weekbackup -mtime +14+ xargs rm -rf# 定时任务[root@nfs ~]# crontab -e* 21 */7 * * sh /usr/local/sbin/backup.sh #每7天晚上21点执行一次脚本
