FTP    成本低,跨平台


文件传输协议

 windows下的服务端serv-U         
 客户端 cuteftp    leapftp   flashftp   浏览器(IE,firefox)


 一个很老的文件传输协议,明码传输,不安全

网页维护有很多是用ftp去更新网站页面内容
dreamweaver   

 

还有一个协议不要搞混乱了
tftp  Trivial File Transfer Protocol 简单文件传输协议


[root@dns ~]# rpm -qi vsftpd-2.0.5-16.el5

Summary     : vsftpd - Very Secure Ftp Daemon
Description :
vsftpd is a Very Secure FTP daemon. It was written completely from
scratch.


[root@dns ~]# yum install vsftpd -y


vsftp         very secure ftp


另一种开源的ftp软件proftp,wuftp

 proftp +  Berkeley DB  (把ftp账号存放在数据库,而不是使用系统用户) 

 

使用的端口号:
 数据传输端口 20
 命令传输端口 21


  主动:默认情况下,ftp服务是开放了21端口,用来接受控制命令,服务器用20端口去发送数据(连接客户端大于1024的随机端口)

  被动:ftp服务也是开放21端口,用来接受命令控制,进行数据传输时,客户端会告知服务端打开一个大于1024的端口,然后客户端去主动连接服务


主动:
  server   client

   20         21   n n+1 
   <-------------  
      
   -------------->

    ----------------------------------------> 

    <---------------------------------------

 

 被动:
  server   client
 随机端口      21   n n+1
          <---------------

   ---------------->

 <--------------------------------------------         
 --------------------------------------------->

 

 主动模式:建立数据链路时由sever端去主动连接客户端的大于1024的随机端口
 被动模式:建立数据链路时由client端去主动连服务端的随机端口

主动ftp对ftp服务器的管理有利,但对客户端的管理不利。因为是服务端主动与客户端去建立连接,可能会被客户端的防火墙给阻塞掉

被动ftp对ftp客户端的管理有利,但对服务端的管理不利。因为客户端主动与服务端去连,可能会被服务端的防火墙给阻塞掉

折衷的方法就是使用被动模式,并指定一个连接过来的端口范围,可以针对这个范围的端口进行一个防火墙的设置。 --(到iptables课程会介绍)


包过滤防火墙  一般对src IP, dst IP ,src port ,dst port 等相关的参数来进行控制

 

[root@li ~]# yum install vsftpd  -y

服务运行也有两种模式
 stand  alone
 super  daemon


[root@li ~]# vim /etc/vsftpd/vsftpd.conf  --主配置文件

   man vsftpd.conf --查看配置帮助


/etc/init.d/vsftpd start


[root@li ~]# netstat -ntl |grep 21 --现在是只能看到监听21端口
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN   


验证主动模式:

[root@li ~]# ftp 10.1.1.45 --自己做客户端,连接自己的服务端
Connected to 10.1.1.45.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (10.1.1.45:root): ftp --匿名用户ftp
331 Please specify the password.
Password:  --它的密码也是ftp
230 Login successful.
ftp> ?  --使用?号可以查看能使用哪些命令
ftp> help passive --help+命令可以查看命令的帮助
passive         toggle passive transfer mode
ftp> passive  --使用passive命令关闭被动模式
Passive mode off.
ftp> ls  --建立数据链路
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x    2 0        0            4096 May 13  2009 pub
226 Directory send OK.

在第二个终端验证
[root@li ~]# netstat -nt |grep TIME_ --可以看到是服务端的20端口去连客户端的大于1024的随机端口
tcp        0      0 10.1.1.45:20                10.1.1.45:56227             TIME_WAIT  

 

验证被动模式

[root@li ~]# telnet 10.1.1.45 21
Trying 10.1.1.45...
Connected to li.cluster.com (10.1.1.45).
Escape character is '^]'.
220 (vsFTPd 2.0.5)
USER ftp
331 Please specify the password.
PASS
230 Login successful.
PASV
227 Entering Passive Mode (10,1,1,45,243,212)

 

第二个终端
[root@li ~]# netstat -ntlup  |grep vsftpd
tcp        0      0 10.1.1.45:45716             0.0.0.0:*                   LISTEN      2867/vsftpd    

 


=============================================================
配置文件参数说明:
[root@li ~]# cat  /etc/vsftpd/vsftpd.conf  |grep -v ^# |grep -v ^$
--  ^#代表以#开头的行,也就是注释;  ^$代表空行
anonymous_enable=YES --允许匿名用户登录
local_enable=YES --允许本地用户登录
write_enable=YES --允许本地用户登录后可写
local_umask=022  --建立文件或者目录的权限掩码
dirmessage_enable=YES --启用目录的说明或者欢迎信息
xferlog_enable=YES --打开日志功能 (只记录文件的上传和下载信息)
connect_from_port_20=YES  --默认为主动模式 
xferlog_std_format=YES --日志采用标准的格式
listen=YES  --默认运行在stand alone下
pam_service_name=vsftpd --支持pam(可植入模块)
userlist_enable=YES --打开用户列表的功能
tcp_wrappers=YES --支持tcp_wrappers

 

==================================================================
配置实例:

 匿名用户有两个    ftp   密码为ftp
   anonymous   密码为空

 

例一:不允许匿名用户登录

  anonymous_enable=NO --改为no

 /etc/init.d/vsftpd   reload

 使用匿名用户登录测试,发现登录不了

 

例二:匿名用户的下载


 anonymous_enable=YES --改回yes
     

 默认使用匿名用户登录的服务端的/var/ftp目录下,因为/etc/passwd里的ftp用户的家目录就是/var/ftp,所以其实就是登录到它的家目录

 匿名用户默认是可以登录,也可以下载,因为/var/ftp是755权限

 能读表示能下载,能写表示能上传

 chmod 750  /var/ftp后使用匿名用户登录,ls都看不到文件列表,也下载不了

 chmod 754  /var/ftp后使用匿名用户登录,ls都看不到文件列表,也下载不了,因为不能cd到/var/ftp

 chmod 751  /var/ftp后使用匿名用户登录,ls都看不到文件列表,但是可以下载;因为它能cd到/var/ftp,ls虽然看不到,但get 文件名,是可以下载下来的

 还要注意文件的权限对其是否能被下载也有关系,要登录用户对其有r权限,才可以下载

--任何服务的权限控制是要经过两道门的,一个是服务本身的权限控制,一个是操作系统的权限控制,也就是说两个都允许,才有权限;如果有防火墙的话,则还要考虑防火墙的控制

 

例三:匿名用户的上传


默认是不允许匿名用户上传的
ftp> put 1
local: 1 remote: 1
227 Entering Passive Mode (10,1,1,45,135,67)
550 Permission denied. --权限拒绝,因为/var/ftp不允许ftp用户写


 chmod 777 /var/ftp

Name (10.1.1.45:root): ftp
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable anonymous root
Login failed.   --/var/ftp被改为777后,发现登录不了,所以还得改回去755

 --因为ftp服务本身不允许系统权限给匿名写,所以解决方法是在登录目录,再去创建一个用于上传的目录,给一个写权限

 chmod 755 /var/ftp
 chmod 777 /var/ftp/pub   --把pub改为可写,用于上传

ftp> cd pub
250 Directory successfully changed.
ftp> put 1
local: 1 remote: 1
227 Entering Passive Mode (10,1,1,45,232,229)
550 Permission denied. --但还是权限拒绝

 --因为系统权限允许了,但是服务本身的权限还是不允许,所以要去改服务的配置参数 
anonymous_enable=YES
anon_upload_enable=YES  --允许匿名用户上传文件
anon_mkdir_write_enable=YES --允许匿名用户创建目录

 

使客户端匿名用户登录后可以删除文件和重命名文件 (man vsftpd.conf)

 anon_other_write_enable=yes --加上此参数,再重启服务;但不建议使用此参数,太不安全了

 

例四: 允许匿名下载刚上传的文件

为什么默认不允许下载自己上传的文件?
文件上传之后权限自动改为600,而ftp帐号(在客户端属于其它用户,所以看other位是否有r权限)对于600权限文件是没有权限下载

-rw-------    1 14       50            845 Jul 19 06:12 fstab   不可以
-rw-r--r--    1 0        0            1666 Jul 19 06:13 inittab 可以

方法一:让匿名帐号上传的文件权限自动更改为644的权限
man vsftpd.conf
 anon_umask=022
 如果文件的权限是444 ,umask怎么设定?
 anon_umask=0222


方法二:允许匿名帐号下载不是所有人都可以读的文件

anon_world_readable_only=NO  <---默认是yes,只允许下载所有人都可以读的文件

 

 

例五:关于普通用户的登录

 普通用户默认是允许登录ftp的,并且是登录到自己的家目录,登录密码也就是普通用户登录系统的密码


 禁止普通用户登录
方法一: local_enable=NO  --建议使用服务的参数去禁止,但是这里会把所有的普通用户给禁止掉,要实现特定的用户的控制


方法二:/etc/passwd 里把普通用户最后一列,改为/bin/false

/bin/bash    --可以登录系统,也可以登录ftp,也可以收邮件
/sbin/nologin  --不可以登录系统,但可以登录ftp,也可以收邮件
/bin/false    --又不可以登录系统,又不可以登录ftp,也可以收邮件

 


例六:使用用户列表来控制  --建议使用这种方式

 userlist_enable=yes --打开用户列表功能

 userlist_deny=YES   --这一句可加可不加,默认就是有这一句的

 vim /etc/vsftpd/user_list --加上要禁止的用户,一个用户写一行

黑名单


--------------

 userlist_enable=yes
 
 userlist_deny=no

 vim /etc/vsftpd/user_list  --加上允许的用户,一个用户写一行

白名单

--上面的主要要注意的是:
  userlist_enable  指定的是用户列表功能是否有效
  userlit_deny 指定的是用户列表是允许还是拒绝

 


--pam默认也把root和一些系统用户(uid小于500的)给禁用了。
  vim /etc/vsftpd/ftpusers

--如果把/etc/pam.d/vsftpd文件中第二行的sense=deny改为allow,则表示/etc/vsftpd/ftpusers文件里的用户pam是允许登录的


--如果允许root用户登录ftp,则要/etc/vsftpd/user_list和/etc/vsftpd/ftpusers都不要禁用root登录ftp就可以了。但为了安全,不会这样去开放root用户的

 

例七:关于普通用户的下载和上传

 默认是允许下载和上传的

 允许上传除了系统目录有写权限外,还是服务的参数write_enable=YES决定的

 


例八:关于chroot(笼环境,jail监牢) --为了增强安全性,把用户活动范围锁定到登录的目录里


默认情况下,普通用户(匿名用户除外)可以登录ftp后,cd切换到/下的任何地方,只要有r权限,就可以get文件,那么显示是不安全的

 chroot_list_enable=YES

 chroot_list_file=/etc/vsftpd/chroot_list


 vim /etc/vsftpd/chroot_list  --手动创建这个文件,默认不存在,并写上要加入笼环境的用户名,一行写一个


 /etc/init.d/vsftpd reload

测试发现,有笼环境的用户ftp登录后,cd .. 还是在它的登录目录,出不去了

 


练习:如何把所有的用户加入到jail环境
 chroot_local_user=yes 
 

练习:所有的本地用户(非匿名用户)登录后,都统一登录到/share/110620目录下
 local_root=/share/110410

 

例九:登录时显示目录信息
 
 1,针对各个用户的消息显示:
  dirmessage_enable=YES

  vim /home/a/.message --写上关于此用户登录的说明信息或者欢迎信息

 使用a用户登录,就会显示刚才写的信息,但使用别的用户不会显示

 2,针对全局的消息显示

 方法一:
ftpd_banner=Welcome to my ftp server ,this is for students of uplook
ing!!

[root@li test]# ftp 10.1.1.45
Connected to 10.1.1.45.
220 Welcome to my ftp server ,this is for students of uplooking!! --在这里就会显示信息
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (10.1.1.45:root):

 方法二:
 把消息直接写到一个文件里

 banner_file=/var/banner   --手动写一个文件,并写上消息

[root@li test]# ftp 10.1.1.45
Connected to 10.1.1.45.
220-@@@@@@@@@@@@@@@@@@
220-@           @
220-@   @_@     @
220-@           @
220-@@@@@@@@@@@@@@@@@
220
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (10.1.1.45:root):

 

 

例十: ftp的日志 
  xferlog_enable=YES --打开日志记录功能
  xferlog_std_format=YES --使用标准日志格式
  xferlog_file=/var/log/xferlog --打开注释,指定日志文件路径

 /etc/init.d/vsftpd   reload


 cat /var/log/xferlog --只记录上传和下载的日志
Tue May  3 06:24:57 2011 1 10.1.1.185 660 /etc/fstab b _ o r a ftp 0 * c
Tue May  3 06:30:21 2011 1 10.1.1.185 0 /root b _ o r a ftp 0 * i
Tue May  3 06:36:09 2011 1 10.1.1.132 2322 /etc/passwd b _ o r a ftp 0 * c
Tue May  3 06:36:12 2011 1 10.1.1.132 660 /etc/fstab b _ o r a ftp 0 * c
Tue May  3 06:36:24 2011 1 10.1.1.132 0 /etc/fstab b _ i r a ftp 0 * i
Tue May  3 06:40:58 2011 1 10.1.1.86 0 /etc/passwd b _ i r a ftp 0 * i

 

以下面这条为例:
Tue May  3 06:40:58 2011 1 10.1.1.86 0 /etc/passwd b _ i r a ftp 0 * i

Tue May  3 06:40:58 2011 current-time访问时间
1   transfer-time传输时间,花费了多久
10.1.1.86  remote-host 远程操作的主机名或IP地址
0   byte-count   传输大小
/etc/passwd  filename     操作的文件
b   transfer-type    a表示ascii传输   b表示binary传输
_   special-action-flag
       _   no action was taken
       C the file was compressed (not in use)
       U   the file was uncompressed (not is use)
       T   the file was tar'ed (not is use)
i   direction 方向
    i   the incoming transfer
    o   the outgoing transfer
r   access-mode 访问模式
      a (anonymous) the anonymous guest user
      g (guest)  the real but chrooted user
      r (real)  the real user
a   username 用户名
ftp   service-name    服务名
0   authentication-method  验证类型
     0 none
     1  RFC931 authentication (not in use)
*   authenticated-user-id 
   * symbol is used if an authenticated user id is not available
i   completion-status
    c  a complete transfer
    i  an incomplete transfer 


例十一:

1,关于下载限速


anon_max_rate --匿名用户下载传输率

local_max_rate --本地用户下载传输率

  local_max_rate=10000   下载传输率为10k

  /etc/init.d/vsftpd reload


 然后使用一个普通用户登录,去下载一个较大点的文件做测试


关于限制链接数的
max_clients --ftp服务允许的总的连接数

max_per_ip --单个客户端的最大连接数

  
  max_per_ip=2   --指定单个客户端的最大连接数为2

  /etc/init.d/vsftpd  reload

  测试,使用一个客户端去连接ftp服务器,第三次连接就会报下面的错误  
[root@li ftp]# ftp 10.1.1.45
Connected to 10.1.1.45.
421 There are too many connections from your internet address.

 

例十二:ftp支持tcp_wrapper


[root@li test]# ldd /usr/sbin/vsftpd |grep wrap
  libwrap.so.0 => /lib/libwrap.so.0 (0x004f9000)--查找有支持的模块

 vim /etc/vsftpd/vsftpd.conf
  tcp_wrappers=YES --ftp配置文件里要打开tcp_wrapper的支持

vim /etc/hosts.deny   
vsftpd:10.1.1.0/255.255.255.0 EXCEPT 10.1.1.45 --拒绝10.1.1网段,只允许10.1.1.45登录ftp

vsftpd:2.2.2.30:spawn wall "you have denied by tcp_wrap! @_@"

 

例十三:vsftpd托管super daemon
[root@li ule]# netstat -ntlup |grep 21
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      3460/vsftpd


[root@li ule]# vim /etc/xinetd.d/vsftp

service ftp
{
        socket_type             = stream
        protocol                = tcp
        wait                    = no
        user                    = root
        server                  = /usr/sbin/vsftpd
        disable                 = no
}

/etc/init.d/vsftpd  stop

/etc/init.d/xinetd restart


[root@li ule]# netstat -ntlup |grep 21 
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      3486/xinetd     --由xinetd托管
   
[root@li ule]# ftp 10.1.1.35 --但是登录失败
Connected to 10.1.1.35.
421 Service not available, remote server has closed connection
ftp>

[root@li ule]# vim /etc/vsftpd/vsftpd.conf
listen=NO  --要改为no


[root@li ule]# /etc/init.d/xinetd restart

ftp 10.1.1.35 --再次访问OK

 

例十四:
被动模式

vim /etc/vsftpd/vsftpd.conf
在最后加上
pasv_enable=YES
pasv_min_port=3000
pasv_max_port=3100  --最小端口范围和最大端口范围可以自定义

--然后使用ftp 登录后,输入ls使之有数据传输,netstat -nt去验证查看会发现端口一定会在3000到3100范围内


===========================================================


linux下ftp客户端工具介绍:


ftp   不太好用,没有命令记录功能,也没有自动补全功能

 

 

lftp,是一个功能强大的客户端工具,它支持的协议有ftp,http,https等
 它相对文本模式下的ftp,有历史记录功能,自动补齐功能,通配符,下载目录等功能,非常方便。

 

[root@li b]# lftp 10.1.1.35  --默认以匿名用户登录
[root@li b]# lftp -u b 10.1.1.35  --指定以b用户来登录


lftp b@10.1.1.35:~> mget *b  --批量下载以b字母结尾的文件
2457 bytes transferred
Total 3 files transferred


lftp b@10.1.1.35:~> mirror aaa  --下载目录aaa

 

 图形化的ftp客户端工具   gftp


[root@li b]# yum list |grep gftp
This system is not registered with RHN.
RHN support will be disabled.
gftp.i386                               1:2.0.18-3.2.2            installed


安装后用gftp命令启动  --注意使用ftp的话端口填21

 

=============================================================

 

NTP  network time protocol


rdate 内网同步,做起来速度快
ntp  可同步外网专有的时间同步服务,并且机制更复杂

 


时区的概念:
 GMT (格林威治时间 ,以经度为0的英国城市命名)
 UTC (coordinated universal time,协和标准时间,利用物理时钟(原子钟)为基准定义出来的时间)
 
 主板的bios是属于UTC时间,利用主机的原子钟来计算时间,会有少许误差,但对于长时间动作并对时间准确性要求高的环境是不允许有这样的误差

 ssh 10.1.1.218 date;date   --这样去比较两台电脑的时间差(先要配ssh等效性)
 15 15:26:36 CST 2010
 15 15:26:45 CST 2010   --时间差有9秒,这在集群环境里是不容许的

[root@li b]# file /etc/localtime  
/etc/localtime: timezone data --这是一个时区文件,不是ASCII类型,所以vi是看不了的,对应了/usr/share/zoneinfo/Asia/Shanghai这个文件(因为装系统时选的是上海时区)
 
 ls /usr/share/zoneinfo/     --这里保存了系统开机时所选的所有的时区文件


如果服务迁移到了另一个时区的地段,或者是迁移到另一个国家,系统如果没有重做,而且是用于集群环境,那么
第一步:/usr/share/zoneinfo/里对应的时区给拷到/etc/localtime,就换了时区了
第二步:vim /etc/sysconfig/clock去修改对应的新时区

 

同步的过程: (与tcp三次握手相似)
 1,client  发送信息到 server
 2,ntp server 发送回信息到 client
 3,client  根据回送信息修改时间


时间同步服务的阶层概念:
  可以把同步服务分层,(最多15个阶层)
  层与层会有时间误差,网络延迟的计算

 

[root@li b]# cat /etc/ntp.conf |grep -v ^# |grep -v ^$


restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
server 10.1.1.1 perfer  --指定上层的时间同步服务器为10.1.1.1,perfer表示优先
server 10.1.1.2
driftfile /var/lib/ntp/drift --记录本机与上层时间服务的频率误差
keys /etc/ntp/keys
server 127.127.1.0  --如果上层服务器不能连通,则以主板的BIOS(UTC)为准
fudge   127.127.1.0 stratum 10 --主板时间的层级为10

 ignore   拒绝所有ntp连接
 nomodify 不能改
 noquery 不能query
 notrap  trap是一个远端事件
 nopeer  不能peer
不加任何参数就代表都不限制


服务端的配置一(以本服务器为第一层):
1,把第一句的default改为127.0.0.1
2,把第三句restrict 127.0.0.1给注释掉,保存退出
3,重启服务

客户端的难证:
ntpdate   10.1.1.35   --大概五分钟后,才能同步,注意(客户端不能启动ntp服务)


服务端的配置二(以10.1.1.1为上层时间同步服务器);
1,先把上面修改的还原
2,加上下面两句,并保存退出
server 10.1.1.1
restrict 10.1.1.0 netmask 255.255.255.0  nomodify notrap
3,重启服务 --会监听udp的123端口

 

[root@li b]# ntpstat  --查看与上阶层的ntp服务是否连接上
unsynchronised
  time server re-starting
   polling server every 64 s

 

root@li b]# ntptrace -n 10.1.1.1 --查看与上阶层服务器的关系,time out,是上层与更上层之间的关系(这里不用管)
10.1.1.1: stratum 2, offset 0.001891, synch distance 0.278392
192.43.244.18: timed out, nothing received
***Request timed out

[root@li b]# ntpq -p --查询本层与上层间的一些参数
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 squid.cluster.c 192.43.244.18    2 u    3   64   77    0.192  4317162 1612852
*LOCAL(0)        .LOCL.          10 l   58   64   37    0.000    0.000   0.001


如果要同步公网的ntp服务器,则可以直接
ntpdate 0.rhel.pool.ntp.org


[root@li test]# echo "while :; do ntpdate 0.rhel.pool.ntp.org; sleep 60; done" >> /etc/rc.local

 


时间的分类:   软件时间,硬件时间(BIOS) 

 hwclock - query and set the hardware clock (RTC)

 hwclock    -r   读出bios的时间
 hwclock    -w   把系统时间写入bios

 所以可以在ntpdate同步时间之后,用hwclock命令写入到bios,让主板时间与系统时间保持一致