---
title: "Ftp 笔记"
date: 2019-10-30T17:48:02+08:00
lastmod: 2019-10-31T21:49:00+08:00
tags: ["ftp", "vsftp"]
categories: ["storage"]
---

## 环境
- CentOS7
- vsftpd
- 关闭 selinux

## 安装 vsftpd 服务
```bash
yum install vsftpd
```

## 常用客户端
- ftp
- lftp
- curl

## 主动模式
- 建立控制命令连接
    - 客户端连接服务端 21 号端口

- 建立数据传送连接
    - 客户端在本地监听一个端口(大于 1024 )，并通过 PORT 命令通知服务端
    - 服务端从 20 端口连接客户端正在监听的端口，向客户端发送数据

- 相关配置
    ```ini
    # 开启主动模式
    pasv_enable = no
    ```

## 被动模式
- 建立控制命令连接
    - 客户端连接服务端 21 号端口

- 建立数据传送连接
    - 服务端在本地再次监听一个端口(大于 1024)，并通过 PASV 命令通知客户端
    - 客户端连接服务端新监听的端口，下载服务端数据

- 相关配置
    ```ini
    # 开启被动模式
    pasv_enable = yes
    # 数据连接可以使用的端口范围的最大端口，0 表示任意端口，默认值为0
    pasv_min_port=30000
    # 数据连接可以使用的端口范围的最小端口，0 表示任意端口，默认值为0
    pasv_max_port=30999
    ```

## 匿名用户配置
```ini
# 控制是否允许匿名用户登入
# 匿名用户使用的登陆名为 ftp 或 anonymous，口令为空
# 匿名用户不能离开匿名用户家目录/var/ftp，且只能下载不能上传
anonymous_enable=YES/NO(YES)

# 匿名登入时，不会询问密码
no_anon_password=YES/NO(NO)

# 定义匿名登入的使用者名称，默认值为ftp
ftp_username=ftp

# 是否允许登陆用户有写权限，属于全局设置
write_enable=YES/NO(YES)

# 使用匿名登入时，所登入的目录，默认值为/var/ftp
# 注意ftp目录不能是777的权限属性，即匿名用户的家目录不能有777的权限
anon_root=/var/ftp

# 是否允许匿名者有上传文件(非目录)的权限
# 只有在write_enable=YES时，此项才有效
# 匿名用户必须要有对上层目录的写入权
anon_upload_enable=YES/NO(NO)

# 是否允许匿名者下载可阅读的档案
anon_world_readable_only=YES/NO(YES)

# 是否允许匿名者有新增目录的权限
# 只有在write_enable=YES时，此项才有效
# 匿名用户必须要有对上层目录的写入权
anon_mkdir_write_enable=YES/NO(NO)

# 是否允许匿名入者拥有其他权限，譬如删除或者重命名
# 如果anon_upload_enable=NO，则匿名用户不能上传文件，但可以删除或者重命名已经存在的文件
# 如果anon_mkdir_write_enable=NO，则匿名用户不能上传或者新建文件夹，但可以删除或者重命名已经存在的目录
anon_other_write_enable=YES/NO(NO)

# 是否改变匿名用户上传文件(非目录)的属主
chown_uploads=YES/NO(NO)

# 设置匿名用户上传文件(非目录)的属主名
# 建议不要设置为root
chown_username=username

# 设置匿名登入者新增或上传档案时的 umask 值，默认值为 077
anon_umask=077
```

## 配置
### 常用配置
```ini
#允许匿名用户登陆
anonymous_enable=YES
#允许本地用户登陆
local_enable=YES
#允许登陆用户写可访问的目录或文件
write_enable=YES
#指定用户登陆后直接进入系统的/mnt目录
local_root=/mnt
chroot_list_enable=YES
#限定登陆用户可访问的目录只有自己的家目录或指定的local_root目录
chroot_list_file=/etc/vsftpd/chroot_list
```

### 允许 vsftpd 匿名用户上传和下载
- 创建匿名用户登陆目录
    ```bash
    mkdir -p /var/ftp/pub
    chown -R ftp.ftp /var/ftp/pub
    chmod o+w /var/ftp/pub
    ```

- 修改 vsftpd.conf
    ```ini
    ＃允许匿名用户登录FTP
    anonymous_enable=YES
    ＃设置匿名用户的登录目录(如需要，需自己添加并修改)
    anon_root=/var/ftp/pub
    ＃打开匿名用户的上传权限
    anon_upload_enable=YES
    ＃打开匿名用户创建目录的权限
    anon_mkdir_write_enable=YES
    ＃打开匿名用户删除和重命名的权限(如需要，需自己添加)
    anon_other_write_enable=YES
    anon_umask=022
    ```

### 本地用户登陆
- 修改 vsftpd.conf
    ```
    # 不允许匿名用户登入
    anonymous_enable=no
    # 允许本地用户登入
    local_enable=YES
    # 当本地用户登入时，将被更换到定义的目录下
    # 默认值为各用户的家目录
    local_root=/home/username
    # 是否允许登陆用户有写权限
    # 属于全局设置，默认值为YES。
    write_enable=YES/NO(YES)
    # 本地用户新增档案时的 umask 值，默认值为077
    local_umask=022
    # 本地用户上传档案后的档案权限
    # 与chmod所使用的数值相同，默认值为0666
    file_open_mode=0755
    # 指定用户列表文件中的用户不允许切换到上级目录
    chroot_local_user=YES
    ```

### 创建 ftp 专用账户
- 创建用户 ftpuser1
    ```bash
    useradd -s /sbin/nologin ftpuser1
    passwd ftpuser1
    ```

- 修改 vsftpd.conf
    ```ini
    anonymous_enable=no
    local_enable=YES
    local_root=/home/ftpuser
    write_enable=YES
    local_umask=022
    file_open_mode=0755
    chroot_local_user=YES
    ```

## 参考
- [vsftpd 详细配置](http://vsftpd.beasts.org/vsftpd_conf.html)

