FTP: File Transfer Protocol
应用层协议:TCP (传输时就要借助传输层、IP层 、以太网帧来通信),监听于21号端口
物理通信由链路来实现、IP报文逻辑由IP来实现、TCP实现端到端就是所谓的进程到进程之间地址的构建,跨主机通信借助socket通信
端口监听:刚开始工作时是监听在21端口,由于ftp协议比http协议复杂(http报文只有两种格式、FTP有上传下载,创建目录、删除文件、改变文件权限等)所以ftp协议在它的连接上传输两类数据(控制命令、传输数据)
C/S架构:Client端、Server端
数据:
命令连接:文件管理类命令:(专门用来传输命令并且响应命令是否正常执行)
命令连接是一直存在的
数据连接:数据传输
数据连接是按需建立和关闭
数据传出格式:根据文件类型进行选择
文本传输
二进制传输
上面说了在进行文件传输时会重新创建一个连接来传输文件,那么这时候是谁来发起创建这个连接?所以这时候就分主动连接和被动连接了(站在服务器角度来说的主被动)
主动:由服务器端创建
命令连接:客户端选择一个随机端口连接服务器上的21端口
数据连接:服务器使用20端口去连接客户端上的50000+1的端口(如果50000+1占用了则再加1直到没有被占用)
注:20端口仅仅是一个负责建立连接的端口,真正传输数据的是一个随机端口,想想也很好明白,都通过20端口传输文件那么这个端口在被占用了其他人怎么用FTP传输数据呢?
(有没有发现在此种情况下服务器端可以很简单的就打开客户端并且传送数据给客户端?如果这个被精心构造下是不是一个安全漏洞呢?)
被动:由客户端创建
命令连接:客户端选择一个随机端口连接服务器上的21端口
数据连接:客户端主动通知服务器然后服务器开启一个进程此进程将会监听在一个随机端口上并把这个随机端口通过命令连接告诉客户端,从而实现客户端使用自己的50000+1(如果50000+1占用了则再加1直到没有被占用)端口来连接服务器上这个新开的随机端口(小常识,这里服务器通知客户端随机端口也很好玩,以下图的167,114,244,204,114,211来说前面4组是IP后面2组是端口,真实端口就是114*256+211=29395)
客户端/服务端:C/S
服务端:
wu-ftpd (华盛顿大学研发)、proftpd (名字的含义:专业的FTP)、pureftp (名字的含义:纯粹的FTP)、vsftpd (名字的含义:超级安全的FTP)、ServU (Windows平台著名的FTP)
客户端:
ftp、lftp、lftpget、wget、curl、gftp(Linux上的图形化ftp)、filezilla、FlashFXP、cuteftp等
响应码:
1xx:纯粹的信息码
2xx:成功类的状态码
3xx:提示需要进一步提供补充信息的状态码
4xx:客户端错误
5xx:服务端错误
用户认证:(由于FTP服务诞生的很早而且涉及系统上的文件权限等问题,开始的时候FTP服务用户认证使用的是系统帐户,默认FTP用的也是系统帐户做用户认证)
虚拟用户:所谓的虚拟用户就是仅用于访问某特定服务中的资源
虚拟用户访问ftp资源是指定的映射成为系统用户的家目录
nsswitch:network service switch名称解析框架
配置文件:/etc/nsswitch.conf
模块位置:/lib64(lib)/libnss*、/usr/lib64(lib)/libnss*
pam:pluggable authentiction module 插入式认证模块 用户认证框架(SUN公司研发)
配置文件:/etc/pam.conf、/etc/pam.d/*
模块位置:/lib64(lib)/security/
上面两种认证框架是Linux/Unix上独有的认证框架
系统用户:
系统用户访问的ftp资源位置是用户自己的家目录
匿名用户:其实匿名用户还是可以看做成一个系统用户,因为匿名用户所在的程序,这个程序运行的时候是一个系统用户,如果这个系统用户所没有的权限那么这个匿名用户也肯定没有这个权限,这是一种映射关系。
匿名用户访问的ftp资源位置是/var/ftp
vsFTPD:
1、 vsftpd的安装
[root@Legion100 ~]# yum install vsftpd -y 查看安装后生成的文件 [root@Legion100 ~]# rpm -ql vsftpd /etc/logrotate.d/vsftpd #实现日志滚动的程序 /etc/pam.d/vsftpd #pam的用户认证文件 /etc/rc.d/init.d/vsftpd #服务脚本 /etc/vsftpd #配置文件目录 /etc/vsftpd/ftpusers #用户控制配置文件 /etc/vsftpd/user_list #用户控制配置文件 /etc/vsftpd/vsftpd.conf #主配置文件 /etc/vsftpd/vsftpd_conf_migrate.sh /usr/sbin/vsftpd #主应用程序 /usr/share/doc/vsftpd-2.2.2 /usr/share/doc/vsftpd-2.2.2/AUDIT /usr/share/doc/vsftpd-2.2.2/BENCHMARKS /usr/share/doc/vsftpd-2.2.2/BUGS /usr/share/doc/vsftpd-2.2.2/COPYING /usr/share/doc/vsftpd-2.2.2/Changelog /usr/share/doc/vsftpd-2.2.2/EXAMPLE /usr/share/doc/vsftpd-2.2.2/EXAMPLE/INTERNET_SITE /usr/share/doc/vsftpd-2.2.2/EXAMPLE/INTERNET_SITE/README /usr/share/doc/vsftpd-2.2.2/EXAMPLE/INTERNET_SITE/README.configuration /usr/share/doc/vsftpd-2.2.2/EXAMPLE/INTERNET_SITE/vsftpd.conf /usr/share/doc/vsftpd-2.2.2/EXAMPLE/INTERNET_SITE/vsftpd.xinetd /usr/share/doc/vsftpd-2.2.2/EXAMPLE/INTERNET_SITE_NOINETD /usr/share/doc/vsftpd-2.2.2/EXAMPLE/INTERNET_SITE_NOINETD/README /usr/share/doc/vsftpd-2.2.2/EXAMPLE/INTERNET_SITE_NOINETD/README.configuration /usr/share/doc/vsftpd-2.2.2/EXAMPLE/INTERNET_SITE_NOINETD/vsftpd.conf /usr/share/doc/vsftpd-2.2.2/EXAMPLE/PER_IP_CONFIG /usr/share/doc/vsftpd-2.2.2/EXAMPLE/PER_IP_CONFIG/README /usr/share/doc/vsftpd-2.2.2/EXAMPLE/PER_IP_CONFIG/README.configuration /usr/share/doc/vsftpd-2.2.2/EXAMPLE/PER_IP_CONFIG/hosts.allow /usr/share/doc/vsftpd-2.2.2/EXAMPLE/README /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_HOSTS /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_HOSTS/README /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS/README /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS/README.configuration /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS/logins.txt /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS/vsftpd.conf /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS/vsftpd.pam /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS_2 /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS_2/README /usr/share/doc/vsftpd-2.2.2/FAQ /usr/share/doc/vsftpd-2.2.2/INSTALL /usr/share/doc/vsftpd-2.2.2/LICENSE /usr/share/doc/vsftpd-2.2.2/README /usr/share/doc/vsftpd-2.2.2/README.security /usr/share/doc/vsftpd-2.2.2/REWARD /usr/share/doc/vsftpd-2.2.2/SECURITY /usr/share/doc/vsftpd-2.2.2/SECURITY/DESIGN /usr/share/doc/vsftpd-2.2.2/SECURITY/IMPLEMENTATION /usr/share/doc/vsftpd-2.2.2/SECURITY/OVERVIEW /usr/share/doc/vsftpd-2.2.2/SECURITY/TRUST /usr/share/doc/vsftpd-2.2.2/SIZE /usr/share/doc/vsftpd-2.2.2/SPEED /usr/share/doc/vsftpd-2.2.2/TODO /usr/share/doc/vsftpd-2.2.2/TUNING /usr/share/doc/vsftpd-2.2.2/vsftpd.xinetd /usr/share/man/man5/vsftpd.conf.5.gz /usr/share/man/man8/vsftpd.8.gz /var/ftp #匿名用户共享资源文件 /var/ftp/pub [root@Legion100 ~]#
2启动vsftpd
[root@Legion100 ~]# service vsftpd start 为 vsftpd 启动 vsftpd: [确定] [root@Legion100 ~]# netstat -tnlp | grep 21 tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 43011/vsftpd [root@Legion100 ~]#
3、测试ftp连接
Windows 下的ftp命令
Microsoft Windows [版本 6.3.9600] (c) 2013 Microsoft Corporation。保留所有权利。 C:\Users\Administrator>ftp 172.16.6.100 连接到 172.16.6.100。 220 (vsFTPd 2.2.2) 用户(172.16.6.100:(none)): ftp #这里用的是匿名用户 帐号ftp 密码直接回车就可以 331 Please specify the password. 密码: 230 Login successful. ftp>
[root@Legion101 ~]# ftp 172.16.6.100 Connected to 172.16.6.100 (172.16.6.100). 220 (vsFTPd 2.2.2) Name (172.16.6.100:root): ftp #匿名用户登录 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> bye 221 Goodbye. [root@Legion101 ~]#
4、配置详解
[root@Legion100 ~]# cd /etc/vsftpd/ [root@Legion100 /etc/vsftpd]# ls -l 总用量 20 -rw------- 1 root root 125 10月 18 2014 ftpusers -rw------- 1 root root 361 10月 18 2014 user_list -rw------- 1 root root 4599 10月 18 2014 vsftpd.conf -rwxr--r-- 1 root root 338 10月 18 2014 vsftpd_conf_migrate.sh [root@Legion100 /etc/vsftpd]# cp vsftpd.conf vsftpd.conf_`date "+%F"` [root@Legion100 /etc/vsftpd]# ls -l 总用量 28 -rw------- 1 root root 125 10月 18 2014 ftpusers -rw------- 1 root root 361 10月 18 2014 user_list -rw------- 1 root root 4599 10月 18 2014 vsftpd.conf -rw------- 1 root root 4599 6月 2 23:52 vsftpd.conf_2015-06-02 -rwxr--r-- 1 root root 338 10月 18 2014 vsftpd_conf_migrate.sh
1)、匿名用户配置
[root@Legion100 /etc/vsftpd]# grep -v '^#' vsftpd.conf # 所有#号开头后面跟空格的行都是注释 # 所有#号开头没有跟空的都是可以启用的配置选项 # 所有没有#号开头的行都是生效的配置行 # 针对vsftpd来说所有的生效配置选项前不可以有任意空白字符,否则配置不生效, # 但是不会保存,也就是说你启动的时候无法启动 # ================================================ anonymous_enable=YES # 是否启用匿名用户 YES表示启用 write_enable=YES local_umask=022 anon_upload_enable=YES # 是否启用匿名用户上传权限 anon_mkdir_write_enable=YES # 是否启用匿名用户创建目录权限 anon_other_write_enable=YES # 是否启用匿名用户其他的创建目录权限 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES [root@Legion100 /etc/vsftpd]# service vsftpd reload 关闭 vsftpd: [确定] 为 vsftpd 启动 vsftpd: [确定] [root@Legion100 /etc/vsftpd]# mkdir -p /var/ftp/Legion_ftp_anon_test [root@Legion100 /etc/vsftpd]# setfacl -m u:ftp:rwx /var/ftp/Legion_ftp_anon_test [root@Legion100 /etc/vsftpd]# getfacl /var/ftp/Legion_ftp_anon_test getfacl: Removing leading '/' from absolute path names # file: var/ftp/Legion_ftp_anon_test # owner: root # group: root user::rwx user:ftp:rwx group::r-x mask::rwx other::r-x [root@Legion100 /etc/vsftpd]#
2)、系统用户配置
[root@Legion100 /etc/vsftpd]# grep -v '^#' vsftpd.conf local_enable=YES # 是否启用本地用户 YES表示启用 write_enable=YES # 是否启用本地用户上传权限 local_umask=022 # 本地用上传文件的默认权限 022是644(和系统umask无关) chroot_local_user=YES # 将本地用户锁定在用户的家目录 #chroot_list_enable=YES #chroot_list_file=/etc/vsftpd/chroot_list # 上面两项是同时使用的,锁定指定文件列表中的用户在自己的家目录,需要同时启用才可以 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES
添加一个本地用户
[root@Legion100 /etc/vsftpd]# service vsftpd reload 关闭 vsftpd: [确定] 为 vsftpd 启动 vsftpd: [确定] [root@Legion100 /etc/vsftpd]# useradd Legion [root@Legion100 /etc/vsftpd]# passwd Legion 更改用户 Legion 的密码 。 新的 密码: 重新输入新的 密码: passwd: 所有的身份验证令牌已经成功更新。 [root@Legion100 /etc/vsftpd]# id Legion uid=500(Legion) gid=500(Legion) 组=500(Legion) [root@Legion100 /etc/vsftpd]# finger Legion Login: Legion Name: Directory: /home/Legion Shell: /bin/bash Never logged in. No mail. No Plan. [root@Legion100 /etc/vsftpd]#
3)、虚拟用户
所有虚拟用户会被统一映射为一个指定的系统帐号,放资源共享位置就是这个系统帐号的家目录
各虚拟用可被赋予不同的访问权限:
通过匿名用户的权限控制参数进行指定的:
虚拟用户帐号的存储方式:
文本文件:(奇数行为用户名,奇数行+1的对应行为密码,需要编码为哈希格式才可使用)
关系型数据库的表:
具体的vsftpd基于虚拟用户配置方式将在下一篇博文说
4)、配置详解
[root@Legion100 /etc/vsftpd]# grep -v '^#\s.*' vsftpd.conf #所有#号开头后面跟空格的行都是注释 #所有#号开头没有跟空的都是可以启用的配置选项 #所有没有#号开头的行都是生效的配置行 #针对vsftpd来说所有的生效配置选项前不可以有任意空白字符,否则配置不生效, #但是不会保存,也就是说你启动的时候无法启动 # #anonymous_enable=YES #是否启用匿名用户 YES表示启用 # local_enable=YES #是否启用系统用户 YES表示启用 # write_enable=YES #本地用户是否有写权限 # local_umask=022 #本地用上传文件的默认权限 022是644 # #anon_upload_enable=YES #是否启用匿名用户上传权限 # #anon_mkdir_write_enable=YES #是否启用匿名用户创建目录权限 # #anon_other_write_enable=YES #是否启用匿名用户其他的创建目录权限 # dirmessage_enable=YES #目录消息是否启用 # xferlog_enable=YES #是否开启传输日志 # connect_from_port_20=YES #允许服务器主动模式(从20端口建立数据连接) # #chown_uploads=YES #是否改变上传文件的属主 #chown_username=whoever #将属主改为whoever # xferlog_file=/var/log/xferlog #指定日志文件 # xferlog_std_format=YES #传输日志是否使用标准格式 # #idle_session_timeout=600 #会话的空闲时长 # #data_connection_timeout=120 #数据连接超时时长 # #nopriv_user=ftpsecure #当服务器运行于最底层时使用的用户名 # #async_abor_enable=YES #允许使用"async ABOR"命令,一般不用,容易出问题 # #ascii_upload_enable=YES #ascii_download_enable=YES #强制上传下载使用文本模式 # #ftpd_banner=Welcome to blah FTP service. #欢迎信息 # #deny_email_enable=YES #是否启用匿名用户密码登陆,那么使用banned_email_file里面的电子邮件地址的用户不能登录 #banned_email_file=/etc/vsftpd/banned_emails #禁止使用匿名用户登陆时作为密码的电子邮件地址 chroot_local_user=YES #将本地用户锁定在用户的家目录 #chroot_list_enable=YES #chroot_list_file=/etc/vsftpd/chroot_list #上面两项是同时使用的,锁定指定文件列表中的用户在自己的家目录 # #ls_recurse_enable=YES #是否能使用ls -R命令,以防止浪费大量的服务器资源 listen=YES #是否以独立运行的方式监听服务 #listen_ipv6=YES #是否启用IPV6 pam_service_name=vsftpd #pam认证用到的文件,设置用于用户认证的PAM文件位置 userlist_enable=YES #是否启用登录的列表文件 userlist_file=/etc/vsftpd/user_list #用户登录列表,默认文件是/etc/vsftpd/user_list userlist_deny=YES #当userlist_deny=YES时上面的列表就是个黑名单,拒绝出现在上面列表中的用户登录 #当userlist_deny=NO时上面的列表就是个白名单,不出现在上面文件列表中的用户都不能登录 # tcp_wrappers=YES #是否启用tcp_wrappers机制 max_clients=0 #最大并发连接数,0为无限制 max_per_ip=0 #每个IP可同时发起的并发请求,0为无限制 anon_max_rate=00为无限制 #匿名用户的最大传输速率,单位是"字节/秒" local_max_rate=2048000 #本地用户的最多传输速率,单位是"字节/秒",2048000就是限速2M/s reverse_lookup_enable=NO #是否启用域名反解,NO是不启用 #PASV_enable=YES #是否开启被动模式YES是开启 #PASV_min_port=%number% #被动模式最低端口 #PASV_max_port=%number% #被动模式最高端口 #ssl_enable=yes/no #是否启用 SSL,默认为no #allow_anon_ssl=yes/no #是否允许匿名用户使用SSL,默认为no #rsa_cert_file=/path/to/file #rsa证书的位置 #dsa_cert_file=/path/to/file #dsa证书的位置 #force_local_logins_ssl=yes/no #非匿名用户登陆时是否加密,默认为yes #force_local_data_ssl=yes/no #非匿名用户传输数据时是否加密,默认为yes #force_anon_logins_ssl=yes/no #匿名用户登录时是否加密,默认为no #force_anon_data_ssl=yes/no #匿名用户数据传输时是否加密,默认为no #ssl_sslv2=yes/no #是否激活sslv2加密,默认no #ssl_sslv3=yes/no #是否激活sslv3加密,默认no #ssl_tlsv1=yes/no #是否激活tls v1加密,默认yes #ssl_ciphers=加密方法 #默认是DES-CBC3-SHA
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏