搭建FTP服务器,并限制不同用户的根目录和限制不同用户限定ip登录。

因限制ip必须要用系统用户,故本文不涉及虚拟用户的使用以及相关配置。

安装ftp服务

1
2
3
4
5
# centos
yum install vsftpd

# ubuntu 或 debian
apt install vsftpd

新增登录用户

  1. 配置新用户

useradd 可以使用 -d 指定用户根目录;使用 -s /sbin/nologin 禁用 ssh 登录,或者可以在 /etc/ssh/sshd_config 增加内容 DenyUsers admin 禁止该用户使用ssh登录

1
2
useradd -d /home/admin -s /sbin/nologin admin
passwd admin
  1. 解决 “530 Login incorrect”

从vsftpd 2.3.0版本开始vsftpd默认会检查用户的shell,如果用户的shell在 /etc/shells 没有记录,则无法登陆ftp

1
echo '/sbin/nologin' >> /etc/shells

基础配置

/etc/vsftpd/vsftpd.conf
1
2
3
4
5
6
7
8
9
10
11
12
# 是否允许匿名用户登陆
anonymous_enable=NO
# 必须置YES,允许本地用户来访问的
local_enable=YES
# 允许对文件系统做改动的 FTP 命令
write_enable=YES
# 本地用户创建文件所用的 umask 值
local_umask=022
# vsftpd 将监听 IPv4
listen=YES
# vsftpd 将监听 IPv6 而不是 IPv4
listen_ipv6=NO

不同用户根目录指向不一样位置

让不同用户登ftp时的根目录(/)实际存储在ftp服务器的目录不一样,并非设置为让不同用户登录时自动跳到的目录(用户根目录)不一样。

  1. /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
  2. 新建用户配置目录
    1
    mkdir /etc/vsftpd/user_conf
  3. /etc/vsftpd/user_conf 下创建以用户名命名的配置文件,如admin用户
    /etc/vsftpd/user_conf/admin
    1
    2
    3
    local_root=/data/admin
    # 允许在根目录(local_root目录)下写
    allow_writeable_chroot=YES
  4. 重启vsftpd服务
    1
    systemctl restart vsftpd
  • 特定用户配置文件优先级高于 /etc/vsftpd/vsftpd.conf 配置文件。

  • 如果 allow_writeable_chroot 未开启,需要将用户根目录权限的写权限全部去掉,否则会报 “500 OOPS” 错误:

    1
    chmod a-w /data/ftp
  • 如果 local_root 未设置,默认为系统用户设置的用户根目录

限制不同用户限定ip登录

ftp的虚拟账号无法使用该方法,需要是系统本地账号。如果使用了虚拟账号,需要在本地建同名账号。

  1. 修改文件 /etc/pam.d/vsftpd

    /etc/pam.d/vsftpd
    1
    2
    # 新增下面内容
    account required pam_access.so
  2. 修改文件 /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来配置时并不生效,请酌情使用

  1. 重启vsftpd服务
    1
    systemctl restart vsftpd

问题

ls 命令无法显示ftp目录下的文件内容问题

一般出现这种问题是因为客户端和服务端防火墙配置问题,根据不同的ftp需要配置不同的防火墙策略。

ftp的模式工作模式分为:

  1. 主动模式:
    • 命令链接:客户端 大于1023端口 -> 服务器 21端口
    • 数据连接:客户端 大于1023端口 <- 服务器 20端口
  2. 被动模式:
    • 命令连接:客户端 大于1023端口 -> 服务器 21端口
    • 数据连接:客户端 大于1023端口 -> 服务器 大于1023端口

如果ftp服务端只开启了主动模式;就需要客户端只使用主动模式,且要开放客户端的高位端口号的全部;
如果ftp服务端开启了被动模式,那么就需要开放客户端的高位端口;客户端无需开放防火墙,只需要用被动模式连接即可。

两种模式对于客户端和服务端都有利有弊,折衷的解决办法:启用被动模式,限制FTP服务高位端口范围。

  1. 修改 /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
  2. 开放7000-8000端口防火墙(根据自己配置的端口设置)
    1
    2
    3
    firewall-cmd --permanent --add-port=7000-8000/tcp

    firewall-cmd --load
  3. 重启vsftpd服务
    1
    systemctl restart vsftpd