Linux服务 FTP
FTP:File Transfer Protocol 文件传输协议
是一种文件共享服务,工做于应用层,基于TCP协议实现,有两个链接:一般咱们使用的协议都是客户端经过某个端口请求而后服务器端将响应返回给客户端以前使用的端口,一般都是一个链接就能够完成工做,可是ftp略有不一样,它须要两个连接才能完成工做(控制链接:用于传输管理命令,好比:get,mget,put,delete和数据链接:用于传输数据);
ftp的共享数据方式:
首先在服务器中创建一个目录,将数据传输至此,而后启动一个服务器进程,监听在某个套接字上,以便于监听来自客户端的请求;当有请求过来的时候会检查文件是否存在,请求的用户是有有权限访问等;若是有权限访问,可让用户下载,那么怎么将数据传给客户端呢?这时会创建一个数据链接专门用于传输数据;注:控制链接是一直处于链接状态的,而数据链接是用户须要传输数据的时候才会创建的,而且会超时断线; ftp是相似于C/S架构的,有客户端和服务器端;
ftp的两个链接:
控制链接(命令链接):监听在21/tcp
数据链接:
主动链接:监听在20/tcp
1.创建控制通道的链接
客户端会随机选取一个大于1024的端口来与FTP服务器的21号端口创建链接,这个过程会进行常规的三次握手,创建链接后用户即可以经过此通道来对FTP服务器执行命令:查询文件名,下载,上传等;
2.通知FTP服务器使用Active且告知链接的端口号
用户在须要数据的时候会告知服务器要用什么方式来链接,Active即为主动方式,使用此方式客户端会随机启用一个端口且经过控制链接来告知FTP服务器这两个信息,并等待服务器主动来链接本身(这就是为何叫主动链接啦,通常咱们都是站在服务器的角度来命名的);
3.FTP服务器主动向客户端链接
FTP服务器接收到客户端的需求后,会主动地使用20号端口(默认端口号)去链接客户端告知服务器本身启动的那个随机的端口,这个过程固然也是须要三次握手的,此时客户端与服务器端已经创建了两条链接,分别用于控制命令的执行与数据的传输上;
被动连接:监听端口随机
在现实的生产环境中,FTP的客户端与服务器端是有NAT或者防火墙的,主动模式创建控制链接时由于NAT会主动地记录内部送往外部的链接信息,而控制链接的创建就是由客户端向服务器端发起的,因此这个链接是能够顺利创建起来的;可是当客户端启用随机端口而后等待服务器来链接时,因为经过NAT转换后,FTP只能得知NAT的ip地址,而不是客户端的ip地址,所以ftp服务器会以20号端口主动链接NAT的某个端口(与客户端随机启用的那个端口号相同的端口),可是NAT并无启用这个端口来监听FTP服务器的链接啊,因此会失败;若是是防火墙道理也差很少,防火墙默认是容许内网发出请求而且容许发出请求所对应的相应进来的,可是直接由外网进来的请求是会阻挡的,你会说那我能够设置容许防火墙让某个外网能够进来啊,貌似没毛病,可是由于客户端启用的端口是随机的,因此你就要将全部大于1024 的端口都放行,那么防火墙存在的意义何在呢(其实iptables已经提供了两个模块(ip_conntrack和ip
_net_ftp)专门用于分析目标是port21的链接信息,因此就能够获得客户端启用的那个随机的端口,若此时接收到FTP服务器的主动连接就可以将该数据包导向正确的后端主机了:链接追踪)!因此就有另外一种模式来解决这这种问题:被动模式
1.用户与服务器创建控制链接
与主动模式同样,须要三次握手
2.客户端发送PASV的链接请求
当须要使用到数据通道时(例如使用get或者put命令时),客户端可经过控制链接发送PASV的被动链接请求,并等待服务器的回应
3.FTP服务器启动数据端口,并通知客户端来链接
此时FTP服务器端会先随机启动一个监听端口,这个端口能够是随机的,也能够是自定义某一范围的端口,这要看服务器软件而定,而后FTP服务器会经过控制链接告知客户端这个已经启动的端口,并等待客户端来链接;
4.客户端随机启用大于1024的端口进行链接
此时客户端会启用一个大于1024的端口去链接服务器启动的那个监听端口;接下来就能够进行数据的传输了;
数据传输模式:
咱们知道通常的数据传输模式有文本格式(html)和二进制格式(mp3,jpeg), 那么可想而知当咱们使用ftp在网上下载或上传数据时,也是有文本编码的需求的;那么ftp应该使用哪一种编码的,ftp是没有像http同样经过memi将二进制编码成文本格式,而后在客户端再还原为以前的二进制格式的功能的;其实使用ftp传输数据时是遵循文件原来自己的数据格式来传输的,之前是什么格式就用什么格式传输;因此ftp同时支持文本和二进制格式;
文本传输器使用ASCII字符,并由回车符和换行符分开,而二进制不用转换或格式化就可传字符,二进制模式比文本模式更快,而且能够传输全部ASCII值,因此系统管理员通常将ftp设置成二进制模式;
二进制模式用来传输可执行文件,压缩文件和图片文件.若是使用ASCII模式传输,会现实一堆乱码,你必须从新使用BINARY模式传输,使用HTML和文本编写的文件必须用ASCII模式上传,用BINARY模式上传会破坏文件,致使文件执行出错;
数据类型:
结构化数据
半结构化数据
非机构化数据
与它不一样的另外一种文件共享机制是RPC(Remote Procedure Call,远程过程调用),它可让两台计算机上的进程直接依赖于二进制协议完成通讯;
NFS(NetWork File System,网络文件系统)就是基于RPC机制工做的;
Samba:CIFS(通用internet文件系统)/SMB,windows的网上邻居使用的就是CIFS协议,咱们经过Samba就可以实现让linux与windows共享文件,让linux能够出如今windows的网上邻居当中;
服务器端程序:
wu-ftpd:最先的ftpd服务程序;因为没有使用模块化设计思想,任何一个地方出现故障都会致使全盘崩塌;
vsftpd(红帽默认提供):Very Secure ftpDaemon:短小精悍,主要着重于安全;
proftpd:专门用于提供ftp服务,功能丰富;
pureftpd
Filezilla(win和linux都有)
windows:Serv-U
客户端程序:
CLI:
ftp
lftp
GUI:
gftpd
FlashFXP
Cuteftp
Filezilla
vsftpd:
/etc/vsftpd:配置文件目录
/etc/init.d/vsftpd:服务脚本
/usr/sbin/vsftpd:主程序
基于pam实现用户认证:
/etc/pam.d/*
/lib/security/
/lib64/security/
支持虚拟用户
注:由于vsftpd是受selinux控制的,因此在不了解selinux时建议先将selinux关闭:setenforce 0 学习作实验的时候建议将防火墙也关闭:iptables -F(清空防火墙规则)
默认使用/var/ftp/做为其提供服务的根目录(默认是被chroot的),其中的pub子目录就是公共文件访问目录;这个目录只有root用户具备写权限;所以比较安全;
上传和下载:
上传是指客户端传数据到服务器端,对于服务器来讲,这个权限是不会随便提供给任何人的,若是有心怀不轨的人盯上你,可能就会传一些带有病毒的文件;
下载是指从服务器传数据到客户端,对于服务器来讲,这个权限能够提供给大多数用户,而不会危害到服务器自己;
可是上面说了/var/ftp目录是有root才具备写权限,而且绝对不容许给其余用户赋予写权限的,那么在须要的时候其余用户怎么上传文件那,咱们能够经过在其中建立子目录来赋予相应用户写权限,以达到上传文件的目的;
ftp的用户:每一种用户都有其对应的系统用户;
/var/ftp/这个目录就是ftp这个用户的家目录;
匿名用户→anonymous_enable(默认映射至ftp这个系统用户)
系统用户→local_enable
虚拟用户
使用ftp ip_address登录ftp服务器,以后会提示输入用户名以及密码,根据你的状况填入便可;若是是使用anonymous用户登录的话则不须要密码直接回车便可;
配置文件经常使用选项:
anonymous_enable=YES→ 是否容许匿名用户登录
local_enable=YES→ 是否容许系统用户登录
建立一个用户而且设置一个密码,而后使用这个用户登录之后你会发现里面什么都没有,连pub这个子目录都没有,其实这是正常的,由于使用系统用户登录fpt服务器,默认进入的是此用户的家目录,可是他没有将用户锁定到本身的家目录,也就是说他能够切换到其余目录,若是不给他禁锢到家目录中这是很危险的,咱们可使用chroot实现;
write_enable=YES→系统用户是否能够上传文件
文件服务权限:文件系统权限(rwx)*文件共享权限(write_enable=YES/NO,anon_upload_enable=YES/NO)
anon_mkdir_write_enable=YES/NO→是否能够建立目录
anon_other_write_enable=YES/NO→其余的写权限,包括删除文件的权限
dirmessage_enable=YES/NO→ 用于显示欢迎信息,在目录中建立一个隐藏文件并命名为.message,而后在其中填入你想告诉他人的提示信息便可,当你进入到此目录时就会现实.message中的内容了;
xferlog_enable=YES/NO→是否打开传输日志;打开之后,当用户上传或下载文件时会将信息记录到指定的日志文件中;
xferlog_file=/var/log/xferlog→ 用于存储上面设置产生的日志信息
xferlog_std_format=YES/NO→ 是否启用标准格式记录日志
chroot_local_user=YES/NO→ 是否要将用户限制在本身的用户家目录中,为了安全性,建议设置为YES
chroot_list_enable=YES/NO→ 是否启用经过将用户写入某个文件中从而将其chroot在本身的家目录中;当上一项为YES时,此项为NO为将文件中制定的用户其限制到家目录中,此项为YES表示不限制文件中指定的用户;当上一项被注释掉以后,此项为YES则表示将用户限制到本身的家目录中,此项为NO则表示不限制;
chroot_list_file=/etc/vsftpd/chroot_list→ 在/etc/vsftpd/chroot_list中填入不想被chroot的账号,一行一个账号便可;需手动建立
idle_session_timeout=600→ 定义会话超时时间(跟控制链接有关,单位是秒)
data_connection_timeout=120→ 定义数据连接的超时时间(跟数据链接有关,单位时秒)
ascii_upload_enable=YES/NO→ 启用文本模式上传功能 建议注释掉
ascii_download_enable=YES/NO→ 启用文本模式下载功能 建议注释掉
pam_service_name=vsftpd→ vsftpd在pam中的配置文件(可使写在/etc/vsftpd/ftpusers中的用户没法登录ftp服务器)
userlist_enable=YES/NO→ 在ftpusers中没有内容时能够经过这个设置来禁止写在/etc/vsftpd/user_list中的用户登录ftp服务器
userlist_deny=YES/NO→ 能够经过设置YES或者NO来决定/etc/vsftpd/user_list中的用户是否能够登录ftp服务器;YES为不容许,NO为容许;
max_clients=50→ 最多容许多少客户端同时链接
max_per_ip=4→ 每一个ip最多容许发起几个链接请求
更多的信息请查看man vsftpd.conf;
守护进程:
独立进程
适用于访问量大,用户在线时间比较长的服务
瞬时进程
适用于访问量小,用户在线时间比较短的服务
由xinetd(超级守护进程)代为管理
超级守护进程为一个独立进程
若是将vsftpd的配置文件中的Listen设置为YES的话,就表示以独立进程的方式运行;不然为瞬时进程,而且要在/etc/xinetd.d/目录中为其建立一个符合瞬时进程格式的脚本;
vsftpd的安全通讯方式:
ftps:fpt+ssl/tls
1.建立证书,给vsftpd颁发证书
mkdir certs newcerts crl
touch index.txt
echo 01 > serial
(umask 007;openssl genrsa -out private/cakey.pem 2048)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HN
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:guowei
Organizational Unit Name (eg, section) []:Tech
Common Name (eg, your name or your server's hostname) []:ca.guowei.com
Email Address []:
mkdir /etc/vsftpd/ssl
cd /etc/vsftpd/ssl/
(umask 077;openssl genrsa -out vsftpd.key 2048;)
openssl req -new -key vsftpd.key -out vsftpd.csr
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HN
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:guowei
Organizational Unit Name (eg, section) []:Tech
Common Name (eg, your name or your server's hostname) []:ftp.guowei.com
Email Address []:
Please enter the following 'extra' attributes to be sent with your certificate request
A challenge password []:
An optional company name []:
openssl ca -in vsftpd.csr -out vsftpd.crt
vim /etc/pki/tls/openssl.cnf
dir = /etc/pki/CA # Where everything is kept
2.编辑vsftpd.conf,添加一下几项
ssl_enable=YES→ 是否启用ssl功能
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES 支持哪几种协议
allow_anon_ssl=NO→ 匿名用户是否使用ssl加密
force_local_data_ssl=YES→ 是否强制本地用户传输文件时使用ssl加密
force_local_logins_ssl=YES→ 是否强制本地用户登录时使用ssl加密
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt → 证书文件位置
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key →密钥文件位置
3.重启服务
service vsftpd restart
4.接下来就可使用FlashFPXP这个客户端来链接fpt服务啦
请自行下载软件
sftp:openssh,基于ssh来实现的
虚拟用户:
只要对应的格式能被认证功能识别支持,就能够实现对应的虚拟用户;
基于mysql的虚拟用户:
好比在mysql中建立一个数据库,创建一张表,其中有两个字段:用户名(name)&密码(password);当咱们须要认证的时候,就会去查找这张表,当咱们输入用户名的时候,而后验证密码匹配正确的话就能够完成认证;
例子:
1.首先须要安装开发环境以及mysql数据库
开发工具自行安装
yum install mysql-server mysql-devel -y
2.安装pam_mysql-0.7RC1 → pam默认是不支持去mysql验证用户账号的,因此咱们须要为pam安装这个插件来支持这个功能;
yum install pam-devel.x86_64 -y 请事先肯定是否安装此包,无则安;
http://pam-mysql.sourceforge.net/ 能够在这个网站下载这个插件;
tar -xf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1/
centos7:./configure --with-mysql=/usr --with-pam-mods-dir=/lib64/security
(centos6:./configure --with-mysql=/usr --with-openssl)
make
make install
3.配置mysql数据库
mysql
CREATE DATABASE vsftpd;
use vsftpd;
CREATE TABLE users(
id SMALLINT AUTO_INCREMENT NOT NULL,
name CHAR(20) BINARY NOT NULL,
password CHAR(48) BINARY NOT NULL,
PRIMARY key (id));
DESC users;
GRANT SELECT ON vsftpd.* TO vsftpd@localhost IDENTIFIED BY 'vsftpd';
GRANT SELECT ON vsftpd.* TO vsftpd@127.0.0.1 IDENTIFIED BY 'vsftpd';
FLUSH PRIVILEGES;
INSERT INTO users (name,password) VALUE ('tony','redhat'),('peter','redhat');
mysql -uvsfptd -p
键入密码:vsftpd
4.创建pam认证所须要的文件
vim /etc/pam.d/vsfptd.mysql
auth required pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0
account required pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0
关于crpyt的设置能够查看pam_mysql-0.7RC1/README
字段说明:
auth 表示认证
account 验证帐号密码正常使用
required 表示认证要经过
pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路 径而言,也能够写绝对路径;后面为给此模块传递的参数
user=vsftpd为登陆mysql的用户
passwd=magedu 登陆mysql的的密码
host=mysqlserver mysql服务器的主机名或ip地址
db=vsftpd 指定链接msyql的数据库名称
table=users 指定链接数据库中的表名
usercolumn=name 当作用户名的字段
passwdcolumn=password 当作用户名字段的密码
crypt=2 密码的加密方式为mysql password()函数加密
crypt是加密方式,0表示不加密,1表示crypt(3)加密,2表示 使用mysql password()函数加密,3表示md5加密,4表示 sha1加密
5.建立虚拟用户所对应(映射)的系统用户
useradd -s /sbin/nologin -d /var/ftproot vuser
chown root.root /var/ftproot
cd /var/ftproot/
mkdir data
chown vuser.vuser data/ -R
6.修改vsftpd.conf
vim /etc/vsftpd/vsftpd.conf
force_local_data_ssl=NO
force_local_logins_ssl=NO 不经过ssl加密;上面遗留问题
guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd.mysql
listen=YES
注:虚拟用户在配置文件中的指令都是由匿名用户的指令来设置的,因此想设置虚拟用户的上传下载等权限时,就须要经过设置匿名用户的指令来赋予相关的权限;
7.定义不一样的虚拟用户使用不一样的权限
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_dir
mkdir /etc/vsftpd/vusers_dir
cd /etc/vsftpd/vusers_dir
touch tony
touch peter
vim tony
anon_umake=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
vim peter
anon_upload_enable=NO
tony就能够在/var/ftproot/data中上传和建立目录了,而peter不具备上传权限;
基于文件的虚拟用户:
咱们能够建立一个文件:/etc/vsftpd/vusers,奇数行为用户名,偶数行为密码;而后将这个文件转换成二进制格式的文件(使用db_load工具,由db4-utils提供);
例子:
1.创建虚拟用户的账号数据库文件
cd /etc/vsftpd/
vim vusers.list
good
123
db_load -T -t hash -f vusers.list vusers.db
chmod 600 vusers.db
2.建立ftp根目录以及虚拟用户映射的系统账号
useradd -s /sbin/nologin virtual
chmod 755 /home/virtual/ -R
3.创建支持虚拟用户的pam认证文件
vim /etc/pam.d/vsftpd.vu
4.在vsftpd.con中添加相应配置
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES/NO
guest_enable=YES
guest_username=virtual
5.为个别虚拟用户创建独立的配置文件
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_home
mkdir /etc/vsftpd/vusers_home
vim good
anon_mkdir_write_enable=YES
anon_upload_enable=YES
6.从新记载vsfptd的配置文件
service vsftpd restart
因为vsftpd对于用户的认证是基于pam模块来实现的,因此咱们必须去配置pam的配置文件,明确告诉pam咱们要使用虚拟用户这个功能;
FTP的典型消息:
在使用ftp客户端程序与ftp服务器进行通讯时,常常会看见一些有ftp服务器发送的消息,这些消息是ftp所定义的;
消息号:
125:数据链接打开,传输开始;
200:命令 OK;
226:数据传输完毕;
331:用户名 OK;
425:不能打开数据链接;
426:数据链接关闭,传输被中断;
452:错误写文件;
500:数据语法,不可识别的命令;
注:根据马哥视频作的学习笔记,若有错误欢迎指正;侵删
借鉴文章:鸟哥的linux私房菜-服务器篇以及
https://blog.csdn.net/wangyj_bk/article/details/78248263html