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

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默认的主动式连接来说明:

Linux进阶学习笔记之——文件服务器之三:FTP服务器_第1张图片

  • 建立命令通道的连接

    客户端会选择一个大于1024以上的端口来与FTP服务器端的port 21实现连接,这个过程需要三次握手。实现连接后便可以通过这个连接来对FTP服务器执行命令,查询文件名、下载、上传等命令都是利用这个通道来执行的。

  • 通知FTP服务器使用Active且告知连接的端口号

    FTP服务器的端口21号主要用在命令的执行。客户端在需要数据的情况下,会告知服务器要用什么方式来连接,如果是主动式连接,客户端会先随机启动一个端口,且通过命令通道告知FTP服务器这个消息,并等待FTP服务器的连接

  • FTP服务器主动向客户端连接

    FTP服务器由命令通道了解客户端的需求后,会主动地由port 20向客户端的port BB连接,这个连接当然也会经过三次握手此时FTP的客户端与服务器会建立两条连接,分别用在命令的执行与数据的传输。而默认的FTP服务器使用的主动连接端口就是port 20

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

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

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

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

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

Linux进阶学习笔记之——文件服务器之三:FTP服务器_第2张图片

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

    因为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服务器时,可能偶尔发现明明已经连接上了,但就是无法获取文件列表,可能就是这个原因。

解决方法:

  • 使用iptables所提供的FTP检测模块

    可以使用modprode这个命令加载ip_conntrack以及ip_nat_ftp等模块

  • 客户端选择被动连接模式

    被动式就是客户端向服务器发起连接


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

Linux进阶学习笔记之——文件服务器之三:FTP服务器_第3张图片

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

  • 客户端发出PASV的连接请求

    当使用数据通道的命令时,客户端可通过命令通道发出PASV的被动式连接请求(Passive的缩写),并等待服务器的回应

  • FTP服务器启动数据端口,并通知客户端连接

  • 客户端随机选择大于1024的端口进行连接

不同点在于:被动式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.

Linux进阶学习笔记之——文件服务器之三:FTP服务器_第4张图片

Linux进阶学习笔记之——文件服务器之三:FTP服务器_第5张图片

Linux进阶学习笔记之——文件服务器之三:FTP服务器_第6张图片

对用户(包括未来新建用户)进行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 ssl
        libssl.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 []:[email protected]

[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进阶—服务器搭建,linux,运维)