FTP

(file transport protocol文件传输协议)

1,2种工作模式:

主动模式:使用端口20和21

被动模式:使用端口21和随机端口

2,安装包:vsftpd。。。。。。。(very secure ftp非常安全的ftp)

3,配置文件:/etc/vsftpd/vsftpd.conf

4,默认匿名用户根目录/var/ftp/pub

用户默认根目录为用户自身家目录;

第一季

----------------------------------配置文件

打开/etc/vsftpd/vsftpd.conf文件

Anon_anble=YES     全局下允许匿名用户登陆

anon_max_rate=     匿名用户下载最大速度

anon_root=      指定匿名用户登录ftp后的家目录

anon_upload_enable=YES   是否允许匿名用户上传

anon_mkdir_write_enable=YES是否允许匿名用户创建文件夹

anon_mkdir_write_enable=YES 匿名用户可以在一个具备写权限的目录中创建目录

anon_world_readable_only=YES  匿名用户只具备下载权限

local_enable=YES   全局下允许本地用户登陆

write_enable=YES    全局允许本地用户具有写入权限

local_umask=022      本地用户上传文件的umask值为644

dirmessage_enable=YES    设置用户切换到一个目录时显示目录切换信息

xferlog_enable=YES   开启日志

connect_from_port_20=YES  连接端口

chown_uploads=YES        是否更改(锁定)上传文件的拥有人

chown_username=whoever    将上传的文件拥有人改为(与上面的结合使用)

xferlog_file=/var/log/vsftpd.log

xferlog_std_format=YES  传输日志文件将以标准xferlog的格式书写,默认为/var/log/xferlog

idle_session_timeout=600     空闲时间超时

data_connection_timeout=120    数据连接时间超时

ascii_upload_enable=YES     是否可用ASCII模式上传

ascii_download_enable=YES   是否可用ASCII模式下载

ftpd_banner=Welcome to blah FTP service.  设置登陆信息

eny_email_enable=YES

(default follows)

banned_email_file=/etc/vsftpd/banned_emails

chroot_local_user=YES    本地所有用户锁定在登陆目录不能跳转

chroot_list_enable=YES  开启用户目录锁定

(default follows)

chroot_list_file=/etc/vsftpd/chroot_list 写在chroot_list中的用户不能跳出家目录

listen=YES

listen_ipv6=YES

pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES 是否允许使用wrapers控制

dirlist_enable=YES   默认是允许列出共享目录下的目录的

hide_ids=NO    默认是不隐藏文件的拥有人和拥有组,改为yes后将看到所有文件的拥有人和拥有组变为ftp

force_dot_file=NO   默认不显示隐藏文件(即。开头文件)

cmds_allowed =YES   默认允许登录ftp后运行命令

Listen_port=21    监听端口

ftp_data_port=20    指定数据通道端口

pasv_enable=YES    默认为pasv被动模式

pasv_min_port=     指定pasv模式下端口的范围

pasv_max_port=

port_enable = NO  模式改为主动模式

guest_enable=YES   所有非匿名用户被映射为一个特定的本地用户(虚拟用户)

guest_username=    设置虚拟用户的用户名

one_proces_model =YES  每个ip单一进程模式

user_config_dir =  指定用户个人配置

第二季

------------------具体参数使用

参数一:因为匿名用户登陆后默认是在/var/ftp/pub下,本地用户登陆后默认是在自己的家目中中,那么我们可以更改他们登陆的家目录么?

答案是肯定的,首先指定匿名用户登陆的家目录:anon_root=/data

                     指定本地用户登陆的家目录:local_root=/data

我们把匿名用户和本地用户锁定在了/data/目录中;

然后重启服务测试:

匿名用户

本地用户:

参数二:锁定家目录不允许跳出

chroot_local_user=YES    本地所有用户锁定在登陆目录不能跳转

chroot_list_enable=YES  开启用户目录锁定

chroot_list_file=/etc/vsftpd/chroot_list 写在chroot_list中的用户不能跳出家目录

首先我们把第一个注释掉(默认都是注释的)

然后下面2个开启,在/etc/vsftpd/下面建一个文件chroot_list

如果要限制用户不能跳出家目录,就将用户写到chroot_list里面,一个用户一行

重启服务

测试:

这里可以看到怎么切换都没有跳出目录;

但是问题来了,如果要限制非常多的用户不能跳出,那要写入chroot_list的内容就太多了,但是我们可以反向管理,允许所有人不能跳出,仅仅几个人可以跳出;

这里就用到了刚刚第一个被注释的参数:chroot_local_user=YES

它的意思是,如果启用这个参数,则默认所有本地用户不能跳出,但是写在chroot_list中的用户可以跳出

这里我们来测试一下,把user1写到chroot_list中,

重启服务:

可以看出user1用户已经可以切换目录了;

参数三:chown_uploads=YES        是否更改(锁定)上传文件的拥有人

chown_username=whoever    将上传的文件拥有人改为(与上面的结合使用)

ftpd_banner=Welcome to blah FTP service.  设置登陆信息

这里我们先看一下登陆时的显示信息:

这里可以看到vsFTPd 2.2.2是ftp的版本信息,那么我们可以通过更改第三个参数来设置,我们改为:hello ,connect me please!

然后重启服务

可以看到登陆信息已经更改;

然后我们来看,用户上传文件后,文件的拥有人是谁,

先用匿名用户上传一个文件:

然后查看一下文件22的拥有人:

可以看到文件的拥有人为ftp

那么我们可以限制让文件拥有人变为root

更改

chown_uploads=YES 

chown_username=root

   

然后重启服务测试:

这里可以看到文件拥有人已经变成了root

参数四:

用户下载限速(有点像迅雷普通用户和vip用户下载速度不一样的的情况)

全局限速:

Local_max_rate=50000(单位为byte)

这里我们限速为50kb,下面来测试一下,我在/var/ftp/pub里面建立一个大小为100M的文件test,然后下载:

这时我们来下载这个文件

可以看到下载的速度为202897.84kb/s,也就说在20M/s左右,下面我们连限制他的速度在100kb左右,

在主配置文件里面加入user_config_dir=/etc/vsfptd/(这个目录可以自己指定)

之前的全局限速配置不要改

将vsftpd.conf文件复制到上面指定的目录/etc/vsftpd中并改名,如果对user1用户限制就改名为user1,

编辑user1文件,添加local_max_root=100000   

重启服务

看组图:

主配置文件:

将vsftpd.conf文件复制为user1:

编辑user1文件:

测试:

可以看到速度仅仅100kb左右,这样就对个人进行限速成功了

在selinux关闭的情况下:

问题一:

指定用户访问

在vsftpd.conf配置文件里面,最下面有个参数

1,Userlist_enable=YES

如果配置文件中仅只有这一条配置,那么只要是在/etc/vsftpd下的user_list文件中写入用户名,那么被写入的用户将不能访问ftp

2,如果配置文件中同时有userlist_enable 和userlist_deny

那么要分情况了,分2种情况

情况一:

如果要求仅几个能访问,其他都不能访问,(即只能几个指定的能访问,其别的都不能访问)

那么就要这样写:userlist_enable=YES

                Userlist_deny=NO

然后在/etc/vsftpd下的user_list文件中加入你指定的可以访问的用户名(其实是登陆名或者说是你本地建立的用户名,如user1 user2.。)

不管ftpusers文件,那么仅有写入到user_list 中的用户可以访问,其他用户都不能访问

情况二:

如果要求仅仅几个指定的用户不能访问(其实是登录名或者本地建立的用户),其他都能访问

那么这样写:userlist_enable=NO

           Userlist_deny=YES

然后在/etc/vsftpd的ftpusers文件中加入拒绝的用户名,不用管user_list文件,那么除了加入ftpuser中的用户不能访问,其别的都可以访问

问题二:

如果要拒绝一些网段的机器访问ftp服务器(注意这里一些机器访问ftp时,登陆还是需要问题一里面的用户名和密码的)

这个就跟user_list ftpusers文件没关系了,而是要在防火墙里面设置或者/etc/hosts.allow 和/etc/host.deny里面来设置

如果仅拒绝一些网段的访问,那么就只需要在/etc/hosts.deny里面加入

Vsftpd: 域名或者网段

也可以在/etc/hosts.allow里面加入

Vsftpd: 域名或者网段 :DENY

如果仅允许一些网段的访问

那么可以在/etc/hosts.allow里面加入

Vsftpd :域名或者网段

然后在/etc/hosts.deny里面加入

Vsftpd: all

或者仅仅在/etc/hosts.deny中加入

Vsftpd:域名或者网段:ALLOW

问题三:

关于用户上传和下载问题

对于匿名用户 

一般如果不在vsftpd.conf配置文件里面指定匿名用户登陆ftp的根目录

那么默认就是在/var/ftp下的

在不更改任何配置的情况下匿名用户是可以访问和下载的,但是没有上传和创建目录的权限

如果我们要有上传和创建目录的权限,那么

首先,在配置文件中去掉anon_upload_enable=YES(允许上传)和anon_mkdir_write_enable=YES(可以创建目录)的注释

很多人认为这样就对ftp服务器有上传和创建目录的权限了,但是他们错了

因为你还要考虑ftp共享出来的目录的权限

所以你必须要对共享的目录具有wrx的权限,所以这里最好的办法就是把共享目录的拥有人改为ftp(chown ftp /var/ftp/pub这样我们就共享了pub目录,)

注意,这里千万不要写成chown ftp /var/ftp了   如果这样他会提示匿名用不不能具有root的权限,因为这里/var/ftp是匿名用户的根目录,而不是共享目录,这样以后匿名用户就具有上传和创建目录的权限了

对于本地用户

  一般如果不在vsftpd.conf配置文件里面指定用户的ftp根目录,那么默认就是用户自己的家目录

那么当用户访问ftp服务器的时候,你会发现用户有上传和下载的权限,这时因为用户对自己家目录用户所有权限的

但是如果你限定了用户的根目录后,你会发现你没了上传的权限,那是因为共享目录的权限问题

例如我们将用户的根目录限定为/var/ftp,那么我们就要在配置文件中加一个条目:  local_root=/etc/ftp

这样就改变了用户的家目录了,然后我们把pub共享给用户,但是这里我们不能像匿名用户那样直接把pub目录的拥有人改为用户,因为这样就会导致匿名用户失去了上传等权限了,所以这里我们可以把pub的other权限改一下

Chmod o+w pub 然后就可以具有上传权限了   或者将pub的组改为用户所在的组,然后改pub的组权限

这样就解决问题了

 

在开启selinux情况下

如果在没开启selinux情况下都满足了需求,那么开启selinux后

对于匿名用户

开启selinux后,你会发现在没selinux的情况下可以上传和建立目录的权限,但是开启selinux后却不能了,这是因为selinux挡住了,这里我们要更改一下布尔值  setsebool –P allow_ftpd_anon_write on 

这样你就可以上传和创建目录了

对于用户

如果不更改配置文件,那么用户的根目录就是自己的家目录,但是开启selinux你会发现登陆不能成功,那么我们就要改一下布尔值

Setsebool –P ftp_home_dir on

这样就可以了

但是如果改变了根目录后,你会发现共享出来的文件你都不能下载,那么可以改content值来实现

这里我们可以 man ftpd_selinux来看一下

所以这里我们可以chcon –t –R public_content_rw_t /var/ftp/pub 

Setsebool –P allow_ftpd_full_access on

这样就可以了

-------------------------------FTP   相关防火墙

大多数的TCP服务是使用单个的连接,一般是客户向服务器的一个周知端口发起连接,然后使用这个连接进行通讯。但FTP协议却是例外,它使用双向的多个连接 ,而且使用的端口很难预计。 

FTP连接包括:

一个控制连接 (control connection)

这个连接用于传递客户端的命令和服务器端对命令的响应。它使用周知的TCP 21端口,生存期是整个FTP会话时间。 

N个数据连接 (data connection)

这些连接用于传输文件和其它数据,例如:目录列表等。这种连接在需要数据传输时建立,而一旦数据传输完毕就关闭,每次使用的端口也不一定相同。而且,这种数据 连接既可能是客户端发起的,也可能是服务器端发起的。 FTP协议使用一个标准的端口20作为ftp-data端口,但是这个端口只用于连接的源地址是服务器端的情况,在这个端口上根本就没有监听进程。

主动与被动模式 

FTP的数据连接和控制连接的方向一般是相反的,即服务器向客户端发起一个用于数据传输的连接。连接的端口是由服务器端和客户端协商确定的,这就是vsftpd的主动模式(port?mod)。FTP协议 的这个特征对iptables防火墙和NAT的配置增加了很多困难。在FTP被动模式 (passive mod)下,数据连接是由客户程序发起的,和主动模式相反。

选择模式的原则 

1、client 没有防火墙时,用主动模式连接即可

2、server 没有防火墙时,用被动模式即可

3、双方都有防火墙时,vsftpd 设置被动模式高端口范围,server 打开那段范围,client 用被动模式连接即可

是否采取被动模式取决于客户程序,在ftp命令行中使用passive命令就可以关闭/打开被动模式。

在xp命令行模式下使用ftp命令连接ftp服务器,用的是主动模式。浏览器方式下连接ftp服务器,可以修改访问使用的模式。 

iptables中配置vsftp 

问题:配置iptables后,能够登录到vsftpd服务器,但ls列目录失败(超时)。

分析:

主动模式 下,客户连接 TCP/21,服务器通过 TCP/20 连接客户的随机端口?

――――这种情况下,通过状态防火墙可以解决 iptables -A INPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT或者如下: 

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 

iptables -A INPUT -p tcp?-m multiport --dport 20,21?-m state --state NEW -j ACCEPT 

NEW: 该包想要开始一个新的连接(重新连接或连接重定向)

RELATED:该包是属于某个已经建立的连接所建立的新连接。如FTP的数据传输连接和控制连接之间就是RELATED关系。

ESTABLISHED:该包属于某个已经建立的连接。

INVALID:该包不匹配于任何连接,通常这些包被DROP。 

被动模式 下,客户连接 TCP/21,客户再通过其他端口连接服务器的随机端口,卡住的原因,是因为服务器在被动模式下没有打开临时端口让 client 连过来。

临时打洞的方法: 

优点:不影响ftp配置;缺点: 客户会感觉到连接有些延迟。原因参见ip_conntract的实现原理

在/etc/modprobe.conf中添加

alias ip_conntrack ip_conntract_ftp ip_nat_ftp

在/etc/rc.local中添加

/sbin/modprobe ip_conntract

/sbin/modprobe  ip_conntrack_ftp

/sbin/modprobe  ip_nat_ftp

限制被动模式连接端口的方法:

优点:对连接速度没有影响。缺点: 限制了客户端并发连接的数量。

在/etc/vsftpd/vsftpd.conf中添加

pasv_enable=YES

pasv_min_port=2222

pasv_max_port=2225

iptables中开放这段端口

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

-A INPUT -p tcp --dport 2222:2225 -j ACCEPT