一、FTP概述
samba :主要用于内网文件传输。
FTP :主要用于公网的文件传输,FTP本身的功能是明文传输,但是可以通过SSL加密保护。
FTP:文件传输协议。
FTP服务器。
在FTP的使用当中,用户经常遇到的两个概念:“下载”和“上传”。
下载:就是把文件从远程主机拷贝到自己的电脑上。
上传:就是把自己电脑上的文件拷贝到远程主机上。
0 - 1024端口 :特权端口
FTP连接及传输模式:
控制连接:TCP 21端口,用于发送FTP命令信息。
数据连接:TCP 20 端口,用于上传、下载数据。
数据连接的建立类型:
主动模式:
服务端从20端口主动向客户端发起的连接。
被动模式:(生产环境中更适合操作)
服务端在指定范围内某个端口被动等待客户端连接。
FTP用户的类型:
匿名用户:anonymous 或 ftp
本地用户:帐号名称、密码等信息保存在passwd、shadow文件中。
虚拟用户:将多个虚拟用户映射到一个真实的系统用户,系统用户作为接口登录。
FTP服务器搭建方式:
windows下常见有:
IIS、Serv-U
Linux下常见有:
wu-ftpd、Proftpd、vsftpd(RHEL)
FTP客户端常见程序:
CuteFTP、FlashFXP、LeapFTP、Filezilla、gftp、kuftp、
FTP命令(安装包ftp)
vsftp软件包:
官方站点:http://vsftpd.beasts.org/(翻墙)
主程序: /usr/sbin/vsftpd
服务名: vsftpd
用户控制列表文件:(用来对限制用户权限的)
/etc/vsftpd/ftpusers#目录中的用户不可登录
/etc/vsftpd/user_list#根据配置文件中的设置决定里面的用户可用与否。
主配置文件:
/etc/vsftpd/vsftpd.conf
设置虚拟用户步骤:
创建账号数据:
1、建立虚拟FTP用户的账号数据库文件;
2、创建FTP根目录及虚拟用户映射的系统用户;
3、建立支持虚拟用户的PAM认证文件;
添加虚拟用户支持:
4、在vsftpd.conf文件中添加支持配置;
5、为个别虚拟用户建立独立的配置文件;
启动服务并测试:
6、重新加载vsftpd配置;
7、使用虚拟FTP账户访问测试。
二、配置文件详解
1、匿名权限控制
anonymous_enable=YES#启用匿名访问。
ano_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#限制最大传输速率(字节/秒)。
2、本地用户权限控制
local_enable=YES#是否启用本地系统用户。
local_umask=022#本地用户所上传文件的权限掩码。
local_root=/var/ftp#设置本地用户的FTP根目录。
chroot_local_user=YES#是否将用户禁锢在主目录。
local_max_rate=0#限制最大传输速率(字节/秒)。
3、常用的全局配置项
listen_address=192.168.4.1#设置监听的IP地址。
listen_port=21#设置监听FTP服务的端口号。
write_enable=YES#是否启用写入权限。
download_enable=YES#是否允许下载文件。
max_clients=0#限制并发客户端连接数。
max_per_ip=0#限制同一IP地址的并发连接数。
Pasv_min_port=50000
Pasv_max_port=60000
#将客户端的数据连接端口改在50000-60000之间。
4、访问限制
userlist_enable=YES#是否启用user_list列表文件。
userlist_deny=YES#是否禁用user_list中的用户。
userlist_deny=NO#只允许user_list中的用户登录。
5、其它安全选项
connect_timeout=60#连接超时时间。
accept_timeout=60#处理的超时时间。
data_connection_timeout=300#数据连接超时时间。
idle_session_timeout=300#会话的建立连接时间。
ftpd_banner=xxx和banner_file=/path/file#是否启用欢迎信息。
tcp_wrappers=YES#是否启用tcp_wrappers支持。
三、安装与实验
1、安装环境
服务器端:
yum -y install vsftpd
service vsftpd start
iptables -F
setenforce 0
客户端:
yum -y install ftp
登录方式:
ftp 192.168.216.155
2、匿名的验证方式(服务器IP:1.1.1.5)
安装好环境后进入客户端使用ftp登录:
ftp 1.1.1.5
#回车后提示要输入用户名,默认输入ftp就可以了。
#匿名模式不用输入密码,直接回车。
#登录成功后标志。
#登录失败后标志。
# !可用于退出登录。
#匿名登录后默认目录,/var/ftp/。
#进入服务器端可见。
使用匿名ftp搭建yum源服务器:
安装好环境后进行
服务器端设置:
cd /var/ftp/pub/#进入到ftp默认登录目录。
mkdir leng/#设置一个挂载目录。
chmod 777 leng#给目录设置最大权限。
umount /dev/sr0#卸载之前挂载的光盘,没挂可省。
mount /dev/sr0 /var/ftp/pub/leng/
#挂载到leng目录。
service vsftpd restart
#重启服务。
客户端设置:
cd /etc/yum.repos.d/
#进入到yum源目录。
rm -rf *
#删除当前目录下所有文件
vi leng.repo
[leng]
name=yum server
baseurl=ftp://1.1.1.5/pub/leng/
enabled=1
gpgcheck=0
#设置客户端yum源目录路径。
yum list
#发现yum 搭建成功。
测试上传下载:
安装好环境后进行
服务器端设置:
cd /var/ftp/pub/
#进入ftp登录目录
touch 1.txt
#建立一个测试文件
vim /etc/vsftpd/vsftpd.conf
#进入到vsftpd服务配置文件,ftp默认只允许下载,上传需要修改配置文件。
anon_upload_enable=YES
#取消这一行的注释,表示允许上传数据到服务器,保存退出。
service vsftpd restart
#重启服务,这样就可以了嘛?
在Linux中,除了对服务要有写权限,还要对目录有写权限。建议不要去改目录权限。
chown ftp /var/ftp/pub
#修改目录所属主
客户端设置:
touch 2.txt
#新建一个用户测试的文件
ftp 1.1.1.5
#登录ftp服务器,匿名方式登录
#不用密码直接回车
#下载文件成功
#上传文件成功
测试限制端口使用范围:
环境搭建好后
服务器端设置:(用本地用户测试)
useradd leng
passwd leng
#新建用户leng,密码123.
vi /etc/vsftpd/vsftpd.conf
pasv_enable=YES
pasv_min_port=50000
pasv_max_port=50005
#在文件尾加入三行,开启被动端口范围,限制在(50000-50005)之间。
anon_upload_enable=YES
#取消这一行的注释,允许上传文件。
service nsftp restart
客户端设置:
dd if=/dev/zero of=8.txt bs=1M count=800
#建立一个大一点的文件用于上传到服务器测试端口,测试速度要快,实在不行,文件大一点,也可先在服务器端打好命令。
ftp 1.1.1.5
#用本地用户登录,必须输入密码。
put 8.txt
#FTP登录后上传文件
切换到服务器:
netstat -anpt
#发现限制端口范围生效了。
测试设置用户限制:
环境搭建好后
服务器端设置:
新建二个用户mm、nn,设置好密码。
vi /etc/vsftpd/vsftpd.conf
userlist_enable=YES
#默认是开启的。
vi /etc/vsftpd/user_list
mm
#在文件尾加入mm用户。
客户端:
ftp 1.1.1.5
#先登录mm,发现登录不了。
再登录nn:
#登录成功。
#如果把userlist_enable=YES改为userlist_enable=NO,发现,mm和nn用户都能登录。
#如果userlist_enable=YES,再加上userlist_deny=NO,发现,mm能登录,nn不能登录。
#在/etc/vsftpd/下有个文件ftpusers,里面是禁止登录的用户,优先级更高于user_list文件。如果把mm再加入到ftpusers文件中,不用重启服务,会发现mm用户不能再登录了,ftpusers文件默认生效。
四、设置虚拟用户
虚拟用户:为了防止在服务器上创建过多的用户
实验前请确定FTP配置文件中没有是初始的。
yum -y install vsftpd
#安装服务器端所需要的文件
1、建立虚拟FTP用户的账号数据库文件,文件名任意取,文件中内容奇数行写用户名,偶数行写密码,一行只能定义一个用户名。
cd /etc/vsftpd/
vi ceshi.list
#新建文件用于写入用户和密码,加入以下虚拟用户:
db_load -T -t hash -f ceshi.list ceshi.db
#把数据文件用hash算法转换成 .db 数据库文件
chmod 600 ceshi.*
#设置用户密码文件除管理员外其他人不可见。
2、创建FTP根目录及虚拟用户映射的系统用户;
useradd -d /home/ceshi -s /sbin/nologin ceshi
#创建一个普通用户,指定用户家目录并设置该用户不可登录。
cd /home
chmod 755 ceshi/
#设置用户家目录权限
3、建立支持虚拟用户的PAM认证文件;
cd /etc/pam.d/
cp vsftpd vsftpd.pam
#备份一个PAM认证文件
vi vsftpd.pam
#打开文件进行修改设置
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/ceshi
account required pam_userdb.so db=/etc/vsftpd/ceshi
#指定认证的信息,删除文件多余信息。
#设置用户认证文件
添加虚拟用户支持:
4、在vsftpd.conf文件中添加支持配置;
cd /etc/vsftpd
vi vsftpd.conf
#在文件尾加入
guest_enable=YES
#启用虚拟用户认证
guest_username=ceshi
#设置虚拟用户认证所用的真实系统用户名称
pam_service_name=vsftpd.pam
#指定认证的文件名
user_config_dir=/etc/vsftpd/config
#指定配置文件目录(自定义)
5、为个别虚拟用户建立独立的配置文件;
cd /etc/vsftpd/
mkdir config/
touch user1 user2 user3
#新建三个文件和虚拟用户名一样的文件。
vi user1
anon_upload_enable=YES
#设置user1可上传的权限。
vi user2
anon_mkdir_write_enable=YES
#设置user2可创建目录权限。
#user3不作修改,使用默认权限。
启动服务并测试:
6、重新加载vsftpd配置;
service vsftpd restart
iptables -F
setenforce 0
7、使用虚拟FTP账户访问测试。
touch aa bb cc
#客户端建立测试文件
ftp 1.1.1.5
#使用FTP远程登录,先测试user1,登录密码123。
#上传成功,退出登录,再使用user2用户登录
#上传失败,创建目录成功,再使用user3用户登录
#无法创建目录也无法上传文件
#由于下载没有做出限制,所以,所有用户都可下载。
五、FTP+SSL
1、用FTP服务器做实验抓取user1登录的用户名和密码:
tcpdump port 21 -nA
使用虚拟用户user1在客户端登录
ftp 1.1.1.5
#再去服务器端查看, 发现里面的内容有这么两条,刚好是登录的用户名和密码。
原因:
FTP默认是明文传输。
解决:
使用FTP+SSL
查看FTP是否支持SSL
2、FTP+SSL
openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem
openssl:指定给SSL加密的命令。
req:生成。
-new:表示新建一个证书。
-x509:证书的格式。
-nodes:表示在生成证书的时候,指定不为证书生成默认的加密程序(默认新建证书会生成一个密码保护)。
-out :指定证书的名字。
-keyout:指定私钥的文件名。
国家——省/州——城市——公司——组织——服务器——邮件地址
#命令回车后输入的信息分别是
chmod 400 vsftpd.pem
#设置文件权限为400
cp vsftpd.pem /etc/ssl/certs/
#把证书拷贝到默认的目录
vi /etc/vsftpd/vsftpd.conf
ssl_enable=YES
#启用加密证书
allow_anon_ssl=YES
#允许匿名用户使用加密程序
force_local_data_ssl=YES
#强制本地用户数据传输时使用SSL。
force_local_logins_ssl=YES
#强制本地用户登录时使用SSL。
force_anon_data_ssl=YES
#强制匿名用户数据传输时使用SSL。
force_anon_logins_ssl=YES
#强制匿名用户登录时使用SSL。
ssl_tlsv1=YES
#指定加密时使用的协议
ssl_sslv2=NO
ssl_sslv3=NO
#加密协议一共三个,不使用的也必须指定。
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
#指定证书所在位置
#保存退出
service vsftpd restart
tcpdump port 21 -nA
#监听21端口信息
#使用远程工具登录连接后,再去看服务器,发现密码已经找不到了。
********************
注意事项:
********************
1、FTP不允许上传目录,可压缩或直接在服务器上建立目录,不过FTP默认不允许建立目录的,要建立目录,取消anon_mkdir_write_enable=YES前的注释。
2、FTP中不支持 rm 命令,删除目录要用 rmdir 命令。
3、本地用户登录,如果没有设限制,默认是家目录以外的目录的,,在服务器上不安全,开启chroot_local_user=YES 选项就可。
4、FTP默认所有可登录用户都是可下载文件的。
5、客户端使用 ? 查看FTP是可使用的命令。
6、客户端使用 ! 退出,会清空你之前输入的历史命令,而 exit 命令退出不会。(发现exit好像不是退出连接)
7、搭建FTP服务器,根目录用需要分太大的空间,用户上传的文件都上传到家目录,所以应该多分给 home 目录。
8、/etc/vsftpd/ftpusers文件中出现的任何用户名都不允许登录FTP,不管userlist中如何设置。
9、虚拟用户可设置每个用户的不同访问权限,而本地用户不行。