RHEL5下搭建FTP文件传输服务
FTP全名是FileTransfer Protocol(文件传输协议) C/S架构
FTP可以跨越平台,也可以运行在Internet上面,在linux下面FTP可以通过很多软件来实现,我们linux下面最常用的FTP服务器架设使用vsftpd(Very Secure FTP Daemon)软件,支持15000个用户的并发访问。Vsftpd是一个基于GPL发布的FTP服务器软件,其中vs是指very secure的缩写,由此可以看出,本软件的的初衷是为了服务的安全。
下面是关于FTP这个服务的属性
FTP服务相关软件
IIS Serv-U Vsftpd proftpd pureftpd
FTP客户端相关软件
ftp命令 CuteFTPFlashFTP LeapFTP Filezilla gftp kuftp
VSFTP的守护进程
/usr/sbin/vsftpd
FTP的脚本
/etc/init.d/vsftpd
FTP的端口
TCP协议的20,21端口与客户端进行通信
20用于建立数据连接,传输文件数据。
21用于建立控制连接,并传输FTP控制命令。
用户控制列表文件
/etc/vsftpd/ ftpusers 文件中的用户禁止登录FTP服务器(黑名单)
/etc/vsftpd/ user_list 文件中的用户可能被禁止或允许登录FTP服务器,具体看vsftpd.conf的设置
主配置文件
/etc/vsftpd/vsftpd.conf
FTP的工作模式:
主动模式:
被动模式:
主动模式与被动模式的优缺点:
主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。
根据传输文件是否进行字符转换分为:
文本模式(又称为ASCII)以文本序列传输数据,用的较多
二进制模式(又称为Binary模式)以二进制序列传输数据
FTP用户类型;
匿名用户:anonymous或ftp
本地用户:帐号名称、密码等信息保存在passwd、shadow文件中
虚拟用户:使用独立的帐号/密码数据文件(将FTP帐号与系统帐号的关联性降低)
下面来具体搭建FTP服务
搭建yum仓库:
[root@crushlinux ~]# mount /dev/cdrom /mnt
[root@crushlinux ~]# cat/etc/yum.repos.d/rhel-debuginfo.repo
[rhel-Server]
name=Red Hat Enterprise Server
baseurl=file:///mnt/Server
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-beta,file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[root@crushlinux ~]# yum -y install vsftpd
[root@crushlinux ~]# cat/etc/vsftpd/vsftpd.conf
常用的匿名FTP配置项
anonymous_enable=YES 是否允许匿名用户访问
anon_umask=022 匿名用户所上传文件的权限掩码
anon_root=/var/ftp 设置匿名用户的FTP根目录
anon_upload_enable=YES 是否允许匿名用户上传文件
anon_mkdir_write_enable=YES 是否允许匿名用户允许创建目录
anon_other_write_enable=YES 是否允许匿名用户有其他写入权(改名,删除,覆盖)
anon_max_rate=0 限制最大传输速率(字节/秒)0为无限制
常用的本地用户FTP配置项
local_enable=YES 是否允许本地系统用户访问
local_umask=022 本地用户所上传文件的权限掩码
local_root=/var/ftp 设置本地用户的FTP根目录
chroot_list_enable=YES 表示是否开启chroot的环境,默认没有开启
chroot_list_file=/etc/vsftpd/chroot_list
表示写在/etc/vsftpd/chroot_list文件里面的用户是不可以出chroot环境的。默认是可以的。
Chroot_local_user=YES 表示所有写在/etc/vsftpd/chroot_list文件里面的用户是可以出chroot环境的,和上面的相反。
local_max_rate=0 限制最大传输速率(字节/秒)0为无限制
常用的全局配置项
listen=YES 是否以独立运行的方式监听服务
listen_address=192.168.4.1 设置监听FTP服务的IP地址
listen_port=21 设置监听FTP服务的端口号
write_enable=YES 是否启用写入权限(上传,删除文件)
download_enable=YES 是否允许下载文件
dirmessage_enable=YES 用户切换进入目录时显示.message文件
xferlog_enable=YES 启用日志文件,记录到/var/log/xferlog
xferlog_std_format=YES 启用标准的xferlog日志格式,禁用此项将使用vsftpd自己的格式
connect_from_port_20=YES 允许服务器主动模式(从20端口建立数据连接)
pasv_enable=YES 允许服务器被动模式
pasv_max_port=24600 设置被动模式服务器的最大端口号
pasv_min_port=24500 设置被动模式服务器的最小端口号
pam_service_name=vsftpd 用户认证的PAM文件位置(/etc/pam.d/vsftpd.vu)
userlist_enable=YES 是否启用user_list列表文件
userlist_deny=YES 是否禁用user_list中的用户
max_clients=0 限制并发客户端连接数
max_per_ip=0 限制同一IP地址的并发连接数
tcp_wrappers=YES 是否启用tcp_wrappers主机访问控制
chown_username=root 表示匿名用户上传的文件的拥有人是root,默认是关闭的
ascii_upload_enable=YES 表示是否允许用户可以上传一个二进制文件,默认是不允许的
ascii_download_enable=YES 这个是代表是否允许用户可以下载一个二进制文件,默认是不允许的
nopriv_user=vsftpd 设置支撑Vsftpd服务的宿主用户为手动建立的Vsftpd用户
async_abor_enable=YES设定支持异步传输功能
ftpd_banner=Welcome toAwei FTP servers 设定Vsftpd的登陆标语
guest_enable=YES 设置启用虚拟用户功能
guest_username=ftpuser指定虚拟用户的宿主用户virtual_use_local_privs=YES设定虚拟用户的权限符合他们的宿主用户user_config_dir=/etc/vsftpd/vconf 设定虚拟用户个人Vsftp的配置文件存放路径
案例1:
1.创建测试文件
2.匿名用户ftp对/var/ftp/pub有写入权限
3.允许匿名用户浏览
4.允许用户(匿名,本地,虚拟)有上传权限
5.允许匿名用户有上传权限
6.允许匿名用户有上传文件夹权限
7.禁止匿名用户有删除,覆盖等权限
[root@crushlinux ~]# tar zcf/var/ftp/vsftpdconf.tar.gz /etc/vsftpd/
[root@crushlinux ~]# ls /var/ftp/
pub vsftpdconf.tar.gz
[root@crushlinux ~]# chown ftp/var/ftp/pub
[root@crushlinux ~]# ls �Cld /var/ftp/pub
[root@crushlinux ~]# vi/etc/vsftpd/vsftpd.conf
write_enable=YES
anon_umask=022
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@crushlinux ~]# service vsftpdrestart
[root@crushlinux ~]# netstat -anptu |grep"vsftpd"
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 2555/vsftpd
使用ftp工具进行测试
[root@crushlinux ~]# ftp 192.168.200.129
Connected to 192.168.200.129.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authenticationtype
Name (192.168.200.129:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode(192,168,200,129,49,66)
150 Here comes the directory listing.
drwxr-xr-x 2 14 0 4096 Dec 04 2009 pub
-rw-r--r-- 1 0 0 823 Nov 20 16:28 vsftpdconf.tar.gz
226 Directory send OK.
ftp> lcd /opt
Local directory now /opt
ftp> get vsftpdconf.tar.gz
local: vsftpdconf.tar.gz remote:vsftpdconf.tar.gz
227 Entering Passive Mode(192,168,200,129,50,247)
150 Opening BINARY mode data connectionfor vsftpdconf.tar.gz (823 bytes).
226 File send OK.
823 bytes received in 0.0015 seconds(5.2e+02 Kbytes/s)
ftp> bye
221 Goodbye.
[root@crushlinux ~]# ls /opt/
vsftpdconf.tar.gz
使用lftp工具进行测试
[root@crushlinux test]# lftp 192.168.200.129-p 21 -u username,password
[root@crushlinux ~]# lftp 192.168.200.129
lftp 192.168.200.129:~> ls
drwxr-xr-x 2 14 0 4096 Dec 04 2009 pub
-rw-r--r-- 1 0 0 823 Nov 20 16:28 vsftpdconf.tar.gz
lftp 192.168.200.129:/> lcd /root/
lcd 成功, 本地目录=/root
lftp 192.168.200.129:/> getvsftpdconf.tar.gz
823 bytes transferred
lftp 192.168.200.129:/> put install.log
put: Access failed: 553 Could not createfile. (install.log)
lftp 192.168.200.129:/> bye
使用wget工具进行测试
[root@crushlinux ~]# rm -rfvsftpdconf.tar.gz
[root@crushlinux ~]# wgetftp://192.168.200.129/vsftpdconf.tar.gz
[root@crushlinux ~]# ls
vsftpdconf.tar.gz
案例2:
1.创建测试帐号u1、u2、u3密码都为“user”
2.允许本地用户访问
3.将权限掩码设为077
4.将本地帐号禁锢在宿主目录中
5.只允许u1、u2两个用户可以登录
[root@crushlinux ~]# useradd u1
[root@crushlinux ~]# echo "user"|passwd --stdin u1
[root@crushlinux ~]# useradd u2
[root@crushlinux ~]# echo "user"|passwd --stdin u2
[root@crushlinux ~]# useradd u3
[root@crushlinux ~]# echo "user"|passwd --stdin u3
[root@crushlinux ~]# vi/etc/vsftpd/vsftpd.conf
write_enable=YES
anon_umask=022
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=NO
local_enable=YES
local_umask=077
chroot_local_user=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
userlist_deny=NO
tcp_wrappers=YES
[root@crushlinux test]# vi/etc/vsftpd/user_list
u1
u2
[root@crushlinux ~]# service vsftpdrestart
通过URL地址形式验证:ftp://username:password@IP
[root@crushlinux ~]# vi/etc/vsftpd/user_list
user1
user2
[root@crushlinux ~]# vi/etc/vsftpd/vsftpd.conf
userlist_enable=YES
userlist_deny=NO
[root@crushlinux ~]# service vsftpdrestart
[root@crushlinux ~]# touch/home/u{1,2,3}/test
[root@crushlinux ~]# ls /home/u{1,2,3}
/home/u1:
test
/home/u2:
test
/home/u3:
test
[root@crushlinux ~]# lftp 192.168.200.129-p 21 -u u1,user
lftp [email protected]:~> ls
-rw-r--r-- 1 0 0 0 Nov 20 17:08 test
lftp [email protected]:~> bye
[root@crushlinux ~]# lftp 192.168.200.129-p 21 -u u2,user
lftp [email protected]:~> ls
-rw-r--r-- 1 0 0 0 Nov 20 17:08test
lftp [email protected]:~> bye
[root@crushlinux ~]# lftp 192.168.200.129-p 21 -u u3,user
lftp [email protected]:~> ls
`ls' at 0 [重新连接前延时: 28]
中断
lftp [email protected]:~> bye
案例3:
1修改vsftpd服务的监听地址,端口
1.1IP为:192.168.200.129
1.2端口为:2121
2使用vsftpd服务的被动模式
2.1下限端口为24500
2.2上限端口为24600
3限制vsftpd服务的并发数,传输速度
3.1限制并发客户连接最多200
3.2限制每个IP地址的连接数最多50
3.3限制匿名用户传输速率为50KB/s
3.4限制本地用户传输速率为200KB/s
[root@crushlinux ~]# netstat -naptu |grep"vsftpd"
[root@crushlinux ~]# vi/etc/vsftpd/vsftpd.conf
listen=YES
listen_address=192.168.200.129
listen_port=2121
pasv_enable=YES
pasv_min_port=24500
pasv_max_port=24600
max_clients=200
max_per_ip=50
anon_max_rate=50000
local_max_rate=200000
[root@crushlinux ~]# service vsftpdrestart
[root@crushlinux ~]# netstat -naptu |grep"vsftpd"
tcp 0 0 192.168.200.129:2121 0.0.0.0:* LISTEN 3552/vsftpd
构建基于虚拟用户的FTP服务
创建账号数据
1.建立虚拟FTP用户的帐号数据库文件
2.创建FTP根目录及虚拟用户映射的系统用户
3.建立支持虚拟用户的PAM认证文件
添加虚拟用户支持
4.在vsftpd.conf文件中添加支持配置
5.为个别虚拟用户建立独立的配置文件
启动服务并测试
6.重新加载vsftpd配置
7.使用虚拟FTP账户访问测试
1.建立虚拟FTP用户的帐号数据库文件用到db_load工具先安装软件包
[root@crushlinux ~]# rpm -ivh/mnt/Server/db4-utils-4.3.29-10.el5.i386.rpm
warning:/mnt/Server/db4-utils-4.3.29-10.el5.i386.rpm: Header V3 DSA signature: NOKEY,key ID 37017186
Preparing... ###########################################[100%]
1:db4-utils ########################################### [100%]
[root@crushlinux ~]# cd /etc/vsftpd/
[root@crushlinux vsftpd]# vi vusers.list 奇数行:用户名偶数行:密码
mike
123456
john
123456
jack
123456
通过db_load工具创建出BerkeleyDB格式的数据库文件
[root@crushlinux vsftpd]# db_load -T -thash -f vusers.list vusers.db
-f 指定数据原文件
-T 允许非Berkeley DB的应用程序使用文本格式转换的DB数据文件
-t hash 读取文件的基本方法
为了安全起见对权限进行严格控制
[root@crushlinux vsftpd]# chmod 600/etc/vsftpd/vusers.*
[root@crushlinux vsftpd]# ll -h/etc/vsftpd/vusers.*
-rw------- 1 root root 12K 09-24 11:27/etc/vsftpd/vusers.db
-rw------- 1 root root 25 09-24 11:26 /etc/vsftpd/vusers.list
2.创建FTP根目录及虚拟用户映射的系统用户
[root@crushlinux vsftpd]# useradd -d/var/ftproot -s /sbin/nologin virtual
[root@crushlinux vsftpd]# chmod 755/var/ftproot/
3.建立支持虚拟用户的PAM认证文件
[root@crushlinux vsftpd]# vi/etc/pam.d/vsftpd.vu
#%PAM-1.0
auth required pam_userdb.sodb=/etc/vsftpd/vusers
account required pam_userdb.sodb=/etc/vsftpd/vusers
对应第1步建立的vusers.db文件
4.在vsftpd.conf文件中添加支持配置
[root@crushlinux vsftpd]# vi/etc/vsftpd/vsftpd.conf
guest_enable=YES 启用用户映射功能
guest_username=virtual 指定映射的系统用户名称
pam_service_name=vsftpd.vu 指定新的PAM认证文件
5.为个别虚拟用户建立独立的配置文件
[root@crushlinux vsftpd]# vi /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_dir 用户配置目录支持
为用户mike、john建立独立的配置目录及文件
[root@crushlinux vsftpd]# mkdir/etc/vsftpd/vusers_dir
[root@crushlinux vsftpd]# cd/etc/vsftpd/vusers_dir
[root@crushlinux vusers_dir]# vi john
anon_upload_enable=YES
anon_mkdir_write_enable=YES
[root@crushlinux vusers_dir]# touch mike
[root@crushlinux vusers_dir]# touch jack
[root@crushlinux vusers_dir]# servicevsftpd restart
测试验证:
[root@crushlinux vusers_dir]# lftp192.168.200.129 -p 2121 -u john,123456
[root@crushlinux vusers_dir]# lftp192.168.200.129 -p 2121 -u mike,123456