FTP文件传输协议,是基于tcp协议的,它使用多端口通信。分主动模式和被动模式。
主动模式:client随机选取一个大于1024的端口n发送请求到server的21端口,并发送n+1表示要监听的数据端口,server会从20端口发送数据到client的n+1端口。但是,如果client有防火墙则发送的数据可能会被拒之门外。
被动模式:client随机选取一个大于1024的端口n发送请求到server的21端口,server会随机选取一个端口m(会发送port和6个十进制的参数,前四个表示client ip地址,后两个数据 x y表示server端口x*256+y),发送给client,client从自己的n+1端口发送数据请求到服务器的端口m。但是,这样服务器会被防火墙阻塞。
vsftpd(Very Secure FTP)是一个Linux下FTP服务器软件:
安装:yum install vsftpd
文件:
/etc/pam.d/vsftpd vsftpd使用的pam模块配置文件
/etc/rc.d/init.d/vsftpd 启动脚本
/etc/vsftpd/ftpusers pam模块指定那些用户不能登录
/etc/vsftpd/user_list vsftpd指定的那些用户不能登录userlist_enable=yes调用这个文件里的内容;userlist_deny=yes开启这个功能作用
/usr/sbin/vsftpd 主程序文件
/etc/vsftpd/chroot_list 指定那些用户的根目录为自己的家目录
Chroot_local_user=yes 本地所有帐户都锁定在自家目录
Chroot_list_enable=yes 文件中的名单可以调用
Chroot_list_file=/任意指定的路径 前提是chroot_local_user=no
/var/ftp/ 匿名用户的根目录
主配置文件:
vim /etc/vsftpd/vsftpd.conf 主配置文件
1、与服务器环境相关设置:
connect_from_port_20=YES 主动连接使用的端口号
listen=YES 表示使用独立模式监听
dirmessage_enable=YES 用户进入该目录时显示一些话
message_file=.message 存放要显示的话的文件
pasv_enable=YES 支持数据流的被动模式
use_localtime=YES 使用本地时间,vsftpd默认使用GMT时间,会比中国晚8个小时
write_enable=YES 允许用户上传,
xferlog_enable=YES 用户上传与下载的文件都会被记录下来。
xferlog_file=/var/log/xferlog 日志记录在该文件下
chroot_local_user=YES 默认系统用户被限制在自己家目录中
chroot_list_enable=YES 是否启用chroot,
chroot_list_file=/etc/vsftpd.chroot_list 设置用户名单
userlist_enable=YES 是否要阻止一些用户访问
userlist_deny=YES 表示列表中的用户不能访问,如果为NO表示列表中的用户才能访问
userlist_file=/etc/vsftpd/user_list 用户列表文件
local_umask=022 本地用户上文件的m默认权限
xferlog_std_format=YES 日志格式与wu-ftp一样
pam_service_name=vsftpd.pam 使用pam的模块
guest_enable=YES 任何用户都将被认为是guest指定的用户
guest_username=ftpuser 指定guest用户名
user_config_dir=/etc/vsftpd/users_config 虚拟用户的配置文件
tcp_wrappers=YES 支持tcp_wrappers
2、匿名用户设置:
virtual_use_local_privs=YES/NO(NO)当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。当此参数关闭(NO)时,虚拟用户使用与 匿名用户相同的权限。默认情况下此参数是关闭的(NO)
anonymous_enable=YES 表示允许匿名anonymous登录
anon_upload_enable=YES 匿名可以上传
anon_mkdir_write_enable=YES 匿名可以建立目录
anon_world_readable_only=YES只有下载可读权限
anon_other_write_enable=YES 除了写外还有删,改的权限
案例:一个实验室要搭建一个ftp服务器,要求仅有一个用户可以上传,删除,修改,下载文件,其他用户只能查看和下载。
1、创建虚拟用户文件,
vim /etc/vsftpd/user.virtual
ftp01 奇数行为用户名
XXXX 偶数行为密码
ftp02
xxxx
2、生成用户数据库:
db_load -T -t hash -f /etc/vsftpd/user.virtual /etc/vsftpd/user.virtual.db
3、修改数据库访问权限:
chmod 700 /etc/vsftpd/user.virtual.db
4、创建pam文件
vim /etc/pam.d/vsftpd.pam
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/user.virtual
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/user.virtual
如果是32位系统:
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/user.virtual
account required /lib/security/pam_userdb.so db=/etc/vsftpd/user.virtual
5、创建共享目录和虚拟用户
mkdir /ftp/share
chmod -R 700 /ftp/share
useradd -d /ftp/share ftpuser
chown ftpuser.ftpuser /ftp/share
6、主配置文件
anonymous_enable=NO
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
pam_service_name=vsftpd.pam
userlist_enable=YES
guest_enable=YES
guest_username=ftpuser
user_config_dir=/etc/vsftpd/users_config
tcp_wrappers=YES
7、虚拟用户配置
vim users_config/ftp01
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
vim users_config/ftp02
anon_world_readable_only=NO
anon_other_write_enable=NO
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
8、重启服务 service vsftpd restart
ftp防火墙:(已知本机ip222.24.24.46)
首先要开启ftp的两个模块:
vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp" #中间用空格隔开
被动模式下:
iptables -A INPUT -d 222.24.24.46 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT #放行21端口,状态为新连接的和已建立的都允许进
iptables -A INPUT -d 222.24.24.46 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT #tcp状态为已建立的和已发出数据等待回复的都允许进,因为server要随机选取一个大于1024的端口所以要用RELATED状态
iptables -A OUTPUT -s 222.24.24.46 -m state --state ESTABLISHED,RELATED -j ACCEPT #状态为已建立的和以发出数据等待回复的都允许出
主动模式下:
iptables -A INPUT -d 222.24.24.43 -p tcp --dport 20:21 -j ACCEPT #允许20,21端口进