|
FTP原理:
FTP是相当古老的传输协议之一,最主要的功能是在服务器与客户端之间进行文件的传输。使用的是明文传输方式,为了更安全的使用FTP协议,这里使用较为安全但功能较少的vsftpd。
FTP功能介绍:
1 不同等级的用户身份:user guest anonymous
不同的身份,权限也不同
2 命令记录与登录文件记录
FTP可以利用系统的rsyslogd来进行数据的记录
3 限制用户活动的目录:(change root)
FTP可以限制用户仅能在自己的家目录中活动
FTP的工作流程:
FTP传输使用的是TCP协议
简单的联机流程如下:
1 建立命令通道的联机
客户端随机取一个大于1024以上的端口(port AA)来与FTP服务器端的port 21联机。这个过程需要三次握手。
2 通知FTP服务器端使用active且告知连接的端口
FTP服务器的21端口主要用在命令的下达,但在数据传输时,就不是使用这个联机了。客户端在需要数据的情况下,会告知服务器端要用什么方式来联机,如果是主动式(active)联机时,客户端会先随机启用一个端口(图中的portBB),且通过命令通道告知FTP服务器这两个消息
3 FTP服务器主动向客户端联机
FTP服务器由命令通道了解客户端的需求后,会主动的由20端口向客户端的port BB联机,这个联机也要三次握手。此时FTP的客户端与服务器端会建立两条联机,分别是命令的下达与数据的传递。而预设FTP服务器端使用的主动联机端口就是20.
注:数据传输通道是在有数据传输的时候才会建立的,并不是一开始连接到FTP服务器就立刻建立的通道。
客户端选择被动式联机模式:
1 用户与服务器建立命令通道
同样需要建立命令通道,通过三次握手就可以建立。
2 客户端发出PASV的联机要求
当有使用数据通道的指令时,客户端可通过命令通道发出PASV的被动式联机要求,并等待服务器的回应。
3 FTP服务器启动数据端口,并通知客户端联机
如果你的FTP服务器是能够处理被动式联机的,此时FTP服务器会先启动一个端口在监听。这个端口是随机的,也可以自定义某一范围的端口。然后你的FTP服务器会通过命令通道告知客户端已经启动的端口(图中的port PASV),并等待客户端的联机。
4 客户端随机取用大于1024的端口进行连接
你的客户端会随机取用一个大于1024的端口来对主机的port PASV联机。如果顺利的话,你的FTP数据就可以通过 port BB及port PASV来传送了。
被动式FTP数据通道的联机方向是由客户端向服务器端联机。这样在NAT内部的客户端主机就可以顺利地连接上FTP Server。
vsftpd服务器基础设定
vsftpd全称是very secure FTP daemon的意思。
所需软件:yum install vsftpd
主要配置文件:
/etc/vsftpd/vsftpd.conf
整个vsftpd的配置文件就只有这个文件,这个文件的设定是以bash的变量设定相同的方式来处理的,也就是参数=设定值,等号两边不能为有空格。
/etc/pam.d/vsftpd
这个是vsftpd使用PAM模块时的配置文件。主要用来身份认证之用,还有一些用户身份抵挡的功能。
[iyunv@centos ~]# cat /etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
上面file后面接的文件是就是限制使用者无法使用vsftpd。你的限制文件不一定要使用默认值,也可以在这个文件里进行修改。
看看这个默认限制文件
/etc/vsftpd/ftpusers
[iyunv@centos ~]# cat /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
一行一个帐号,如果你还想要让某些使用者无法登录,写在这个文件是最快的。
/etc/vsftpd/user_list
这个文件是否能够生效vsftpd.conf内的两个参数有关,分别是userlist_enable userlist_deny
/etc/vsftpd/user_list与/etc/vsftpd/ftpusers几乎一模一样,在预设情况下,你可以将不希望登录vsftpd的帐号写在这里。不过这个文件的功能会依据vsftpd.conf配置文件内的userlist_deny={YES/NO}而不同。
/etc/vsftpd/chroot_list
这个文件预设不存在,必须手动自行建立。这个文件的主要功能是可以将某些帐号的使用者chroot在它们的家目录下,但这个文件生效与vsftpd.conf内的chroot_list_enable chroot_list_file两个参数有关。
/usr/sbin/vsftpd
这是vsftpd的主要执行文件
/var/ftp/
这个是vsftpd的预设匿名者登录的根目录,其实与ftp这个帐号的家目录有关。
vsftpd.conf详细设定值见 <<鸟哥私房菜服务器篇第三版>>
vsftpd启动
利用stand alone方式启动vsftpd
[iyunv@centos ~]# /etc/init.d/vsftpd start
Starting vsftpd for vsftpd: [ OK ]
[iyunv@centos ~]# netstat -plunt | grep 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 4955/vsftpd
如果你的FTP很少被使用,利用super daemon来管理也是个好主意。
vim /etc/vsftpd/vsftpd.conf
# 找到 listen=YES 这一行:大约在 109 行左右啦,并将它改成:
listen=NO
修改下super daemon的配置文件,自行建立/etc/xinetd.d/vsftpd文件
yum install xinetd<==假设 xinetd 没有安装时
[iyunv@centos ~]# vim /etc/xinetd.d/vsftpd
service ftp
{
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
log_on_success += DURATION USERID
log_on_failure += USERID
nice = 10
disable = no
}
[iyunv@centos ~]# /etc/init.d/vsftpd stop
Shutting down vsftpd: [ OK ]
[iyunv@centos ~]# /etc/init.d/xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
[iyunv@centos ~]# netstat -plunt | grep 21
tcp 0 0 :::21 :::* LISTEN 5101/xinetd
vsftpd.conf配置如下:这里介绍匿名帐号登录而已
# anon configuration
anonymous_enable=YES
write_enable=YES
anon_world_readable_only=YES
anon_other_write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
no_anon_password=YES
anon_max_rate=0
anon_umask=022
# server configuration
dirmessage_enable=YES
connect_from_port_20=YES
listen=YES
listen_port=21
connect_timeout=600
#accept_timeout=600
data_connection_timeout=600
idle_session_timeout=600
max_clients=10
max_per_ip=1
#pasv_min_port=65510
#pasv_max_port=65520
banner_file=/etc/vsftpd/welcome.txt
use_localtime=YES
local_enable=NO
# system configuration
xferlog_enable=YES
xferlog_file=/var/log/xferlog
pam_service_name=vsftpd
tcp_wrappers=YES
匿名用户取得的身份是ftp
chown ftp /var/ftp/pub
允许匿名者建立 删除 修改文件与目录的权限
这样最简单的FTP服务器就搭建好了!
让vsftpd增加SSL的加密功能
检查vsftpd是否支持ssl模块
[iyunv@centos vsftpd]# ldd $(which vsftpd) | grep ssl
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f35f03d5000)
出现如上字样表示支持
建立给vsftpd使用的凭证数据
[iyunv@centos certs]# cd /etc/pki/tls/certs/
[iyunv@centos certs]# make vsftpd.pem
umask 77 ;
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ;
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ;
/usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 -set_serial 0 ;
cat $PEM1 > vsftpd.pem ;
echo "" >> vsftpd.pem ;
cat $PEM2 >> vsftpd.pem ;
rm -f $PEM1 $PEM2
Generating a 2048 bit RSA private key
...........................................+++
.................................................................................+++
writing new private key to '/tmp/openssl.3ftr2M'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:FuJian
Locality Name (eg, city) [Default City]:FuQing
Organization Name (eg, company) [Default Company Ltd]:FJSF
Organizational Unit Name (eg, section) []:DIC
Common Name (eg, your name or your server's hostname) []:yao
Email Address []:yao3690093@163.com
[iyunv@centos certs]# cp -a vsftpd.pem /etc/vsftpd/
[iyunv@centos certs]# ll /etc/vsftpd/vsftpd.pem
-rw-------. 1 root root 3072 Oct 9 20:40 /etc/vsftpd/vsftpd.pem
修改vsftpd.conf的配置文件 假设有实体、匿名帐号
[iyunv@www ~]# vim /etc/vsftpd/vsftpd.conf
# 实体账号的一般设定项目:
local_enable=YES
write_enable=YES
local_umask=002
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
local_max_rate=10000000
# 匿名者的一般设定:
anonymous_enable=YES
no_anon_password=YES
anon_max_rate=1000000
data_connection_timeout=60
idle_session_timeout=600
# 针对 SSL 所加入的特别参数!每个项目都很重要!
ssl_enable=YES
<==启动 SSL 的支持
allow_anon_ssl=NO
<==但是不允许匿名者使用 SSL 喔!
net.qiang@hotmail.com
force_local_data_ssl=YES
<==强制实体用户数据传输加密
force_local_logins_ssl=YES <==同上,但连登入时的帐密也加密
ssl_tlsv1=YES
<==支持 TLS 方式即可,底下不用启动
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/vsftpd/vsftpd.pem <==预设 RSA 加密的凭证档案所在
# 一般服务器系统设定的项目:
max_clients=50
max_per_ip=5
use_localtime=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
tcp_wrappers=YES
banner_file=/etc/vsftpd/welcome.txt
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
pasv_min_port=65400
pasv_max_port=65410
服务重启
[iyunv@centos vsftpd]# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
实体、匿名帐号一起的时候,实体帐号就是登录不上,不知道是不是我哪里错误,还是。。。
|
|