FTP服务器在默认的情况下,依据用户登录的情况而分为三种不同的身份,分别是:1、实体用户,real user;2、访客,guest;3、匿名用户,anonymous。这三种用户在系统上面的权限差异特别大。
FTP可以利用系统的syslogd来进行数据的记录,而记录的数据包括了用户曾经使用过的命令与用户传输数据(传输时间、文件大小等)的记录,你可以在/var/log/里面找到。
为了避免用户在你的Linux系统上随意逛大街(意思是离开用户主目录而进入到Linux系统的其他目录),所以将用户的工作范围局限在用户主目录下。如此一来,由于用户无法离开自己的用户主目录,而且登录FTP后,显示的根目录就是自己用户的主目录的内容,这种环境称为change root,简称chroot,即改变根目录的意思。
FTP服务器使用了两个连接,分别是命令通道与数据流通道,因为都是TCP数据包,这两个连接都需要经过三次握手。下面以FTP默认的主动式连接来说明:
客户端会选择一个大于1024以上的端口来与FTP服务器端的port 21实现连接,这个过程需要三次握手。实现连接后便可以通过这个连接来对FTP服务器执行命令,查询文件名、下载、上传等命令都是利用这个通道来执行的。
FTP服务器的端口21号主要用在命令的执行。客户端在需要数据的情况下,会告知服务器要用什么方式来连接,如果是主动式连接,客户端会先随机启动一个端口,且通过命令通道告知FTP服务器这个消息,并等待FTP服务器的连接。
FTP服务器由命令通道了解客户端的需求后,会主动地由port 20向客户端的port BB连接,这个连接当然也会经过三次握手。此时FTP的客户端与服务器会建立两条连接,分别用在命令的执行与数据的传输。而默认的FTP服务器使用的主动连接端口就是port 20。
重要是:**两者的连接发起端是不一样的!!!**首先port 21主要接受客户端的主动连接,至于port 20则为FTP服务器主动连接至客户端。
很多局域网都会使用防火墙的NAT功能,那么在NAT后端的FTP客户端如何连接到FTP服务器呢?
因为NAT会主动地记录由内部送往外部的连接信息,而由于命令通道的建立是由客户端向服务器连接的,因此这一条连接是可以顺利进行的。
同样,客户端会先启用port BB,并利用命令通道告知FTP服务器,且等待服务器端的主动连接。
但是由于通过NAT的转换后,FTP服务器只能得知NAT的IP而不是客户端的IP,因此FTP服务器会以port 20主动向NAT的port BB 发送主动连接请求。但NAT并没有启动port BB来监听FTP服务器的连接。
连接问题所在了吗?在FTP主动式连接中,NAT将会被视为客户端,但NAT其实并非客户端。如果你曾在IP路由器后面连接某些FTP服务器时,可能偶尔发现明明已经连接上了,但就是无法获取文件列表,可能就是这个原因。
解决方法:
可以使用modprode这个命令加载ip_conntrack以及ip_nat_ftp等模块
被动式就是客户端向服务器发起连接
当使用数据通道的命令时,客户端可通过命令通道发出PASV的被动式连接请求(Passive的缩写),并等待服务器的回应
不同点在于:被动式FTP数据通道的连接方向是由客户端向服务器端连接的。
很多FTP服务器默认就开启了允许实体用户登录,但开放实体用户时的建议如下:
在通常会建立guest身份的案例中,多半是由于服务器提供了类似于个人Web首页的功能给一般身份用户。建议如下:
很危险的开放
[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
vsftpd.conf配置值 | 说明 |
---|---|
[root@server ~]# systemctl start vsftpd
[root@server ~]# systemctl enable vsftpd
[root@server ~]# netstat -tnlup | grep vsftpd
tcp6 0 0 :::21 :::* LISTEN 7939/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的防火墙机制
默认设置启动后可以得到以下功能:
建议添加一个参数值:
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
#在结尾加上一行
use_localtime=YES
希望达到的一些功能:
[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.
假设我系统里边的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
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
max_clients=10
max_per_ip=1
[root@server ~]# systemctl restart vsftpd
默认的环境中,我们是将不允许使用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.
[root@server ~]# ldd $(which vsftpd) | grep ssl
libssl.so.10 => /lib64/libssl.so.10 (0x00007f65a55c8000)
[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
主要配置:
[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