实验环境虚拟机CentOS 6.5

IPADDR=192.168.1.224

安装vsftpd

yum -y install vsftpd


配置文件:

vim/etc/vsftpd/vsftpd.conf


查看端口

[root@localhost ~]# netstat -anp |grep vsftpd

tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      1409/vsftpd   

配置文件说明20端口为数据传输端口

# Make sure PORT transfer connections originate from port 20 (ftp-data).

connect_from_port_20=YES

所以要开放端口TCP 21 20  两个端口

iptables -I INPUT -p tcp --dport 20:21 -j ACCETP

service iptables save


防火墙加载ftp模块                        #不加载访问不了

vim /etc/sysconfig/iptables-config

加入以下两个,顺序不要错

IPTABLES_MODULES="ip_conntrack_ftp"

IPTABLES_MODULES="ip_nat_ftp"

重启防火墙

/etc/init.d/iptables restart



原理:

vsftpd 分主动模式和被动模式,

默认为主动模式:

客户端通过21端口访问ftp服务器建立连接后,再通过20端×××换数据,主动模式就是服务器20端口主动连接客户端开放的随机端口,进行传输!因此如果客户端在内网的话,路由难以开放随机端口,数据是很难传得入内网的.

被动模式:

客户端通过21端口访问ftp服务器建立连接后,被动模式就是服务器随机打开端口xxxx叫客户端访问服务器的xxxx端口进行数据传输!因此这种模式也大大不安全,因此我们可以自己设置开放的端口来控制!


##################配置主动模式#################################################

vim /etc/vsftpd/vsftpd.conf


anonymous_enable=YES                                  #允许區名访问

local_enable=YES                                      #允许本地登录

write_enable=YES                                      #允许写

anon_upload_enable=YES                                #允许區名上传

anon_mkdir_write_enable=YES                           #允许區名mkdir和写

dirmessage_enable=YES                                 #启用目录欢迎信息

xferlog_enable=YES                                    #启用日志

ftpd_banner=######This is my FTP service.######       #全局欢迎信息

chroot_local_user=YES                                 #更改用户目录为家目录限制访问别的目录


保存

重启服务

/etc/init.d/vsftpd restart

查看selinux

setsebool -a |grep ftp

[root@localhost pub]# getsebool -a |grep ftp

allow_ftpd_anon_write --> off

allow_ftpd_full_access --> off

allow_ftpd_use_cifs --> off

allow_ftpd_use_nfs --> off

ftp_home_dir --> off

ftpd_connect_db --> off

ftpd_use_fusefs --> off

ftpd_use_passive_mode --> off

httpd_enable_ftp_server --> off

tftp_anon_write --> off

tftp_use_cifs --> off

tftp_use_nfs --> off


设置selinux

setsebool -P allow_ftpd_anon_write on  

setsebool -P allow_ftpd_full_access on

setsebool -P ftp_home_dir on

再查看

[root@localhost pub]# getsebool -a |grep ftp                                                    

allow_ftpd_anon_write --> on

allow_ftpd_full_access --> on

allow_ftpd_use_cifs --> off

allow_ftpd_use_nfs --> off

ftp_home_dir --> on

ftpd_connect_db --> off

ftpd_use_fusefs --> off

ftpd_use_passive_mode --> off

httpd_enable_ftp_server --> off

tftp_anon_write --> off

tftp_use_cifs --> off

tftp_use_nfs --> off


创建用户

#创建不能登录的用户bob 并指定家目录为/var/ftpusers/

useradd -s /sbin/nologin -d /var/ftpusers/ bob  

passwd bob


创建目录欢迎信息文件

因为刚才启用了dirmessage_enable=YES,进入目录出现欢迎信息

所有我在pub目录下创建欢迎信息文件

echo "########There is pub#######" > /var/pub/.message     


                               

###############测试###############################

windows下打开cmd

ftp 192.168.1.224

看到欢迎信息

######This is my FTP service.######  

输入用户名ftp

输入dir

>dir

看到pub目录了

>pwd

>"/"        #显示为根

>cd pub

250-"########There is pub#######" 进入pub目录出现在欢迎信息


用资源管理器访问ftp://192.168.1.224

看到pub目录。

上传文件失败,提示没权限。   


服务器查看权限

这时这个根目录其实是/var/ftp/

[root@localhost pub]# ll -d /var/ftp/                   

drwxr-xr-x. 3 root root 4096 4月   3 14:04 /var/ftp/     

[root@localhost pub]# ll /var/ftp/

drwxr-xr-x. 3 ftp ftp 4096 4月   3 14:30 pub


因此ftp目录上是没权限写入的。

只能写入pub目录里。

windows下访问ftp://192.168.1.224

區名登录看到pub

右键选择 登录 输入用户名bob 密码123456

登录成功

上传下载操作都OK


############下面继续配置文件的一些常用功能##############

(一).FTP服务器的流量控制

max_clients=100             ;允许的最大连接数,定义为100,默认为0,表没有限制

max_per_ip=5               ;每个IP允许的连接数,0表没有限制,需要运行于独立模式方可

anon_max_rate=50000        ;匿名用户最大带宽,单位为bps

local_max_rate=200000       ;系统用户最大带宽


如何对指定用户进行流量限制呢?

#vi /etc/vsftpd/vsftpd.conf,添加一行:

user_config_dir=/etc/vsftpd/userconf

#touch /etc/vsftpd/userconf/netseek_com  为netseek_com这个用户建立一个netseek_com文件

#vi /etc/vsftpd/userconf/netseek_com  添加以下内容

local_max_rate=100000 


(二)改变上传所有者

#chown_uploads=YES                     #改变上传所有者

#chown_username=ltiaw                  #上传所有者改为ltiaw



#chroot_list_enable=YES                      #启用改为根目录的list

#chroot_list_file=/etc/vsftpd/chroot_list   #指定list文件

启用这里的时间把上面启用所有人都chroot注释掉 #chroot_local_user=YES

这个可以指定用户谁chroot,不放去list文件的用户就不chroot


(三)用户访问控制

userlist_enable=YES   #用户控制启用

查看文件

vim /etc/vsftpd/user_list

内容如下:


# vsftpd userlist

# If userlist_deny=NO, only allow users in this file

# If userlist_deny=YES (default), never allow users in this file, and

# do not even prompt for a password.

# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers

# for users that are denied.

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

news

uucp

operator

games

nobody


意思是:默认是拒绝这个文件下的用户名,还有 /etc/vsftpd/ftpusers 这个文件里的用户也是拒绝的!

所以root是登录不了的。

也可以在配置文件里加入:userlist_deny=NO

1.userlist_deny=NO  这样user_list里的用户名就是允许的,

但是/etc/vsftpd/ftpusers 里的还是禁止的.


2./etc/vsftpd/ftpusers文件,是由这个配置文件控制的: vim /etc/pam.d/vsftpd 

具体怎么控制自己看了。



抓包

tcpdump -i eth0 host 192.168.1.5 and host 192.168.1.224 |grep -v ssh

分别传输文件两次,发现果然是服务器20访问客户端端口,而且第一次与第二次的端口不是同的并大于1024








##########################被动模式###########################################

vim /etc/vsftpd/vsftpd.conf

注释20端口 #connect_from_port_20=YES     

增加下面三行

pasv_enable=yes               #启用被动模式

pasv_min_port=4500            #被动模式起始端口为:4500

pasv_max_port=5000            #被动模式结束端口为:5000


保存重启服务

/etc/init.d/vsftpd restart


开放端口:

iptables -I INPUT -p tcp --dport 4500:5000 -j ACCETP

/etc/init.d/iptables save


抓包:

tcpdump -i eth0 host 192.168.1.224 and host 192.168.1.5 |grep -v ssh 

客户端传文件


15:55:32.341781 IP 192.168.1.5.ssowatch > 192.168.1.224.4693: Flags [.], seq 1:1461, ack 1, win 65535, length 1460

15:55:32.341795 IP 192.168.1.5.ssowatch > 192.168.1.224.4693: Flags [P.], seq 1461:1847, ack 1, win 65535, length 386


5:55:37.358912 IP 192.168.1.5.vxcrnbuport > 192.168.1.224.4776: Flags [.], ack 447, win 65090, length 0

15:55:37.358921 IP 192.168.1.5.vxcrnbuport > 192.168.1.224.4776: Flags [F.], seq 1, ack 447, win 65090, length 0


正是我刚才开放的端口4500-5000之间的~


开启成功