| 本帖最后由 木二 于 2022-12-6 17:38 编辑 
 一  FTP简介
 FTP(File Transfer Protocol)文件传输协议,用于Internet上控制文件的双向传输。
 下载:远程主机拷贝文件至本地;
 上传:本地主机拷贝文件至远程。
 
 二  FTP模式
 主动模式:服务端从20端口主动向客户端发起连接,即20端口向客户端的一个随机端口传输数据。
 被动模式:服务端在指定范围内某个端口被动等待客户端连接,即服务端采用随机端口等待客户端的随机端口来访问,从而传输数据。
 以服务器角度来分别是否主动和被动。
 
 三  常见FTP程序
 IIS、Serv-U                                                     #windows平台
 wu-ftpd、Proftpd                                          #Linux平台相对古老
 vsftpd(Very Secure FTP Daemon)             #主流Linux平台FTP服务
 
 四  VSFTP部署
 4.1  部署背景
 应客户侧需求,在我司产品BA中配置自动导出日志至FTP,客户咨询我们是否可以协助部署一个FTP服务器,处于客户至上原则,在明确客户FTP的需求后,规划此部署模式。
 基于维护、管理便利,此次部署采用容器docker方式,并且使用docker-compose遍及启动服务。
 
 4.2  部署规划
 规划如下节点,BA服务器充当FTP客户端。
 
 | 主机IP | 角色 | 备注 |  | 172.17.1.10 | FTP服务器 | 用于对接BA,做日志自动导出的存放服务器 |  | 172.17.201.36 | AC行为感知系统(BA服务器) | 配置对接FTP,实现自动导出日志 |  | 
 | 
 |  | 
 OS:CentOS7
 CPU:4C
 Memory:4G
 System-Disk:30G
 Data-Disk:500G
 本指南部署方式采用docker方式部署,使用docker-compose运行vsftp服务。
 
 提示:建议如上关闭防火墙和SELinux。复制代码[root@jzyftp ~]# systemctl disable firewalld.service --now
[root@jzyftp ~]# sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
[root@jzyftp ~]# reboot
 4.3  配置ftp目录
 将vdb整个磁盘采用LVM创建分区,并将分区挂载至ftp目录 /data 。
 复制代码[root@jzyftp ~]# fdisk /dev/vdb                                                   #创建分区
Welcome to fdisk (util-linux 2.23.2).
……
Command (m for help): n
Partition type:
p   primary (0 primary, 0 extended, 4 free)
e   extended
Select (default p):【默认】
Using default response p
Partition number (1-4, default 1):【默认】
First sector (2048-1048575999, default 2048):【默认】
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-1048575999, default 1048575999):【默认】
Using default value 1048575999
Partition 1 of type Linux and of size 500 GiB is set
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@jzyftp ~]# partprobe
[root@jzyftp ~]# pvcreate /dev/vdb1
[root@jzyftp ~]# vgcreate -s 16m balogvg /dev/vdb1
[root@jzyftp ~]# lvcreate -l 100%FREE -n baloglv balogvg
[root@jzyftp ~]# pvdisplay
[root@jzyftp ~]# vgdisplay
[root@jzyftp ~]# mkfs.ext4 /dev/balogvg/baloglv
[root@jzyftp ~]# vi /etc/fstab                                                         #追加如下挂载
……
/dev/mapper/balogvg-baloglv             /data   ext4    defaults        0 0
[root@jzyftp ~]# mount -a                                                             #自动挂载
[root@jzyftp ~]# mkdir -p /data/{deploy,ftp}
[root@jzyftp ~]# mkdir -p /var/log/ftp
4.4  安装docker
 4.5  安装Docker-Compose
将docker run单容器拉起命令优化为docker-compose方式,可实现服务器重启后自动拉起容器,因此需要先安装docker-compose。复制代码[root@jzyftp ~]# yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
[root@jzyftp ~]# yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@docker ~]# yum-config-manager --enable docker-ce-edge             #开启源
[root@docker ~]# yum-config-manager --enable docker-ce-test               #开启源
[root@docker ~]# yum -y install docker-ce                                                  #安装docker
[root@docker ~]# cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://dbzucv6w.mirror.aliyuncs.com"],
  "log-driver": "json-file",
  "mtu": 1450,
  "log-opts": {
    "max-size": "1000m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF
[root@docker ~]# systemctl enable docker --now
4.6  部署vsftp
vsftp采用被动模式,部署目录为 /data/deploy,同时文件目录设置为宿主机的 /data/ftp,运行的日志保存为宿主机的 /var/log/ftp 。复制代码[root@docker ~]# curl -SL https://get.daocloud.io/docker/compose/releases/download/v2.13.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
[root@docker ~]# chmod u+x /usr/local/bin/docker-compose
[root@docker ~]# sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
[root@docker ~]# docker-compose version
Docker Compose version v2.13.0
参数释义:
PASV_ADDRESS:自己的主机ip
FTP_UESR FTP_PASS:FTP服务器的用户名和密码,在container的/etc/vsftpd/virtual_users.txt里;
PASV_MIN_PORT PASV_MAX_PORT:被动模式所映射的端口使用范围,默认为21100、21110,同时必须在服务器的防火墙中开启20、21、22和此范围内端口;
LOCAL_UMASK:目录权限,默认为077
提示:查看docker-compose支持的service版本和Docker版本对应关系可参考:https://docs.docker.com/compose/compose-file/compose-file-v3/ 。复制代码[root@jzyftp ~]# cd /data/deploy
[root@jzyftp deploy]# vim vsftp_deploy.yaml
version: "3.8"
services:
  vsftpdsvc:
    image: fauria/vsftpd
    container_name: vsftpd
    privileged: true
    ports:
        - "20:20"
        - "21:21"
        - "21100-21110:21100-21110"
    volumes:
      - ../ftp:/home/vsftpd
      - /var/log/ftp:/var/log/vsftpd
    environment:
      - FTP_USER=bauser
      - FTP_PASS=********
      - PASV_ADDRESS=172.17.1.10
      - PASV_MIN_PORT=21100
      - PASV_MAX_PORT=21110
    restart: always
 五  确认验证
5.1  访问ftp
客户端访问 ftp://172.17.1.10 ,输入对应 bauser 用户名和 ******** 密码。复制代码[root@jzyftp deploy]# docker-compose -f vsftp_deploy.yaml up -d                    #正式部署
[root@jzyftp deploy]# docker-compose ls
NAME                STATUS              CONFIG FILES
deploy              running(1)          /data/deploy/vsftp_deploy.yaml
[root@jzyftp deploy]# docker ps
5.2  上传/下载测试
将文件复制到ftp服务器,确认上传成功。复制代码[root@client ~]# ftp 172.17.1.10
Connected to 172.17.1.10 (172.17.1.10).
220 (vsFTPd 3.0.2)
Name (172.17.1.10:root): bauser
331 Please specify the password.
Password:
……
5.3  确认验证复制代码ftp> put testfile02.txt
ftp> dir
227 Entering Passive Mode (172,17,1,10,82,114).
150 Here comes the directory listing.
-rw-------    1 ftp      ftp            22 Nov 30 09:15 testfile01.txt
-rw-------    1 ftp      ftp            21 Nov 30 09:25 testfile02.txt
226 Directory send OK.
复制代码[root@jzyftp ~]# ll /data/ftp/bauser/
total 8.0K
-rw------- 1 ftp ftp 22 Nov 30 17:15 testfile01.txt
-rw------- 1 ftp ftp 21 Nov 30 17:25 testfile02.txt
 |