FTP服务器

1、FTP的数据传输原理

1.1、FTP功能简介

  1. 不同等级的用户身份:user、guest、anonymous

    FTP服务器在默认的情况下,依据用户登录的情况而分为三种不同的身份,分别是:1、实体用户,real user;2、访客,guest;3、匿名用户,anonymous。这三种用户在系统上面的权限差异特别大。

  2. 命令记录与日志文件记录

    FTP可以利用系统的syslogd来进行数据的记录,而记录的数据包括了用户曾经使用过的命令与用户传输数据(传输时间、文件大小等)的记录,你可以在/var/log/里面找到。

  3. 限制用户活动的目录:(change root,简称chroot)

    为了避免用户在你的Linux系统上随意逛大街(意思是离开用户主目录而进入到Linux系统的其他目录),所以将用户的工作范围局限在用户主目录下。如此一来,由于用户无法离开自己的用户主目录,而且登录FTP后,显示的根目录就是自己用户的主目录的内容,这种环境称为change root,简称chroot,即改变根目录的意思


1.2、FTP的工作流程与使用到的端口

FTP服务器使用了两个连接,分别是命令通道与数据流通道,因为都是TCP数据包,这两个连接都需要经过三次握手。下面以FTP默认的主动式连接来说明:

1.2.1、主动式连接使用到的端口号

  • 命令通道的ftp(默认是port 21)
  • 数据传输的ftp-data(默认是port 20)

重要是:**两者的连接发起端是不一样的!!!**首先port 21主要接受客户端的主动连接,至于port 20则为FTP服务器主动连接至客户端。

1.2.2、在主动连接的FTP服务器与客户端之间具有防火墙的情况

很多局域网都会使用防火墙的NAT功能,那么在NAT后端的FTP客户端如何连接到FTP服务器呢?

  • 用户与服务器命令通道的建立

    因为NAT会主动地记录由内部送往外部的连接信息,而由于命令通道的建立是由客户端向服务器连接的,因此这一条连接是可以顺利进行的。

  • 用户与服务器间数据通道建立时的通知

    同样,客户端会先启用port BB,并利用命令通道告知FTP服务器,且等待服务器端的主动连接。

  • 服务器主动连接到NAT等待转递至客户端的连接问题

    但是由于通过NAT的转换后,FTP服务器只能得知NAT的IP而不是客户端的IP,因此FTP服务器会以port 20主动向NAT的port BB 发送主动连接请求。但NAT并没有启动port BB来监听FTP服务器的连接。

    连接问题所在了吗?在FTP主动式连接中,NAT将会被视为客户端,但NAT其实并非客户端。如果你曾在IP路由器后面连接某些FTP服务器时,可能偶尔发现明明已经连接上了,但就是无法获取文件列表,可能就是这个原因。

解决方法:


1.3、客户端选择被动式连接模式

不同点在于:被动式FTP数据通道的连接方向是由客户端向服务器端连接的


1.4、开放什么身份的用户登录

1.4.1、开放实体用户的情况

很多FTP服务器默认就开启了允许实体用户登录,但开放实体用户时的建议如下:

  • 使用代替的FTP方案较好。由于实体用户本就可以通过网络连接到主机进行工作(例如SSH),因此实在没必要开放FTP服务,比如sftp就可以传输文件
  • 限制用户能力,如chroot与/sbin/nologin等。最简单的方式是通过PAM模块处理,譬如vsftpd这个软件默认可以通过/etc/vsftpd/ftpusers这个文件设置不想让它具有登陆权限的FTP用户

1.4.2、访客身份(guest)

在通常会建立guest身份的案例中,多半是由于服务器提供了类似于个人Web首页的功能给一般身份用户。建议如下:

  • 仅提供需要登录的账号即可,不需要提供系统上面所有人均可登录的环境
  • 在服务器的设置当中,我们需要针对不同的访客给他们不一样的用户主目录,而这个主目录要与用户的权限相符合
  • 针对这样的用户身份,需要设置较多的限制,包括:上传、下载文件数目与硬盘容量等的限制、连接登录的时间限制、许可使用的命令限制

1.4.3、匿名登录用户(anonymous)

很危险的开放


1.5、vsftpd服务器基础设置

1.5.1、所需要的软件以及软件架构

[root@server ~]# yum install vsftpd -y
重要的文件 说明
/etc/vsftpd/vsftpd.conf 主要配置文件
/etc/pam.d/vsftpd 使用PAM模块时的相关配置文件
/etc/vsftpd/ftpusers 与上一个文件有关系,也就是PAM模块所指定的那个无法登陆的用户配置文件
/etc/vsftpd/user_list 这个文件是否生效与vsftpd.conf内的两个参数有关,分别是userlist_enable和userliat_deny有关。如果说/etc/pam.d/vsftpd是PAM模块的阻挡访问设置,那么/etc/vsftpd/user_list则是vsftpd自定义的阻挡访问设置。
/etc/vsftpd/chroot_list 默认不存在,可以手动建立。如果你想把一些实体用户限制在它们的用户主目录下而不允许到其他地方去,可以使用这个。但这个文件的生效还与vsftpd.conf内的两个参数有关,chroot_list_enable、chroot_list_file。
/usr/sbin/vsftpd 主要执行文件
/var/ftp/ vsftpd默认匿名用户登录的根目录。其实与ftp这个账号的用户主目录有关
[root@server ~]# 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[root@server ~]# 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[root@server ~]# 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.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

1.5.2、vsftpd.conf配置值说明

vsftpd.conf配置值 说明

1.5.3、启动vsftpd

[root@server ~]# systemctl start vsftpd
[root@server ~]# systemctl enable vsftpd
[root@server ~]# netstat -tnlup | grep vsftpd
tcp6       0      0 :::21                   :::*                    LISTEN      7939/vsftpd

1.5.4、vsftpd的默认值

[root@server ~]# vim /etc/vsftpd/vsftpd.conf
#与匿名用户有关
anonymous_enable=YES       #支持匿名用户登录
#与实体用户有关
local_enable=YES       #支持实体用户登录
write_enable=YES       #允许上传数据
local_umask=022            #建立新目录(755)与文件(644)的权限
#与服务器环境有关
dirmessage_enable=YES      #若目录下有.message则会显示该文件内容
xferlog_enable=YES         #启动日志文件记录,记录于/var/log/xferlog
connect_from_port_20=YES   #支持主动模式连接功能
xferlog_std_format=YES     #支持WuFTP的日志文件格式
listen=NO                  #不支持stand alone方式启动
listen_ipv6=YES
pam_service_name=vsftpd        #支持PAM模块的管理
userlist_enable=YES            #支持/etc/vsftpd/user_list文件内的账号登录控制
tcp_wrappers=YES           #支持TCP Wrappers的防火墙机制

默认设置启动后可以得到以下功能:

  • 你可以使用anonymous这个匿名账号或其他实体账号登录;
  • anonymous的用户主目录在/var/passwd,且无法上传文件,也被chroot了;
  • 实体用户可参考/etc/passwd,并没有被chroot,可前往任何有权限的目录;
  • 任何于/etc/passwd中的用户均无法使用PAM;
  • 可利用/etc/hosts.{allow|deny}做简单的防火墙;
  • 当客户端有任何上传/下载信息时,该信息会被记录在/var/log/xferlog中;
  • 主动式连接的端口为20;
  • 使用格林尼治时间(GMT)。

建议添加一个参数值:

[root@server ~]# vim /etc/vsftpd/vsftpd.conf
#在结尾加上一行
use_localtime=YES

1.5.5、针对实体账户的设定

希望达到的一些功能:

  • 希望是用本地时间取代GMT时间;
  • 用户登录时显示一些欢迎信息;
  • 系统账号不可登录主机(即UID小于500的账号);
  • 一般实体用户可以进行上传、下载、建立目录及修改文件的权限;
  • 用户建立文件、目录的umask为002;
  • 其他主机设置保留默认即可。
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
#1、与匿名用户有关
anonymous_enable=no
#2、与实体用户相关信息:可写入,且umask为022
local_enable=YES
write_enable=YES
local_umask=002
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list
#3、与服务器环境相关
use_localtime=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
listen=NO
pam_service_name=vsftpd
tcp_wrappers=YES
banner_file=/etc/vsftpd/welcome.txt        #手动创建

建立欢迎信息:

[root@server ~]# vim /etc/vsftpd/welcome.txt
欢迎光临本小站,本小站提供FTP服务!
主要的服务是针对实体用户的!
如有任何问题,请联系Li!

建立限制系统账号的文件:

  • /etc/vsftpd/ftpusers:与上一个文件有关系,也就是PAM模块所指定的那个无法登陆的用户配置文件

  • /etc/vsftpd/user_list:这个文件是否生效与vsftpd.conf内的两个参数有关,分别是userlist_enable和userliat_deny有关。如果说/etc/pam.d/vsftpd是PAM模块的阻挡访问设置,那么/etc/vsftpd/user_list则是vsftpd自定义的阻挡访问设置。

测试:

[root@server ~]# systemctl restart vsftpd
[root@server ~]# yum install ftp -y
[root@server ~]# ftp localhost
Trying ::1...
Connected to localhost (::1).
220-欢迎光临本小站,本小站提供FTP服务!
220-主要的服务是针对实体用户的!
220-如有任何问题,请联系Li!
220
Name (localhost:root): li       <==一般用户登录
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>Name (localhost:root): root      <==root登录
530 Permission denied.
Login failed.
ftp> bye
221 Goodbye.

对用户(包括未来新建用户)进行chroot

假设我系统里边的li账号不被chroot,其他的账号通通默认chroot,包括未来新建的账号。

#1、修改配置文件
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
#删除前面的注释即可
chroot_local_user=YES
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES     <==允许用户具有主目录写权限
#2、建立不被chroot的用户账号,即使没有任何账号,也要存在
[root@server ~]# vim /etc/vsftpd/chroot_list
li
[root@server ~]# systemctl restart vsftpd
Name (localhost:root): li
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /usr
250 Directory successfully changed.
ftp> ls
229 Entering Extended Passive Mode (|||22746|).
150 Here comes the directory listing.
dr-xr-xr-x    2 0        0           24576 Jul 27 10:03 bin
drwxr-xr-x    2 0        0               6 Apr 11  2018 etc
drwxr-xr-x    2 0        0               6 Apr 11  2018 games
drwxr-xr-x    4 0        0              37 Jul 20 17:02 include
dr-xr-xr-x   27 0        0            4096 Jul 26 08:59 lib
dr-xr-xr-x   51 0        0           28672 Jul 26 17:09 lib64
drwxr-xr-x   22 0        0            4096 Jul 26 08:59 libexec
drwxr-xr-x   12 0        0             131 Jul 19 17:17 local
dr-xr-xr-x    2 0        0           16384 Jul 27 09:18 sbin
drwxr-xr-x   84 0        0            4096 Jul 26 16:59 share
drwxr-xr-x    4 0        0              34 Jul 19 17:17 src
lrwxrwxrwx    1 0        0              10 Jul 19 17:17 tmp -> ../var/tmp
226 Directory send OK.
限制实体用户的总下载流量(带宽)
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
local_max_rate=1000000
[root@server ~]# systemctl restart vsftpd
限制最大同时上线人数与同一IP的FTP连接数
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
max_clients=10
max_per_ip=1
[root@server ~]# systemctl restart vsftpd
建立严格的可使用FTP的账号列表

默认的环境中,我们是将不允许使用FTP的账号写入/etc/vsftpd/user_list文件,所以没有写入/etc/vsftpd/user_list当中的用户能够使用FTP了。如此一来,未来新建的用户是可以使用FTP的。如果换个角度,若想要某些人可以使用FTP**,也就是添加的用户默认不可使用FTP这个服务的话**如何操作?

[root@server ~]# vim /etc/vsftpd/vsftpd.conf
userlist_enable=YES
userlist_deny=no
userlist_file=/etc/vsftpd/user_list
[root@server ~]# systemctl restart vsftpd
#此时/etc/vsftpd/user_list变成了可以使用FTP的账号了
[root@server ~]# ftp localhost
Trying ::1...
Connected to localhost (::1).
220-欢迎光临本小站,本小站提供FTP服务!
220-主要的服务是针对实体用户的!
220-如有任何问题,请联系Li!
220
Name (localhost:root): li
530 Permission denied.
Login failed.

1.6、让vsftpd增加SSL的加密功能

1.6.1、检查vsftpd有无支持SSL模块

[root@server ~]# ldd $(which vsftpd) | grep ssllibssl.so.10 => /lib64/libssl.so.10 (0x00007f65a55c8000)

1.6.2、建立专门给vsftpd使用的证书数据

[root@server certs]# make vsftpd.pem
...
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:Henan
Locality Name (eg, city) [Default City]:Jiaozuo
Organization Name (eg, company) [Default Company Ltd]:SNNU
Organizational Unit Name (eg, section) []:CS
Common Name (eg, your name or your server's hostname) []:li
Email Address []:1448402493@qq.com[root@server certs]# cp -a vsftpd.pem /etc/vsftpd/
[root@server certs]# ll /etc/vsftpd/vsftpd.pem
-rw-------. 1 root root 3076 7月  27 10:57 /etc/vsftpd/vsftpd.pem

1.6.3、修改vsftpd.conf的配置文件,假设有实体、匿名账号

主要配置:

  • 提供实体账号登录,实体账号可上传数据,且umask为002;
  • 实体账号默认为chroot,且全部实体账号可用带宽1Mb/s;
  • 实体账号的登录与数据传输均需要通过SSL加密;
  • 提供匿名账号登录,匿名账号只允许下载,不能上传,且使用明文传输(不通过SSL)。
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
#1、与匿名用户有关
anonymous_enable=YES
no_anon_password=YES
anon_max_rate=1000000
data_connection_timeout=60
idle_session_timeout=600
#2、与实体用户相关信息:可写入,且umask为022
local_enable=YES
write_enable=YES
local_umask=002
userlist_enable=YES
userlist_deny=no
userlist_file=/etc/vsftpd/user_list
chroot_local_user=YES
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES     <==允许用户具有主目录写权限
local_max_rate=1000000
#3、针对SSL所加入的特别参数
ssl_enable=YES     #启动SSL的支持
allow_anon_ssl=NO      #但不允许匿名用户使用SSL
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加密证书所在
#4、与服务器环境相关
max_clients=10
max_per_ip=1
use_localtime=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
listen=NO
pam_service_name=vsftpd
tcp_wrappers=YES
banner_file=/etc/vsftpd/welcome.txt        #手动创建
vsftpd_log_file=/var/log/vsftpd.log
dual_log_enable=YES
pass_min_port=65400
pass_max_port=65410

Linux进阶学习笔记之——文件服务器之三:FTP服务器相关推荐

  1. Linux进阶学习笔记之——局域网控制者:Proxy(代理)服务器

    域网控制者:Proxy服务器 代理服务器的功能是可以代理局域网内 的个人计算机来向因特网取得网页或其他数据的一种服务,由于代理取的数据可以保存一份在服务器的缓存上,因此往往有类似"加速假象& ...

  2. linux系统管理学习笔记之三----软件的安装

    linux系统管理学习笔记之三----软件的安装 2009-12-29 19:10:02 标签:linux 系统管理 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 ...

  3. opencv进阶学习笔记3:像素运算和图像亮度对比度调节

    基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版目录: python+opencv进阶版学习笔记目录(适合有一定基础) 像素运算 要求两张图大小,以及格式(np ...

  4. Linux操作系统学习笔记【入门必备】

    Linux操作系统学习笔记[入门必备] 文章目录 Linux操作系统学习笔记[入门必备] 1.Linux入门 2.Linux目录结构 3.远程登录 3.1 远程登录Linux-Xshell5 3.2 ...

  5. Linux命令学习笔记

    Linux命令学习笔记 1 前言 1.1 系统版本 1.2 终端切换 1.3 快捷键 1.4 帮助文档 1.5 关机重启 2 目录命令 2.1 当前目录 pwd 2.2 切换目录 cd 2.3 查看目 ...

  6. linux pipe 命名管道,linux 进程学习笔记-named pipe (FIFO)命名管道

    与"无名管道"不同的是,FIFO拥有一个名称来标志它,所谓的名称实际上就是一个路径,比如"/tmp/my_fifo",其对应到磁盘上的一个管道文件,如果我们用f ...

  7. Linux基本命令学习笔记--文件查看、下载、查找

    1.Linux基本命令学习笔记–(文件查看) cat -整个查看 -n:行号 >(创建.覆盖) >>(追加)a.txt<<EOF:编写内容 内容 EOF (定格写:结束) ...

  8. linux系统管理学习笔记之一-------linux解压缩命令

    linux系统管理学习笔记之一-------linux解压缩命令 2009-12-29 11:52:55 标签:linux tar [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接 ...

  9. 操作系统进程学习(Linux 内核学习笔记)

    操作系统进程学习(Linux 内核学习笔记) 进程优先级 并非所有进程都具有相同的重要性.除了大多数我们所熟悉的进程优先级之外,进程还有不同的关键度类别,以满足不同需求.首先进程比较粗糙的划分,进程可 ...

  10. JavaSE进阶学习笔记-目录汇总(待完成)

    声明:此博客来自于黑马程序员学习笔记,并非商用,仅仅是为了博主个人日后学习复习用,如有冒犯,请联系qq208820388立即删除博文,最后,来跟我一起喊黑马牛逼黑马牛逼黑马牛逼 JavaSE进阶学习笔 ...

最新文章

  1. Python内置函数之输入输出函数
  2. java.net.uri,java.net.uri
  3. 【转】如何在Mac上卸载Java及安装Java
  4. Interference Signal 第八届
  5. HarmonyOS之AI能力·助手类意图识别
  6. 一个看似是系统问题的应用问题的解决过程
  7. gitlab ci mysql_php-Gitlab CI:在阶段之间保留MySQL数据
  8. (2)打两拍systemverilog与VHDL编码
  9. Docker+FastDFS+SpringBoot 快速搭建分布式文件服务器
  10. solr mysql增量导入_急急急,在线等!solr4.10结合oracle增量导入数据问题!
  11. 牛客网暑期ACM多校训练营(第九场)H. Prefix Sum(CDQ分治)
  12. C+++之insert()
  13. 计算机科学概论:计算机科学中的百科全书
  14. 4*4矩阵键盘c语言,经典4*4矩阵键盘C51程序
  15. R 回归 虚拟变量na_统计学基础笔记/单章:虚拟变量回归
  16. html锯齿边框,css3制作邮票(锯齿边框)-css3制作邮票(锯齿边框)-HTML5+CSS3-编玩编学- 注重积累的过程 快速锁定问题解决问题 写博客,在积累源码,持续更新技术博客,加分项...
  17. 浅谈Android中的异步加载之ListView中图片的缓存及优化三
  18. Web前端开发是做什么的?学Web前端有前途吗?
  19. Java 描述,数字转换为罗马数字。
  20. 最详细的HIve常用函数整理及案例演示

热门文章

  1. Linux常用命令学习
  2. 2022牛客寒假算法基础集训营1 H题 牛牛看云
  3. Android:自定义View实现绚丽的圆形进度条
  4. 使用sphinx+reStructuredText制作文档
  5. youtube-dl 下载 playlist 命令
  6. 智能暖风机——8.云端控制
  7. 智能暖风机——3.利用B3950实现温度采集功能
  8. 单片机裸机 vs RTOS多线程
  9. Histromap of World History: The rise and fall of peoples and notions for 4000 years
  10. 回忆2012-入坑OpenStreetMap10年纪