应用层协议ftp监听在tcp协议的21号端口,ftp的连接模式分为命令连接和数据连接两种,命令连接为管理类连接,只传输数据,数据连接按需传送及时关闭。两种连接方式都可以打开多个。上传数据或下载数据的端口是随机的,是50000+端口。ftp是明文传输。


安装


安装vsftpd:

yum -y install vsftpd ftp

        vsftpd是服务端,ftp是客户端,使用rpm -ql vsftpd可以查看安装信息,/usr/sbin/vsftpd是主程序文件。匿名用户默认目录,也是共享文件资源目录:/var/ftp/pub。


vsftpd的三种用户模式:

        1、匿名用户:系统自动映射为ftp用户,共享资源位置为/var/ftp目录,使用finger ftp命令即可查看到该用户的信息,该用户实际也是linux用户。

        2、系统用户:用户默认登陆的位置为linux系统的家目录。

        3、虚拟用户:给虚拟用户指定映射为一个系统用户,访问的为这个用户的家目录。虚拟用户仅用于访问特定服务中的资源。


使用


windows客户端登陆ftp:

        一般windows都会有ftp客户端,使用cmd工具即可登录。ftp默认登录的是默认匿名用户anonymous或ftp,密码为空,登录后使用ls命令可查看目录下的文件,使用help命令可查看命令列表。

C:\Users\thinkpad>ftp 192.168.96.128
连接到 192.168.96.128。
220 (vsFTPd 2.2.2)
200 Always in UTF8 mode.
用户(192.168.96.128:(none)): ftp     #账户为匿名账户anonymous或ftp
331 Please specify the password.
密码:                      #密码为空
230 Login successful.


客户端工具lftp:支持命令补全

安装:

yum installl lftp -y

登陆:

lftp qiyang@192.168.96.128
lftp -u qiyang 192.168.96.128

lftpget:调用lftp直接下载文件。还有其他工具,axel、wget、curl


客户端常用命令:tab命令提示

        lcd                切换本地目录

        cd                 切换服务器目录

        get               下载命令

        mget            一次下载多个文件

        put              上传文件

        mput            一次上传多个文件

        mkdir           创建目录

        rename        修改文件名

查看更多命令的使用方法使用: help  command,如: help ls


vsftpd.conf的配置

主配置文件:重启生效

/etc/vsftpd/vsftpd.conf

用户设置:

anonymous_enable=YES #启用匿名用户
local_enable=YES     #允许本地用户,就是linux系统上的用户


匿名用户上传文件:

匿名用户目录默认位置:

/var/ftp/pub/

开启匿名用户上传权限:

配置文件中:开启匿名上传

anon_upload_enable=YES

设置facl权限:

mkdir /var/ftp/upload
setfacl -m ftp:rwx upload

切换本地目录:客户端使用匿名用户anonymous登录

lcd /etc

切换服务器端目录:

cd upload

上传文件:

put fstab


匿名用户创建文件:

anon_mkdir_write_enable=YES #允许匿名用户创建目录


匿名用户删除目录:客户端使用delete filename删除目录

anon_other_write_enable=YES

本地用户写权限:本地用户的写写权限

write_enable=YES


显示欢迎信息:

        dirmessage_enable=YES,切换到某个目录是否显示欢迎信息,欢迎信息只要在那个目录下创建 .message隐藏文件就可以了。


上传后的文件权限:用户上传文件后文件的默认权限。

local_umask=022


锁定所有用户家目录:

chroot_local_user=YES
allow_writeable_chroot=YES

        将本地用户锁定在家目录中。在2.3.5版本之前只要开启第一项即可,在此之后的版本都要开启第二项,或者去掉用户家目录的写权限chmod a-w /home/username,a表示所有用户。两种方式选一种即可。因为2.3.5之后要求跟目录默认不可写。而allow_writeable_chroot这一项定义了根目录可写。


锁定部分用户家目录:

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES

        有时候某些用户需要锁定家目录,有些则不需要。这个功能是将指定用户的家目录锁定,这两个选项第一个选项是开启锁定家目录功能,第二个功能是指定要锁定用户的列表,在这个列表里面的用户都会被锁定家目录。第三项是允许根目录可写。


开启日志:

xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES

        第一项是否打开传输日志,日志信息包括上传下载等信息。第二项指定日志文件,日志文件默认位置在 /var/log/xferlog,第三项表示是否启用标准格式。


上传文件的属主:

chown_uploads=YES
chown_username=whoever

第一项表示上传后文件的属主是否改变,第二项表示把属主改为谁的,后面的值为用户名。


会话控制:

idle_session_timeout=600
data_connection_timeout=120

        第一项是空闲超时时长,第二项是数据连接超时时长,如下载数据断开又没有任何操作时的超时时长,超过这个时间就会断开连接。


传输编码:

ascii_upload_enable=YES #文本模式上传文件,强制性,不建议开启
ascii_download_enable=YES #文本模式下载文件,强制性,不建议开启


使用pam用户认证:

        pam_service_name=vsftpd,pam是linux系统内置共用的用户认证模块,vsftpd默认使用pam功能实现用户认证。每个使用pam的应用都要提供一个单独为自己服务的配置文件。这个参数的后面就是这个配置文件的名称。pam配置文件的目录在/etc/pam.d/下,这个目录下有一个vsftpd的文件。这个文件配置了vsftpd的认证方式。

黑名单功能:

        所有写在/etc/vsftpd/ftpusers文件中的所有用户都禁止登陆,这个文件的路径是在/etc/pam.d/vsftpd文件中定义的。这个是基于pam的功能实现的,下面有一个vsftpd自己的访问控制功能。


访问控制:

userlist_enable=YES
userlist_deny=YES

        第一项表示是否开启访问控制功能,第二项表示这个访问控制的类型,userlist deny表示是否拒绝访问,当值等于YES时就是表示拒绝,为NO时表示不拒绝。这个名单文件为/etc/vsftpd/user_list文件,相当于黑名单或白名单。

连接限制:

max_clients=  # 最大并发连接量
max_per_ip=   # 每个ip最大连接数
anno_max_rate  #匿名用户最大传输速率,单位字节/秒
local_max_rate #本地用户最大传输速率

其他:

listen=YES #是否定义为独立守护进程

虚拟用户:

        虚拟用户被映射为某个系统用户,但是虚拟用户可以有不同的访问权限。虚拟用户的账户的存储方式有两种。

        第一种为通过文件形式存储,将一个文件的第一行写上用户名第二行写上用户密码,如此格式的文件,再将文件编码为hash格式。

        第二种方式是将行号和密码存放在关系型数据库中,常用的为mysql,但是vsftpd依赖于pam实现认证,这就需要pam能够访问mysql数据库,此时就需要用到pam_mysql模块了,默认情况下pam没有此模块,需要安装第三方模块。

        安装pam_mysql模块需要epel yum源,yum install pam_mysql。

配置文件:

anonymous_enable=YES
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=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

# 修改目录权限,权限755,777访问不了
local_root=/home/disk2
chroot_local_user=YES
anon_root=/home/disk2


匿名用户上传配置:

cat /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES
anon_mkdir_write_enable=YES
# 匿名用户不提示密码
no_anon_password=YES
# 设置匿名用户为ftp,默认为anonymous
ftp_username=ftp
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=NO
listen_ipv6=YES
 
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

设置目录权限:直接设置777

chmod -R 777 /var/ftp/pub


sftp


创建用户:

mkdir /data/user1 -pv # 以root用户创建
useradd user1 -s /sbin/nologin -d /data/user1/user1 # /data/user1/这一段属主必须为root,后面要做chroot, /data/user1/user1这级目录才是用户的家目录

配置只允许sftp登陆,不允许ssh:

vim /etc/ssh/sshd_config

PasswordAuthentication no # 在全局处关闭密码登录,关闭后只能使用秘钥方式登录(ftp用户在User模块中打开密码登录)
ChrootDirectory none # 公共的关掉
Subsystem       sftp    internal-sftp # internal-sftp表示使用内部的sftp子系统来处理sftp请求,可提高安全性

Match User user1
       PasswordAuthentication yes
       X11Forwarding no
       AllowTcpForwarding no
       PermitTTY no
       ForceCommand internal-sftp
       ChrootDirectory /data/user1/ # 指定到/data/user1/而不是/data/user1/user1,有些客户端用户登录的时候默认是到/data/user1/也就是用户的根目录,里面还有一个user1就是用户端的home目录

Match User user2 #使用User模块对用户user2进行详细配置
       PasswordAuthentication yes # 针对user2用户打开密码登录
       X11Forwarding no #禁止X11转发,防止用户在通过SSH连接后使用图形界面程序
       AllowTcpForwarding no #禁止TCP转发,避免用户通过SSH隧道访问其他服务
       PermitTTY no #不允许用户获取完整的shell终端,即使其登录成功也无法执行命令
       ForceCommand internal-sftp #限制用户只能执行sftp中的命令
       ChrootDirectory /data/user2/

登陆测试:ssh不可登陆测试。

~]# ssh algo@192.168.199.8
algo@192.168.199.8's password: 
PTY allocation request failed on channel 0
This service allows sftp connections only.
Connection to 192.168.199.8 closed.

sftp测试:

随便找个客户端,端口为22


只允许ftp密码登录禁止ssh密码登录:如果想ssh登录到节点只能用秘钥的方式登录。

PasswordAuthentication no # 全局的关掉密码登录

Match User user1
       PasswordAuthentication yes # 针对特定的用户可以打开密码登录
       X11Forwarding no
       AllowTcpForwarding no
       PermitTTY no
       ForceCommand internal-sftp
       ChrootDirectory /data/user1/

然后针对特定用户可以在/etc/passwd中设置/sbin/nologin来禁止登录,这样实现的效果就是用账号密码可以登录ftp但是无法登录ssh。