linux ftp配置 详解

--



ftp (file tranfer protocol)

windows下的服务端serv-U         
客户端 cuteftp    leapftp   flashftp


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

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


yum.repos.d]# yum list |grep vsftp   --红帽里内置的FTP软件包
This system is not registered with RHN.
RHN support will be disabled.
vsftpd.i386                             2.0.5-16.el5              installed


vsftp         very secure ftp

另一种开源的ftp软件proftp


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

连接方式分为两种


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

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


服务模式:

stand alone
super daemon

ftp的20.21这两个端口都是用的tcp连接,所以是要经过两次的三次握手的过程
但要注意:20端口(数据传输端口)是在有数据传输时才建立,并不是ftp一连接就建立


   vim /etc/vsftpd/vsftpd.conf --配置文件

man vsftpd.conf   可以去查看帮助


/etc/init.d/vsftpd start

[root@li yum.repos.d]# netstat -ntl |grep 21
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN 

验证主动模式:
[root@li yum.repos.d]# ftp 10.1.1.35
Connected to 10.1.1.35.
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.35:root): ftp
331 Please specify the password.
Password:    --ftp用户的默认密码也是ftp
ftp> ?     --问号去查看命令帮助
Commands may be abbreviated. Commands are:
ftp> help ls        --看命令的帮助
ls              list contents of remote directory
ftp> 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 06:03 pub
226 Directory send OK.


第二个终端去验证端口:
[root@li ~]# netstat -nt |grep 20|grep TIME 
tcp        0      0 10.1.1.35:20                10.1.1.35:60422             TIME_WAIT   --因为本机又是客户端,又是服务端,主动模式可以看到本机的20去连接一个随机端口


验证被动模式:
[root@li yum.repos.d]# telnet 10.1.1.35 21
Trying 10.1.1.35...
Connected to li.cluster.com (10.1.1.35).
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,35,171,164)



netstat -ntl
tcp        0      0 10.1.1.35:43940             0.0.0.0:*                   LISTEN



配置文件:
[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下,可以改成no,换成super daemon的运行模式
pam_service_name=vsftpd   --支持pam
userlist_enable=YES    --打开用户列表的功能
tcp_wrappers=YES    --支持tcp_wrapper


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

例一:关于匿名用户的下载

匿名用户默认是可登陆,可下载 (因为/var/ftp目录是755权限)

--任何服务的权限控制是要经过两道门的,一个是服务本身的权限控制,一个是操作系统的权限控制,也就是说两个都允许,才有权限

把/var/ftp目录改为750后
使用匿名用户登录,ls看不到列表,也下载不了


例二:关于匿名用户的上传

anonymous_enable=YES
anon_upload_enable=YES --允许匿名用户上传文件
anon_mkdir_write_enable=YES --允许匿名用户创建目录

ftp> lcd /etc   -- lcd 指客户端的目录路径改变 
Local directory now /etc
ftp> put fstab   --put上传fstab到/var/ftp
local: fstab remote: fstab
227 Entering Passive Mode (127,0,0,1,157,15)
553 Could not create file.   --可以看到是不能上传的,因为/var/ftp的权限是755,匿名用户是不可写的

然后chmod 777 /var/ftp

再登录
[root@li ~]# ftp 10.1.1.35
Connected to 10.1.1.35.
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.35:root): ftp
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable anonymous root --可以看到ftp服务器是不允许家目录改为777
Login failed.


解决方法:
只能在/var/ftp再建立一个用于上传的目录,把权限改为匿名用户可写就行,比如我们
   chmod 777 /var/ftp/pub

ftp> cd pub    --cd为服务端改变目录的命令
250 Directory successfully changed.
ftp> lcd /etc
Local directory now /etc
ftp> put inittab   --也就是把客户端/etc/下的inittab上传到服务端的/var/ftp/pub
local: inittab remote: inittab
227 Entering Passive Mode (10,1,1,35,135,69)
150 Ok to send data.
226 File receive OK.
1666 bytes sent in 4.1e-05 seconds (4e+04 Kbytes/s)
ftp> put /etc/rc.local   local --另外一种put方法,可以这样写,把/etc/rc.local上传并改名为local,这样就避免了使用lcd的麻烦



例三:允许匿名下载刚上传的文件
ftp> lcd /root/Desktop   --换了下客户端目录
Local directory now /root/Desktop
ftp> get inittab   --下载刚上传的inittab,发现失败
local: inittab remote: inittab
227 Entering Passive Mode (10,1,1,35,133,225)
550 Failed to open file.


解决方法一:
vim /etc/vsftp/vsftpd.conf


添加一行: anon_world_readable_only=no


重启服务后,发现可以下载刚上传的文件


解决方法二:可以把local_umask=022
       改为 local_umask=0222


例四:关于普通用户(指的就是/etc/passwd建立的普通系统帐号)登录,上传,下载

关于/etc/passwd最后一列的说明:
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
a:x:533:534::/home/a:/bin/bash
b:x:534:535::/home/b:/bin/false

/sbin/nologin   --不能登录系统,但可以登录ftp服务
/bin/bash   --又可以登录系统,又可以登录ftp
/bin/false      --不能登录系统,也不能登录ftp服务


   local_enable=YES
   write_enable=YES

[root@li ~]# ftp 10.1.1.35
Connected to 10.1.1.35.
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.35:root): a   --用户名a
331 Please specify the password. 
Password:    --密码为a用户的系统帐号密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls   --这里看到的是a用户的家目录里的文件
227 Entering Passive Mode (10,1,1,35,251,100)
150 Here comes the directory listing.
-rw-------    1 533      534            44 Apr 24 07:03 nohup.out
-rwxr-xr-x    1 0        0              69 Apr 24 06:57 ntpdate.sh
226 Directory send OK.  
ftp> mkdir a   --可以创建目录
257 "/home/a/a" created


例五:不允许本地用户登录,或者禁用某些用户登录
   local_enable=no   --所有的普通用户都不能登录

方法一:(不推荐)
只针对某些普通用户来限制
vim /etc/passwd 把要限制的用户/bin/bash改为/bin/false
    usermod -s /bin/false 用户名

方法二:用vsftp服务本身的用户列表功能来控制(推荐)
   userlist_enable=YES   --打开用户列表功能,如果这里为no,那么下面的两个参数无效

   userlist_deny=YES   --默认没有这个参数,不加的话默认是打开的,注意这里的否定意思,yes的话表示是拒绝,no表示是允许


   vim /etc/vsftpd/user_list --在这里就可以写上你要拒绝的用户名,一行写一个,可以看到默认里面就有那些uid<500的系统帐号,也就是说默认vsftp是不允许他们登录的
  
   重启服务后验证


   userlist_enable=YES
   userlist_deny=NO
   vim /etc/vsftpd/user_list --因为userlist_deny的值为no,所以这个列表里的用户是允许

   重启服务后验证



例六:关于chroot(笼环境)   --为了安全性,锁定登录用户的活动范围
   默认匿名用户是只在笼环境里活动,但普通用户是没有笼环境限制


   chroot_list_enable=YES
   chroot_list_file=/etc/vsftpd/chroot_list --此文件默认没有,自动手动建立


   vim /etc/vsftpd/chroot_list   --手动写上用户名,一行一个用户名,写上用户名的用户不能 cd 出它的登录目录
  

例七:登录显示目录信息,或者是欢迎信息


1,针对单个用户的消息显示:

   dirmessage_enable=YES --打开用户的目录信息功能
  

在登录家目录里 vim .message (--我这里是写在/home/b/下,也就是b用户的家目录)
    写上登录时显示的消息 
welcome to my ftp server!!
                        li


最后用此用户登录ftp时,会显示刚写在.message里的消息

ame (10.1.1.35:root): b
331 Please specify the password.
Password:
230-welcome to my ftp server!!   --这里可以看到刚才的.messag的消息 
230-                    li
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.


2,针对整个全局的消息显示:
   方法一:
ftpd_banner=Welcome to blah FTP service. --打开此选项


[root@li ~]# ftp 10.1.1.35  
Connected to 10.1.1.35.
220 Welcome to blah FTP service.   --刚登录时就会显示
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
  
   方法二:
把消息直接写到一个文件里
  
banner_file=/var/ftp/welcome --后面的文件是自定义的,手动去建立,并写上消息


例8:关于ftp的日志
   xferlog_enable=YES   --打开日志记录功能
   xferlog_file=/var/log/xferlog --指定日志记录文件
   xferlog_std_format=YES   --格式采用标准格式


cat /var/log/xferlog     --注意的是只有上传和下载时才会记录日志
sat May 15 03:22:05 2010 1 10.1.1.35 220 /pub/local b _ i a ftp ftp 0 * c
Sat May 15 03:31:19 2010 1 10.1.1.35 69 /home/a/ntpdate.sh b _ o r a ftp 0 * c
Sat May 15 03:36:08 2010 1 10.1.1.35 791 /home/a/fstab b _ i r a ftp 0 * c
Sat May 15 06:12:41 2010 1 10.1.1.35 1666 /home/b/inittab b _ i r b ftp 0 * c
Sat May 15 06:14:20 2010 1 10.1.1.35 791 /home/b/fstab b _ i r b ftp 0 * c
Sat May 15 06:15:29 2010 1 10.1.1.35 791 /home/b/fstab b _ o r b ftp 0 * c



例9:介绍几个特殊的限制参数
local_max_rate=1000000 --对本地用户的最大传输速度的限制参数默认没有这个参数,默认不限制
anon_max_rate --和local_max_rate相似,但是只针对匿名用户

max_clients   --默认最大的客户端连接数,要运行在stand alone的模式下,默认不限制

max_login_fails --默认登录3次失败,会杀掉你这次登录的进程

max_per_ip   --针对单个客户的最大连接数,默认也是不限制



例十: ftp支持tcp_wrapper

[root@li b]# ldd /usr/sbin/vsftpd |grep wrap
        libwrap.so.0 => /lib/libwrap.so.0 (0x00dbc000) --表示支持tcp_wrapper


[root@li b]# vim /etc/hosts.deny 
vsftpd: 10.1.1.0/255.255.255.0 EXCEPT 10.1.1.104 --拒绝10.1.1.0网段连上服务的ftp,只允许10.1.1.104连

[root@li b]# ftp 10.1.1.35   --用tcp_wrapper拒绝后,自己(IP为35)做客户端都不能连上自己的服务器,除了104
Connected to 10.1.1.35.
421 Service not available.
ftp> quit


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


ftp工具介绍

windows下:
服务端serv-U         
客户端 cuteftp    leapftp   flashftp


linux下:
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 :~> mget *b   --批量下载以b字母结尾的文件
2457 bytes transferred
Total 3 files transferred


lftp :~> 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服务

时间同步对于集群环境来说非常重要

时区的概念:
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个阶层)
   层与层会有时间误差,网络延迟的计算



yum install ntp -y   --安装软件包    ntp.i386

vim /etc/ntp.conf --配置文件



[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

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


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

hwclock - query and set the hardware clock (RTC)

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

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

-------------------------
介绍一个super   daemon下的一个时间同步的方法
[root@li test]# vim /etc/xinetd.d/time-dgram 
    disable = no
[root@li test]# vim /etc/xinetd.d/time-stream 
    disable = no

/etc/init.d/xinetd    restart   --监听两个37端口(一个tcp端口,一个udp端口)

客户端使用    rdate   -s   10.1.1.35   来同步时间


优点: 不需要象ntp那样等待较长时间,配置起来比较方便,但功能没有ntp强大



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


作业题:
1,搭建ftp服务器,允许本地用户登录,但只允许a,b,c,d四个用户登录,然后所有的普通用户登录都登录到/ftp目录下(也就是同一个笼环境,提示参数为local_root)
每个用户在/ftp目录下的使用空间为50M,a用户可以上传下载,b用户只下载,不能上传,c,d用户只上传不能下载
加上欢迎消息,和日志功能,禁止匿名用户登录

mkdir /ftp

vim /etc/vsftpd/vsftpd.conf
   userlist_enable=YES
   userlist_deny=NO
   vim /etc/vsftpd/user_list --这里加上a,b,c,d

   local_root=/ftp --所有登录的普通用户会登录到/ftp这个笼环境下

   banner_file=/var/ftp/welcome --这个文件手动去建立,并写上你要的欢迎消息

   xferlog_enable=YES   --打开日志记录功能
   xferlog_file=/var/log/xferlog --指定日志记录文件
   xferlog_std_format=YES  

   anonymous_enable=NO --禁止匿名用户登录

fdisk 分一个分区出来 ,格式化为ext3
mount /dev/sdax -o usrquota,grpquota,acl /ftp

   quotacheck -cauvg

   edquota - u a
   edquota - u b
   edquota - u c
   edquota - u d --四个用户每个用户都把hard block改为5000000

chown   a,b /ftp
chmod   753 /ftp






2,成功搭建一个能让客户端同步时间的ntp服务