简介ftp
- File Transfer Protocol 早期 的三个应用级协议之一
- 基于C/S
- 双通道协议:数据和命令连接
- 数据传输格式:二进制(默认)和文本
- 两种模式:服务器角度
(1)主动(PORT style)服务器主动连接
命令(控制):客户端:随机port ---> 服务器:tcp21
数据: 客户端:随机port+1 <--- 服务器:tcp20
(2)被动(PASV style)客户端主动连接
命令 (控制 ):客户端:随机port ---> 服务器:tcp21
数据:客户端:随机port+1 ---> 服务器:随机port - 状态码
1XX :信息 125 :数据连接打开
2XX :成功类状态 200 :命令OK 230 :登录成功
3XX :补充类 331 :用户名OK
4XX :客户端错误 425 :不能打开数据连接
5XX :服务器错误 530 :不能登录 - 用户认证:
匿名用户:ftp,anonymous, 对应Linux 用户ftp
系统用户:Linux 用户, 用户/etc/passwd, 密码/etc/shadow
虚拟用户:特定服务的专用用户,独立的用户/ 密码文件
nsswitch:network service switch 名称解析框架
pam:pluggable authentication module 用户认证
/lib64/security /etc/pam.d/ /etc/pam.conf - 由vsftpd 包提供
- 不再由xinetd管理
- 用户认证配置文件:/etc/pam.d/vsftpd
- 服务脚本: /usr/lib/systemd/system/vsftpd.service 7
/etc/rc.d/init.d/vsftpd 6 - 配置文件:/etc/vsftpd/vsftpd.conf
- 帮助 man 5 vsftpd.conf
- 匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
- 系统用户共享文件位置:用户家目录
- 虚拟用户共享文件位置:为其映射的系统用户的家目录
配置
1更改命令端口
更改命令端口 listen_port=端口号如90 ;默认配置文件无此行,表示监听21 端口 添加此行并要监听得问端口;修改后关闭selinux策略;setenforce 0临时关闭
重启服务
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
listen_port=28
#更改ftp的命令端口为非标准28端口加listen_port=28 ;如果不加此行表示使用标准21端口
[root@localhost ~]# systemctl restart vsftpd.service
客户端测试
[root@root ~]# ftp 192.168.175.130 28
Connected to 192.168.175.130 (192.168.175.130).
220 (vsFTPd 3.0.2)
Name (192.168.175.130:root): ftp
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,175,130,190,237).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 16 Aug 10 21:24 pub
226 Directory send OK.
ftp>
服务器端查看连接状态
[root@localhost pub]# ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 52 192.168.175.130:22 192.168.175.1:13991
ESTAB 0 0 ::ffff:192.168.175.130:28 ::ffff:192.168.175.129:33670
[root@localhost pub]#
更改主动端口
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
connect_from_port_20=YES
ftp_data_port=39 更改主动模式端口为39
客户端测试
ftp> get 4.txt 注意要在服务器端给该文件授权
local: 4.txt remote: 4.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for 4.txt (4294967296 bytes).
服务器端查看结果
[root@localhost pub]# ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.175.130:22 192.168.175.1:12213
ESTAB 0 0 192.168.175.130:22 192.168.175.1:13991
ESTAB 0 3569320 ::ffff:192.168.175.130:39 主动端口 ::ffff:192.168.175.129:59343
ESTAB 0 0 ::ffff:192.168.175.130:28 ::ffff:192.168.175.129:33692
更改服务器端的被动端口
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
connect_from_port_20=YES
pasv_min_port=6000
#数字指定随机端口的最小值为6000;如果是0表示系统随便分配
pasv_max_port=6010
#数字指定最大端口值为6010
重启服务
[root@localhost pub]# systemctl restart vsftpd.service
客户端测试
ftp> get 4.txt
local: 4.txt remote: 4.txt
227 Entering Passive Mode (192,168,175,130,23,114).
150 Opening BINARY mode data connection for 4.txt (4294967296 bytes).
[root@localhost pub]# ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 52 192.168.175.130:22 192.168.175.1:13991
ESTAB 0 0 ::ffff:192.168.175.130:28 ::ffff:192.168.175.129:33694
ESTAB 0 3276720 ::ffff:192.168.175.130:6002 端口范围之内的值 ::ffff:192.168.175.129:55467
默认权限设置
[root@localhost ftp]# ll -d /var/ftp/pub/
drwxr-xr-x. 2 root root 42 8月 11 06:32 /var/ftp/pub/
[root@localhost ftp]# ll -d /var/ftp/
drwxr-xr-x. 3 root root 17 8月 11 06:16 /var/ftp/
[root@localhost ftp]#
更改为当地时间
客户端ls显示为UTC时间
ftp> ls
227 Entering Passive Mode (192,168,175,130,23,117).
150 Here comes the directory listing.
-rwxrwxrwx 1 0 0 716042 Aug 10 2017 2.txt
-rwxrwxrwx 1 0 0 4294967296 Aug 10 2017 4.txt
-rwxrwxrwx 1 0 0 0 Aug 10 2017 kk
226 Directory send OK.
ftp>
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
connect_from_port_20=YES
#use_localtime=YES
#默认是no表示使用GMT
pasv_min_port=6000
#数字指定随机端口的最小值为6000;如果是0表示系统随便分配
pasv_max_port=6010
use_localtime=YES
#使用当地时间;默认是no表示使用GMT
重启服务
[root@localhost pub]# systemctl restart vsftpd.service
服务器上的文件时间
[root@localhost ftp]# ll
总用量 0
drwxr-xr-x. 2 root root 42 8月 11 06:32 pub
[root@localhost ftp]#
测试客户端
ftp> ls
227 Entering Passive Mode (192,168,175,130,23,117).
150 Here comes the directory listing.
-rwxrwxrwx 1 0 0 716042 Aug 11 06:12 2.txt
-rwxrwxrwx 1 0 0 4294967296 Aug 11 06:34 4.txt
-rwxrwxrwx 1 0 0 0 Aug 11 05:24 kk
226 Directory send OK.
ftp>
设置允许匿名用户上传文件
客户端默认匿名用户不允许
ftp> put 6.txt
local: 6.txt remote: 6.txt
227 Entering Passive Mode (192,168,175,130,23,114).
550 Permission denied.
ftp>
服务器端设置
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES
#启用这一项把注释去掉就支持匿名用户上传文件了
赋予共享目录下子文的写权限;必须是子文件ftp不许共享目录直接有写权限
[root@localhost ftp]# chmod o+w /var/ftp/pub/
重启服务
[root@localhost pub]# systemctl restart vsftpd.service
客户端测试
ftp> put 6.txt
local: 6.txt remote: 6.txt
227 Entering Passive Mode (192,168,175,130,23,121).
150 Ok to send data.
226 Transfer complete.
8 bytes sent in 0.000209 secs (38.28 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,175,130,23,118).
150 Here comes the directory listing.
-rwxrwxrwx 1 0 0 716042 Aug 11 06:12 2.txt
-rwxrwxrwx 1 0 0 4294967296 Aug 11 06:34 4.txt
-rw------- 1 14 50 8 Aug 11 09:02 6.txt
-rwxrwxrwx 1 0 0 0 Aug 11 05:24 kk
226 Directory send OK.
ftp>
- 设置匿名用户登录不检查口令
客户端
[root@root ~]# ftp 192.168.175.130 28
Connected to 192.168.175.130 (192.168.175.130).
220 (vsFTPd 3.0.2)
Name (192.168.175.130:root): ftp用户
331 Please specify the password.
Password:密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
服务器
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
no_anon_password=YES
#设置匿名用户登录不检查口令;( 默认NO) 匿名用户略过口令 检查
重启ftp服务
[root@localhost ftp]# systemctl restart vsftpd.service
客户端测试
[root@root ~]# ftp 192.168.175.130 28
Connected to 192.168.175.130 (192.168.175.130).
220 (vsFTPd 3.0.2)
Name (192.168.175.130:root): ftp用户
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
- 设置允许客户端创建文件
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
anon_mkdir_write_enable=YES
#设置允许用户创建文件
重启服务;注意文件的权限
[root@localhost ftp]# systemctl restart vsftpd.service
客户端测试
ftp> ?
Commands may be abbreviated. Commands are:
! debug mdir sendport site
$ dir mget put size
account disconnect mkdir pwd status
append exit mls quit struct
ascii form mode quote system
bell get modtime recv sunique
binary glob mput reget tenex
bye hash newer rstatus tick
case help nmap rhelp trace
cd idle nlist rename type
cdup image ntrans reset user
chmod lcd open restart umask
close ls prompt rmdir verbose
cr macdef passive runique ?
delete mdelete proxy send
ftp> mkdir hh 创一个文件夹hh
257 "/pub/hh" created
ftp> ls
227 Entering Passive Mode (192,168,175,130,23,114).
150 Here comes the directory listing.
-rwxrwxrwx 1 0 0 716042 Aug 11 06:12 2.txt
-rwxrwxrwx 1 0 0 4294967296 Aug 11 06:34 4.txt
-rw------- 1 14 50 8 Aug 11 09:02 6.txt
drwx------ 2 14 50 6 Aug 11 09:17 hh
-rwxrwxrwx 1 0 0 0 Aug 11 05:24 kk
226 Directory send OK.
ftp>
- 设置用户可删除和修改上传的文件、
服务器
vim /etc/vsftpd/vsftpd.conf
anon_other_write_enable=YES
#可删除和修改上传的文件
[root@localhost ftp]# systemctl restart vsftpd.service
客户测试
ftp> delete kk删除文件
250 Delete operation successful.
ftp> mdelete ll 删除目录或多个文件
更改匿名账户上传文件的目录
更改运行vstpd家目录就可以了
设置用户上传文件的权限
anon_umask=077
#指定匿名上传umask
指定上传文件的默认的所有者和权限
chown_uploads=YES
#启用上传文件默认所有者
chown_username=chenxi
#指定所有者
chown_upload_mode=0644
#设置权限
将所有系统账户映射成指定账户
系统账户
[root@localhost pub]# getent passwd chenxi1
chenxi1:x:1000:1000::/home/chenxi1:/bin/bash
客户端用系统账户测试
[root@root ~]# ftp 192.168.175.130 28
Connected to 192.168.175.130 (192.168.175.130).
220 (vsFTPd 3.0.2)
Name (192.168.175.130:root): chenxi1 系统
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/chenxi1"
ftp> ls
227 Entering Passive Mode (192,168,175,130,23,120).
150 Here comes the directory listing.
226 Directory send OK.
ftp> cd /etc/ 将会特别危险
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,175,130,23,122).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 5090 Nov 05 2016 DIR_COLORS
-rw-r--r-- 1 0 0 5725 Nov 05 2016 DIR_COLORS.256color
服务器端
[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
#所有系统用户都映射成guest 用户
guest_username=ftp
#配合上面选项才生效,指定guest 用户guest_enable=YES 所有系统用户都映射成guest 用户而guest用户映射成ftq
重启
[root@localhost pub]# systemctl restart vsftpd.service
客户端测试
[root@root ~]# ftp 192.168.175.130 28
Connected to 192.168.175.130 (192.168.175.130).
220 (vsFTPd 3.0.2)
Name (192.168.175.130:root): chenxi1
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,175,130,23,119).
150 Here comes the directory listing.
drwxr-xrwx 4 0 0 65 Aug 11 09:32 pub
226 Directory send OK.
ftp> pwd
257 "/"
ftp>
服务器
# When SELinux is enforcing check for SE bool ftp_home_dir
local_enable=YES
#设置是否允许系统账户登录YSE允许NO是不允许
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#设置是否允许系统用户上传文件YES允许NO拒绝
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022
#设置系统用户上文件的umask权限
chroot_local_user=YES
#(默认NO ,不禁锢)禁锢系统 用户
hroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
当chroot_local_user=YES 时,则chroot_list 中用户不禁锢
当chroot_local_user=NO 时,则chroot_list中 用户禁锢
更改记得重启
注意重启是吧配置文件没有错的前提下;应该是选项位置不对
- 其他相关的配置
日志相关配置
xferlog_enable=YES
#(默认) 启用 记录上传下载日志
xferlog_std_format=YES
#(默认 )使用wu-ftp 日志格式
xferlog_file=/var/log/xferlog
#/var/log/xferlog (默认)可自动生成
目录访问提示信息
dirmessage_enable=YES ( 默认)
message_file=.message( 默认) 信息 存放在 指定目录下.message
echo chenxi>/var/ftp/pub/.message 用户切到该目录下就会提示chenxi字样
- 用户访问控制的相关设置
使用pam(Pluggable Authentication Modules)
[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd
#默认指明验证用户调用pam模块
pam 配置文件:/etc/pam.d/vsftpd #pam 模块关于vsftpd的配置文件
pam模块对用户的登录设置
[root@localhost pub]# vim /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
#auth required pam_listfile.so item=user sense=deny(拒绝)后面文件里用户登录 file=/etc/vsftpd/ftpusers onerr=succeed
sense=allow(允许)只允许后面文件里用户登录 file=/etc/vsftpd/ftpusers onerr=succeed
/etc/vsftpd/ftpusers 默认文件中用户拒绝登录
vsftp配置对用户登录限制的相关设置
是否启用控制用户登录的列表文件
[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf
userlist_enable=YES
# 默认有此设置
userlist_deny=YES
#( 默认值 值) 黑名单, 不提示口令,NO 为 白名单
userlist_file=/etc/vsftpd/users_list
#此文件的用户
连接 限制
[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf
max_clients=0
#最大并发连接数
max_per_ip=0
#每个IP 同时发起的最大连接 数
nopriv_user=nobody
#vsftpd 服务指定用户身份运行
传输速率: 字节/秒 秒
anon_max_rate=0 匿名用户的最大传输速率
local_max_rate=0 本地用户的最大传输速率
连接时间:秒为单位
connect_timeout=60 主动模式 数据 连接超时时长
accept_timeout=60 被动模式 数据 连接超时时长
data_connection_timeout=300 数据连接无数据输超时时长
idle_session_timeout=60 无命令操作超时时长
优先以 文本方式传输
ascii_upload_enable=YES
ascii_download_enable=YES
重启后生效
客户端
ftp> binary 表示以二进制格式传输
200 Switching to Binary mode
ftp> ascii 表示以文本格式传输
200 Switching to ASCII mode.
- 设置FTP为非独立服务6
安装xinetd.d服务,由于telnet-server依赖于xinetd.d该服务所以安装telnet-server就自动把xinetd.d服务装上
yum -y install telnet-server
vim /etc/vsftpd/vsftpd.conf
# with the listen_ipv6 directive.
listen=NO
#默认是YES表示独立服务;改成NO就是非独立服务
退出后直接把ftp服务关闭
service vsftpd stop
让ftp受xinetd服务管理
vim /etc/xinetd.d/vsftpd
service ftp
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
log_on_failure += USERID
disable = no
}
[root@root xinetd.d]# chkconfig --list
auditd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
blk-availability 0:关闭 1:启用 2:启用 3:启用 4:启用 5:启用 6:关闭
crond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
ip6tables 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
iptables 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
kdump 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭
lvm2-monitor 0:关闭 1:启用 2:启用 3:启用 4:启用 5:启用 6:关闭
mdmonitor 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
messagebus 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
netconsole 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
netfs 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭
network 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
nfs-rdma 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
ntpdate 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
postfix 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
rdisc 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
rdma 0:关闭 1:启用 2:启用 3:启用 4:启用 5:启用 6:关闭
restorecond 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
rsyslog 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
saslauthd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
sshd 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
svnserve 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
udev-post 0:关闭 1:启用 2:启用 3:启用 4:启用 5:启用 6:关闭
vsftpd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
xinetd 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭
基于 xinetd 的服务:
chargen-dgram: 关闭
chargen-stream: 关闭
daytime-dgram: 关闭
daytime-stream: 关闭
discard-dgram: 关闭
discard-stream: 关闭
echo-dgram: 关闭
echo-stream: 关闭
rsync: 关闭
tcpmux-server: 关闭
telnet: 关闭
time-dgram: 关闭
time-stream: 关闭
vsftpd: 启用 #表示ftp受xinetd服务管理
直接启动xinetd服务
service xinetd start
端口查看
[root@root xinetd.d]# ss -nlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 64 :::21 ftp端口已经启动 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 127.0.0.1:6011 *:*
LISTEN 0 128 ::1:6011 :::*
LISTEN 0 128 127.0.0.1:6012 *:*
LISTEN 0 128 ::1:6012 :::*
[root@root xinetd.d]#