FTP服务器

Posted 哭泣的馒头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FTP服务器相关的知识,希望对你有一定的参考价值。

一、简介

1、概述

FTP是File Transfer Protocol(文件传输协议)的英文简称,用于Internet上的文件的双向传输

使用FTP来传输时,具有一定程度的危险性,因为数据在因特网上面试完全没有受到保护的明文传输方式

2、工作流程

FTP会话包含两个通道,控制通道和数据通道,FTP的工作有两种方式,主动模式和被动模式

FTP服务器为参照物

主动模式,客户端提供数据端口,服务器主动连接客户端数据端口,

被动模式,客户端发送PASV命令,服务器提供数据端口,客户端连接服务器数据端口

a、主动模式

FTP服务器_数据

b、被动模式

FTP服务器_数据_02

3、vsftp传输模式

Binary模式:不对数据进行任何处理,适合进行可执行文件、压缩文件、图片等

ASCII模式:进行文本传输时,自动适应目标操作系统的结束符,如回车符

linux的红帽发行版中VSFTP默认采用的是Binary模式,这样能保证绝大多数文件传输后能正常使用

二、试验

1、环境介绍

基础环境:
192.168.10.132 ftp服务器
yum install -y vsftpd
192.168.10.131 ftp客户端
yum install -y ftp

环境要求
关闭防火墙:
systemctl stop firewalld ; systemctl disable firewalld
关闭selinux
sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config

配置文件介绍
/etc/vsftpd/vsftpd.conf:vsftpd 的核心配置文件
/etc/vsftpd/ftpusers:用于指定哪些用户不能访问FTP 服务器。 黑名单
/etc/vsftpd/user_list:指定允许使用vsftpd 的用户列表文件。 白名单

[root@k8s02 ~]# cat /etc/vsftpd/user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.

# 如果userlist_deny= YES(默认),绝不允许在这个文件中的用户登录ftp,甚至不提示输入密码
#prompt 提示
/etc/vsftpd/vsftpd_conf_migrate.sh:是vsftpd 操作的一些变量和设置脚本
/var/ftp/:默认情况下匿名用户的根目录

启动服务
systemctl start vsftpd
systemctl enable vsftpd

默认使用21端口
[root@k8s02 ~]# netstat -antup | grep ftp
tcp6 0 0 :::21 :::* LISTEN 8292/vsftpd

2、匿名用户

anonymous_enable=YES 是否允许匿名用户登录
write_enable=YES 是否允许登录用户有写权限
anon_root=/var/ftp 匿名用户登录后的目录,ftp目录不能是777权限属性,即匿名用户的家目录不能为777,(这个目录就是ftp用户的家目录)
[root@k8s02 ~]# cat /etc/passwd |grep ftp
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

anon_mkdir_write_enable=YES 是否允许匿名用户创建目录
anon_upload_enable=YES 是否允许匿名用户有上传文件权限
anon_world_readable_only=YES 允许匿名用户下载可阅读的文档
anon_other_write_enable=YES 允许匿名用户删除,重命名,覆盖
no_anon_password=YES 匿名用户登录时,不会询问密码
chown_uploads=YES 是否修改匿名用户上传文件的属主
chown_username=tom 设置匿名用户上传文件的属主名为tom
anon_umask=077 匿名用户上传文件的权限为700
anon_max_rate=0 限制最大传输速率(0为不限制)

FTP的匿名登录一般有三种:
1、 用户名:anonymous 密码:Email或者为空
2、 用户名:FTP 密码:FTP或者为空
3、 用户名:USER 密码:pass

案例一、匿名上传下载

服务器:
允许所有员工上传和下载文件,并允许创建用户自己的目录
anonymous_enable=YES #允许匿名
anon_upload_enable=YES #允许上传
anon_mkdir_write_enable=YES #允许匿名创建目录
anon_other_write_enable=YES #允许匿名删除文件,覆盖文件 权限有点大

systemctl restart vsftpd

mkdir /var/ftp/xiangmu
chown ftp.ftp /var/ftp/xiangmu
客户端:
touch test1..10

[root@k8s01 ~]# ftp 192.168.10.132
Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): ftp
331 Please specify the password.
Password: ###密码处直接回车
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

服务器:
ftp> cd /var/ftp/xiangmu ##切换目录
ftp> put test1 ###上传文件
ftp> mkdir dir_a ##创建目录
ftp> rename test1 test2 ##更改名字
ftp> rm dir_a ##删除目录
ftp> delete test1 ##删除文件,用rm没法删除文件

计算ftp服务器数据端口
ftp> mput test*
mput test1? y
227 Entering Passive Mode (192,168,10,132,23,151).
227 Entering Passive Mode (192,168,10,132,60,189).

ftp服务器数据端口:60*253+189=15369

坑一,重新登录匿名用户无法登陆

[root@k8s01 ~]# ftp 192.168.10.132
Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): ftp
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection

再次登录会显示匿名用户无法登录
从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。
要修复这个错误,可以用命令chmod a-w /var/ftp/去除用户主目录的写权限,注意把目录替换成你自己的。或者你可以在vsftpd的配置文件中增加:
allow_writeable_chroot=YES

3、本地用户

connect_from_port_20=YES #使用20作为数据端口
listen_port=9999 ##连接端口
pasv_enable=YES #开启被动模式
pasv_min_port=35000 ##数据端口最小
pasv_max_port=36000 ##数据端口最大

file_open_mode=0755 ##本地用户上传文件后的文件权限
ftpd_banner=Welcome #用户登录时显示的欢迎信息
userlist_enable=YES & userlist_deny=YES #禁止/etc/vsftpd/user_list文件中出现的用户名登录FTP
userlist_enable=YES & userlist_deny=NO #只允许/etc/vsftpd/user_list文件中出现的用户名登录FTP
ftpusers #禁止/etc/vsftpd/ftpusers文件中出现的用户登录FTP,权限比user_list更高,即时生效

local_enable=YES:允许本地用户登录
local_root=/var/www/html:设置所有本地用户的根目录
chroot_list_enable=YES:激chroot 功能
chroot_list_file=/etc/vsftpd/chroot_list:设置锁定用户在根目录中的列表文件。此文件存放要锁定的用户名
allow_writeable_chroot=YES :允许锁定的用户有写的权限
chroot_local_user=YES 将用户锁定在自己的家目录
1当chroot_list_enable=YES,chroot_local_user=YES时,chroot_list_file中的用户可以切换到其他目录,不在列表中的无法切换
2当chroot_list_enable=YES,chroot_local_user=NO时,chroot_list_file中的用户不可以切换到其他目录,不在列表中的可以切换
3当chroot_list_enable=NO,chroot_local_user=YES时,所有用户均不可以切换到其他目录
4当chroot_list_enable=NO,chroot_local_user=NO时,所有用户均可以切换到其他目录

useradd -s /sbin/nologin team1
useradd -s /sbin/nologin team2
echo "123456" | passwd --stdin team1
echo "123456" | passwd --stdin team2

用户是/sbin/nologin,需要在vi /etc/shells下面添加一行/sbin/nologin,否则这个类型的无法登录
[root@k8s01 ~]# ftp 192.168.10.132
Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): team1
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.

案例一、本地用户锁家目录

服务器:
anonymous_enable=NO 关闭匿名用户
allow_writeable_chroot=YES :允许锁定的用户有写的权限
chroot_local_user=YES 将用户锁定在自己的家目录

systemctl restart vsftpd
touch /home/team1/b
客户端:
[root@k8s01 ~]# ftp 192.168.10.132
Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): team1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd ###还是会显示根目录
257 "/"
ftp> ls
227 Entering Passive Mode (192,168,10,132,143,6).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Jan 04 11:15 b
226 Directory send OK.

案例二、根目录限制

team1不做修改,team2工作目录限制为/var/www/html

服务器:
allow_writeable_chroot=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
local_root=/var/www/html

mkdir /var/www/html -p
chmod a+w /var/www/html/ ##如果不加写入权限,会无法上传文件
touch /var/www/html/c ##方便查看当前目录下的文件
cat >/etc/vsftpd/chroot_list <<EOF
team2
EOF

systemctl restart vsftpd
客户端:
[root@k8s01 ~]# ftp 192.168.10.132
Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): team1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /home/team1 ###############会发现登陆以后也在新目录下面,只是没法切换目录
550 Failed to change directory.

[root@k8s01 ~]# ftp 192.168.10.132
Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): team2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /home/team2

ftp> cd /var/www/html/
ftp> put test1
ftp> delete test1
ftp> mkdir dir_a
ftp> rename dir_a dir_b
ftp> rm dir_b

案例三、开启被动模式,限制连接端口,数据端口

将原来的配置文件备份
cp vsftpd.conf vsftpd.conf.bk

配置连接端口为32000,数据端口限制到35000-36000
connect_from_port_20=NO
listen_port=32000
pasv_enable=YES
pasv_min_port=35000
pasv_max_port=36000
###如果最大端口和最小端口一致,那就数据端口限制死了只能通过指定端口
systemctl restart vsftpd

客户端:
[root@k8s01 ~]# ftp 192.168.10.132 32000
Connected to 192.168.10.132 (192.168.10.132).
220 (vsFTPd 3.0.2)
Name (192.168.10.132:root): team1
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,10,132,139,126). ##自动就是被动模式,数据端口139*256+126=35710
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Jan 七个办法只有一个有效:200 PORT command successful. Consider using PASV.425 Failed to establish connection.(代码片段

一句python代码搭建FTP服务

Java网络编程(读书笔记)

FTP服务器文件上传的代码实现

Java上传文件FTP服务器代码

ruby 使用Ruby Net :: FTP库的示例代码。登录FTP服务器,列出文件,检查目录是否存在,上传文件