搭建FTP服务器,并限制不同用户的根目录和限制不同用户限定ip登录。
因限制ip必须要用系统用户,故本文不涉及虚拟用户的使用以及相关配置。
安装ftp服务
1 | # centos |
新增登录用户
- 配置新用户
useradd
可以使用 -d
指定用户根目录;使用 -s /sbin/nologin
禁用 ssh
登录,或者可以在 /etc/ssh/sshd_config
增加内容 DenyUsers admin
禁止该用户使用ssh登录
1 | useradd -d /home/admin -s /sbin/nologin admin |
- 解决 “530 Login incorrect”
从vsftpd 2.3.0版本开始vsftpd默认会检查用户的shell,如果用户的shell在 /etc/shells
没有记录,则无法登陆ftp
1 | echo '/sbin/nologin' >> /etc/shells |
基础配置
1 | # 是否允许匿名用户登陆 |
不同用户根目录指向不一样位置
让不同用户登ftp时的根目录(/
)实际存储在ftp服务器的目录不一样,并非设置为让不同用户登录时自动跳到的目录(用户根目录)不一样。
- 在
/etc/vsftpd/vsftpd.conf
增加配置/etc/vsftpd/vsftpd.conf 1
2
3
4
5
6
7
8
9
10
11# 限制用户登录在local_root目录中(该目录在ftp显示为“/”)
chroot_local_user=YES
# 允许例外的用户使用ftp服务器目录
chroot_list_enable=YES
# 例外名单
chroot_list_file=/etc/vsftpd/chroot_list
# 通用限制用户的ftp根目录
local_root=/data/ftp
# 特定用户配置目录
user_config_dir=/etc/vsftpd/user_conf - 新建用户配置目录
1
mkdir /etc/vsftpd/user_conf
- 在
/etc/vsftpd/user_conf
下创建以用户名命名的配置文件,如admin用户/etc/vsftpd/user_conf/admin 1
2
3local_root=/data/admin
# 允许在根目录(local_root目录)下写
allow_writeable_chroot=YES - 重启vsftpd服务
1
systemctl restart vsftpd
特定用户配置文件优先级高于
/etc/vsftpd/vsftpd.conf
配置文件。如果
allow_writeable_chroot
未开启,需要将用户根目录权限的写权限全部去掉,否则会报 “500 OOPS” 错误:
1 chmod a-w /data/ftp如果
local_root
未设置,默认为系统用户设置的用户根目录
限制不同用户限定ip登录
ftp的虚拟账号无法使用该方法,需要是系统本地账号。如果使用了虚拟账号,需要在本地建同名账号。
修改文件
/etc/pam.d/vsftpd
/etc/pam.d/vsftpd 1
2# 新增下面内容
account required pam_access.so修改文件
/etc/security/access.conf
/etc/security/access.conf 1
2
3
4# 文件最后新增
+:admin:192.168.1.1 #admin用户可以从192.168.1.1这个IP访问FTP服务
-:admin:ALL #admin用户禁止任何IP除上面的192.168.1.1访问FTP服务
-:download:192.168.1.1 #download用户不允许从192.168.1.1这个IP访问FTP服务根据个人实际配置,“+”为允许,“-”为拒绝,每一行为一个规则,规则匹配的优先级从上到下依次递减。注意 IPv4 和 IPv6 的写法,两种写法并不通用。
上述示例使用一个允许、一个拒绝规则来完成对用户admin只允许从192.168.1.1访问,实际还有个写法如下:
-:admin:ALL EXCEPT 192.168.1.1 #用户admin只能从192.168.1.1这个IP访问FTP服务
但目前本人使用centos7来配置时并不生效,请酌情使用
- 重启vsftpd服务
1
systemctl restart vsftpd
问题
ls
命令无法显示ftp目录下的文件内容问题
一般出现这种问题是因为客户端和服务端防火墙配置问题,根据不同的ftp需要配置不同的防火墙策略。
ftp的模式工作模式分为:
- 主动模式:
- 命令链接:客户端 大于1023端口 -> 服务器 21端口
- 数据连接:客户端 大于1023端口 <- 服务器 20端口
- 被动模式:
- 命令连接:客户端 大于1023端口 -> 服务器 21端口
- 数据连接:客户端 大于1023端口 -> 服务器 大于1023端口
如果ftp服务端只开启了主动模式;就需要客户端只使用主动模式,且要开放客户端的高位端口号的全部;
如果ftp服务端开启了被动模式,那么就需要开放客户端的高位端口;客户端无需开放防火墙,只需要用被动模式连接即可。
两种模式对于客户端和服务端都有利有弊,折衷的解决办法:启用被动模式,限制FTP服务高位端口范围。
- 修改
/etc/vsftpd/vsftpd.conf
增加配置/etc/vsftpd/vsftpd.conf 1
2
3
4
5
6# 开启被动模式
pasv_enable=YES
# 被动模式最低端口号
pasv_min_port=7000
# 被动模式最高端口号
pasv_max_port=8000 - 开放7000-8000端口防火墙(根据自己配置的端口设置)
1
2
3firewall-cmd --permanent --add-port=7000-8000/tcp
firewall-cmd --load - 重启vsftpd服务
1
systemctl restart vsftpd