目录

ftp搭建记录

学习一下FTP搭建,简单记录过程

  • ftp服务端:CentOS 7
  • 用户:root

附前置基础教程:

# ip问题

问题:安装centos后,ssh连接不显示ipv4

解决方案:

参考文章
centos解决不显示ipv4 (opens new window)

/etc/sysconfig/network-scripts目录下修改配置文件

cd /etc/sysconfig/network-scripts
vi ifcfg-ens33
1
2

将最后的ONBOOT=no改为ONEBOOT=yes

重启

# dns无法解析域名

问题描述:可以ping通8.8.8.8,ping不通域名

解决方案:

修改/etc/resolv.conf文件,添加nameserver dns服务器

vi /etc/resolv.conf
1

谷歌、cloudflare、阿里云、腾讯dns

# Generated by NetworkManager
search localdomain
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 1.1.1.1
nameserver 1.0.0.1
nameserver 223.5.5.5
nameserver 223.6.6.6
nameserver 114.114.114.114
nameserver 114.114.115.115
nameserver 119.29.29.29
1
2
3
4
5
6
7
8
9
10
11

# 换源

换源,修改CentOS7默认源配置文件/etc/yum.repos.d/CentOS-Base.repo

echo '' > /etc/yum.repos.d/CentOS-Base.repo
vi /etc/yum.repos.d/CentOS-Base.repo
1
2

粘贴入以下配置文件

[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[centosplus]
name=CentOS-$releasever - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

[contrib]
name=CentOS-$releasever - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

更新

yum clean all
yum makecache
1
2

安装个vim验证一下

yum install vim -y
1

# 关闭fu*k安全配置

放行ftp或者临时关闭防火墙,centos默认开启防火墙会阻止ftp连接

systemctl stop firewalld
setenforce 0
setsebool -P ftpd_anon_write on
setsebool -P ftpd_full_access on
1
2
3
4

# 安装vsftpd

yum install vsftpd -y
1

1

创建一个高危root权限用户,用户的主目录是/var/ftp/pub,shell是/sbin/nologin,禁止登录

useradd -g root -M -d /var/ftp/pub -s /sbin/nologin ftpuser 
1

更新ftpuser用户密码

passwd ftpuser
1

修改配置文件/etc/vsftpd/vsftpd.conf,反选出非注释内容(后续发现反选的做法对于新手来说并不友好)

cd /etc/vsftpd
mv vsftpd.conf vsftpd.conf.bak
grep -v "^#" vsftpd.conf.bak > vsftpd.conf
cat vsftpd.conf
1
2
3
4
vi /etc/vsftpd/vsftpd.conf
1

修改为下面内容

anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
# listen 修改为YES
listen=YES
# listen_ipv6 修改为NO
listen_ipv6=NO

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

启动服务

systemctl start vsftpd.service 
1

检查服务状态,ftp服务默认在21端口

yum install net-tools -y
1
netstat -npal | grep vsftpd
1
tcp6       0      0 :::21                   :::*                    LISTEN      62749/vsftpd
unix  2      [ ]         DGRAM                    87793    62749/vsftpd
1
2

# 配置匿名用户

给ftp服务设置一些权限,使匿名用户、本地用户可以访问

# 允许匿名用户访问
anonymous_enable=YES
# 设置匿名用户下载,上传及修改权限
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
# 设置匿名用户默认范围目录
anon_root=/var/ftp/pub
# 匿名用户可进行的操作权限,读写
anon_umask=022
# 本地用户登录
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

创建ftp目录

mkdir -p /var/ftp/pub
mkdir -p /var/ftp/pub/upload
chmod -R 777 /var/ftp/pub
1
2
3

直接成功连接到ftp服务器,以匿名用户身份连接了ftp服务器

3

# 配置本地用户

anonmous_enable修改为NO,此时需要用户登录才能连接了

提示

关于ftp登录root用户,如果有尝试的话会发现无法成功登录,因为ftp默认在user_listftpusers禁用了root用户。另外,user_list文件默认作为黑名单,如果在vsftpd.conf配置文件里设置配置项userlist_deny值为NO,则user_list文件作为白名单,值为YES时,则``user_list`文件作为黑名单

本地用户配置:

vi /etc/vsftpd/vsftpd.conf
1

内容:

# 允许匿名用户访问
anonymous_enable=NO
# 设置匿名用户下载,上传及修改权限
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
# 设置匿名用户默认范围目录
anon_root=/var/ftp/pub
# 匿名用户可进行的操作权限,读写
anon_umask=022

# 本地用户登录
local_enable=YES
write_enable=YES
# 设置本地用户目录
local_root=/var/ftp/pub
local_umask=022
chroot_local_user=YES
allow_writeable_chroot=YES

dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

给本地用户ftpuser对ftp目录授权

chown ftpuser:root /var/ftp/pub
chmod 755 /var/ftp/pub
1
2

另外,ftp默认不允许nologin用户登录连接,需要修改/etc/shells文件,添加/sbin/nologin

vi /etc/shells
1

添加

/sbin/nologin
1

授权本地用户ftpuser对ftp目录的权限

mkdir -p /var/ftp/pub
mkdir -p /var/ftp/pub/upload
chmod -R 777 /var/ftp/pub
1
2
3

重启服务

systemctl restart vsftpd.service
1

警告

注意,新建本地用户密码要至少8位,否则认证失败且无法连接

测试本地用户的登录、上传、下载权限

lftp命令交互

lftp ftpuser@192.168.237.129
1

如果有tls自签证书加密,忽略证书信任:

set ssl:verify-certificate no
1
put 1.txt # 上传
get 1.txt # 下载
mkdir 111 # 创建文件夹
rmdir 111 # 删除文件夹
1
2
3
4

18

filezlla验证上传、下载、创建目录

19

root用户登录,需要取消安全配置文件user_listftpusers中的root用户限制

删除配置文件里的root

vim /etc/vsftpd/user_list
1
vim /etc/vsftpd/ftpusers
1

保存退出

把文件属组给root

chown root:root /var/ftp/pub
chmod 777 /var/ftp/pub
1
2

重启服务

systemctl restart vsftpd
1

23

使用nologin用户登录时需要修改配置文件才能登录,使用其他交互shell时,可以直接登录

可以测试一下其他交互shell的用户:

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.
1
2
3
4
5
6

如果配置项userlist_deny值为NO,则只允许user_list文件里的用户登录,如果配置项userlist_deny值为YES,则禁止user_list文件里的用户登录

简单说,yes时,是黑名单,no时,是白名单。默认是黑名单,也不需要管这个(毫不相干)

测试了一圈发现:

  • 需要新增配置文件chroot_list,把本地登录用户追加进去
  • 新建本地用户shell为/bin/bash时成功了
  • 随机添加了几个配置项
# 允许匿名用户访问
anonymous_enable=NO
# 设置匿名用户下载,上传及修改权限
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
# 设置匿名用户默认范围目录
anon_root=/var/ftp/pub
# 匿名用户可进行的操作权限,读写
anon_umask=022

# 本地用户登录
local_enable=YES
write_enable=YES
# 设置本地用户目录
local_root=/var/ftp/pub
local_umask=022
chroot_local_user=YES
allow_writeable_chroot=YES

dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

创建本地用户,并设置密码

useradd -d /home/test2 -s /bin/bash test2
passwd test2
1
2

追加到ftp用户本地登录列表,并重启ftp服务

echo "test2" >> /etc/vsftpd/chroot_list
systemctl restart vsftpd
1
2

5

# TLS加密

ftp默认是明文传输,需要使用sftp协议,或者使用ssl/tls加密传输

生成证书、密钥,安装 openssl

yum install openssl
1

4

创建一个文件夹,存放证书和密钥文件

mkdir /etc/vsftpd/certs 
1

使用 OpenSSL 生成一个自签名的证书和私钥

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/vsftpd/certs/vsftpd.key -out /etc/vsftpd/certs/vsftpd.crt
1

6

# 配置ftp使用TLS加密

在配置文件/etc/vsftpd/vsftpd.conf末尾追加一下内容,配置ftp使用自签名的TLS证书、私钥加密

ssl_enable=YES
rsa_cert_file=/etc/vsftpd/certs/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/certs/vsftpd.key
force_local_data_ssl=YES
force_local_logins_ssl=YES
allow_anon_ssl=YES
# 配置ftp日志,方便调试
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/xferlog
log_ftp_protocol=YES
debug_ssl=YES
1
2
3
4
5
6
7
8
9
10
11
12

重启ftp服务

systemctl restart vsftpd
1

连接ftps服务

7

在上面的配置文件里已经允许了本地用户的读写上传,在实测上传时,出现响应: 553 Could not create file.

8

问题描述:

SELinux的安全配置里,禁止ftp用户写入文件

9

解决方案:修改安全配置,允许ftp用户写入文件

setsebool -P ftpd_anon_write on
setsebool -P ftpd_full_access on
1
2

重启ftp服务

systemctl restart vsftpd
1

再次上传文件,成功上传

10

# 使用ftp命令交互

  • ftp服务端:centos 7
  • ip:192.168.237.129
  • ftp客户端:centos 7
  • ip:192.168.237.131

配置tls加密后,似乎需要用lftp连接

linux安装lftp工具连接ftp服务器

yum install lftp -y
1

连接ftp服务器

lftp test2@192.168.237.129
1

问题描述:

输入密码连接后,尝试任意命令都会回复Fatal error: Certificate verification: Not trusted

解决方案:禁用证书验证

set ssl:verify-certificate no
1

用法

ls [目录名]
cd [目录名]
get <文件名>
put <文件名>
1
2
3
4

11

# 虚拟用户

最安全的一种认证模式,是专门创建出一个账号来登录FTP传输服务的,而且这个账号不能用于以SSH方式登录服务器

在配置文件/etc/vsftpd/vsftpd.conf后追加虚拟用户相关配置项

# 配置虚拟用户
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
virtual_use_local_privs=YES
guest_enable=YES
guest_username=virtual
chroot_local_user=YES
allow_writeable_chroot=YES
user_config_dir=/etc/vsftpd/vusers_dir

# 被动模式配置
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 虚拟用户的创建与认证

创建用于进行 FTP 认证的用户数据库文件vuser.list,奇数行为账户名,偶数行为密码。例如,分别创建zhangsan 和 lisi 两个用户,密码123456

vim vuser.list
1
zhangsan
123456
lisi
123456
1
2
3
4

12

由于明文信息既不安全,也不符合让vsftpd服务程序直接加载的格式,因此需要使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件删除

db_load -T -t hash -f vuser.list vuser.db
chmod 600 vuser.db
rm -f vuser.list
1
2
3

13

创建vsftpd服务程序用于存储文件的根目录以及用于虚拟用户映射的系统本地用户。vsftpd 服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置

由于Linux 系统中的每一个文件都有所有者、所属组属性,例如使用虚拟账户“张三”新建了一个文件,但是系统中找不到账户“张三”,就会导致这个文件的权限出现错误。为此,需要再创建一个可以映射到虚拟用户的系统本地用户。简单来说,就是让虚拟用户默认登录到与之有映射关系的这个系统本地用户的家目录中。虚拟用户创建的文件的属性也都归属于这个系统本地用户,从而避免 Linux系统无法处理虚拟用户所创建文件的属性权限

为了方便管理FTP服务器上的数据,可以把这个系统本地用户的家目录设置为/var目录(该目录用来存放经常发生改变的数据)。并且为了安全起见,将这个系统本地用户设置为不允许登录FTP服务器,这不会影响虚拟用户登录,而且还能够避免黑客通过这个系统本地用户进行登录

useradd  -d /var/ftproot  -s /sbin/nologin  virtual
chmod -Rf 755 /var/ftproot/
1
2

新建一个用于虚拟用户认证的PAM文件/etc/pam.d/vsftpd.vu

auth     required  pam_userdb.so db=/etc/vsftpd/vuser
account  required  pam_userdb.so db=/etc/vsftpd/vuser
1
2

14

把配置文件vsftpd.conf里pam_service_name参数的值认证文件名一并修改将 PAM 认证文件的名称修改为vsftpd.vu,

15

# 虚拟用户设置不同权限

账户zhangsan和lisi都是用于vsftpd服务程序认证的虚拟账户

  • 允许张三上传、创建、修改、查看、删除文件
  • 只允许李四查看文件

通过vsftpd服务程序来实现这些功能

需新建一个目录,在里面分别创建两个以zhangsan和lisi命名的文件,其中在名为zhangsan的文件中写入允许的相关权限(使用匿名用户的参数):

mkdir /etc/vsftpd/vusers_dir/
cd /etc/vsftpd/vusers_dir/
touch lisi
vim zhangsan
1
2
3
4

用户zhangsan的权限文件配置内容

local_root=/var/ftproot/vuser/zhangsan
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_umask=022
1
2
3
4
5
6

在ftp配置文件/etc/vsftpd/vsftpd.conf里追加虚拟用户的配置文件路径

user_config_dir=/etc/vsftpd/vusers_dir
1

给虚拟用户virtual赋予ftp根目录所有权

chown -R virtual:virtual /var/ftproot
1

给张三用户创建专属目录

mkdir -p /var/ftproot/vuser/zhangsan
chown -R virtual:virtual /var/ftproot/vuser/zhangsan
chmod 755 /var/ftproot/vuser/zhangsan
1
2
3

最终我的配置文件内容:

# 允许匿名用户访问
anonymous_enable=NO

# 设置匿名用户下载,上传及修改权限
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
# 设置匿名用户默认范围目录
anon_root=/var/ftp/pub
# 匿名用户可进行的操作权限,读写
anon_umask=022

# 本地用户登录
local_enable=YES
write_enable=YES
# 设置本地用户目录
local_root=/var/ftp/pub
local_umask=022
chroot_local_user=YES
allow_writeable_chroot=YES

dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO

pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES

# SSL加密配置
ssl_enable=YES
allow_anon_ssl=NO
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
# Since ssl_enable is NO, remove these lines or adjust according to the SSL usage
rsa_cert_file=/etc/vsftpd/certs/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/certs/vsftpd.key
force_local_data_ssl=YES
force_local_logins_ssl=YES
force_anon_data_ssl=YES
force_anon_logins_ssl=YES
ssl_ciphers=HIGH

# 配置ftp日志
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/xferlog
log_ftp_protocol=YES
debug_ssl=YES

# 配置虚拟用户
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
virtual_use_local_privs=YES
guest_enable=YES
guest_username=virtual
chroot_local_user=YES
allow_writeable_chroot=YES
user_config_dir=/etc/vsftpd/vusers_dir

# 被动模式配置
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

虚拟用户写入配置文件

echo "virtual" >> /etc/vsfptd/chroot_list
1

重启服务

systemctl restart vsftpd
1

验证内容包括:

  • (1): 张三不仅可以登录,还可以创建、改名和删除文件
  • (2): 李四只能登录,没有其他权限

登录测试发现:

  • 用户张三可以登录、下载、上传、创建目录、删除文件等
  • 用户李四只能登录、下载,不能删除文件、创建目录、上传文件等

17

16

21

22

过程很多坑,不一定是配置文件的问题,可能是防火墙、selinux,也可能是权限....其他

# 难道...这就是这副身躯的极限了吗......

语法错误、配置错误、权限错误、不熟悉linux....随处可见的绊脚石,难道这就是这副身躯的极限了吗...还有其他解决方法吗?

有的有的,兄弟!

做了那么久,发现我也是只猴子,分享一个简单的方法来优雅地实现这个作业

或许你也可以思路清晰脚踏实地投机取巧、瞒天过海,摆脱配置文件的烦扰,完成作业

推荐windows软件小皮面板点击下载小皮面板 (opens new window)

24

到左侧的ftp栏配置ftp

25

配置对应用户的权限

26

简单验证

27

最后,测试后建议及时关闭,避免因不安全的ftp用户、权限配置引发安全问题

参考、致谢:

最后一次更新于: 2024/12/22, 00:14:04