服务说明

FTP 是文件传输协议(File Transfer Protocol)的缩写,属于 TCP/IP 协议簇,用于 Internet 上控制文件的双向传输;SFTP 是一种安全的文件传输协议,通过网络传输文件的安全方法确保使用私有和安全的数据流来安全地传输数据。
FTP 默认使用 TCP 协议的 20、21 端口用于客户端进行通信,SFTP 跟 SSH 一起使用默认端口为 22

  • 20 端口用于建立数据连接,并传输文件数据
  • 21 端口用于建立控制连接,并传输 FTP 控制命令

    主动模式(Standard)

    服务器主动发起数据连接,FTP 客户端首先和服务器的 TCP 21 端口建立连接,用来发送命令,客户端需要接收数据的时候在这个通道上发送 PORT 命令;PORT 命令包含了客户端用什么端口接收数据,在传送数据的时候,服务器端通过自己的 TCP 20 端口连接至客户端的指定端口发送数据;FTP Server 必须和客户端建立一个新的连接用来传送数据。

    被动模式(Passive)

    服务器被动等待数据连接,建立控制通道和 Standard 模式类似,但建立连接后发送 Pasv 命令;服务器收到 Pasv 命令后,打开一个临时端口(端口号大于 1023 小于 65535)并且通知客户端在这个端口上传送数据的请求,客户端连接 FTP 服务器此端口,然后 FTP 服务器将通过这个端口传送数据。

    服务部署

    SCP 命令

    SCP 命令是用于通过 SSH 协议安全地将文件复制到远程系统和从远程系统复制文件到本地的命令
  • -1:强制 scp 命令使用协议 ssh1
  • -2:强制 scp 命令使用协议 ssh2
  • -4:强制 scp 命令只使用 IPv4 寻址
  • -6:强制 scp 命令只使用 IPv6 寻址
  • -B:使用批处理模式(传输过程中不询问传输口令或短语)
  • -C:允许压缩。(将 -C 标志传递给 ssh,从而打开压缩功能)
  • -p:保留原文件的修改时间,访问时间和访问权限
  • -q:不显示传输进度条
  • -r:递归复制整个目录
  • -v:详细方式显示输出;scp 和 ssh(1) 会显示出整个过程的调试信息
  • -c cipher:以 cipher 将数据传输进行加密,这个选项将直接传递给 ssh
  • -F ssh_config:指定一个替代的ssh配置文件,此参数直接传递给 ssh
  • -i identity_file:从指定文件中读取传输时使用的密钥文件,此参数直接传递给 ssh
  • -l limit: 限定用户所能使用的带宽,以 Kbit/s 为单位
  • -o ssh_option:如果习惯于使用 ssh_config(5) 中的参数传递方式
  • -P port:注意是大写的 P, port 是指定数据传输用到的端口号
  • -S program:指定加密传输时所使用的程序,此程序必须能够理解 ssh(1) 的选项

从本地复制到远程

1
2
3
scp -r local_folder remote_username@remote_ip:remote_folder 

scp -r local_folder remote_ip:remote_folder

从远程复制到本地
1
从远程复制到本地,只要将从本地复制到远程的命令的后 2 个参数调换顺序即可

vsftpd

vsftpd 是“very secure FTP daemon”的缩写,是一个 UNIX 类操作系统上运行的开源软件,它可以安全、快速、稳定地运行在 Linux、BSD、Solaris、HP-UX 以及 IRIX 上面。

  • 绝大多数 linux 发行版服务器的包管理工具中都自带了 vsftpd 的安装包,直接安装即可
  • 安装完毕后使用系统服务 systemd 对 vsftpd 进行启停等常规运维管理
  • 按需对配置文件进行修改,配置文件地址一般为:/etc/vsftpd/vsftpd.conf
    1
    yum install -y vsftpd

    配置文件

    1
    2
    cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
    vi /etc/vsftpd/vsftpd.conf

    用户权限

    安装完毕后,服务会自动为我们创建一个名为 ftp 的用户,方便之后进行 ftp 连接

    相关命令

    1
    2
    3
    4
    5
    6
    7
    8
    #添加自启
    systemctl enable vsftpd
    #启动、重启、关闭
    systemctl start vsftpd
    systemctl restart vsftpd
    systemctl stop vsftpd
    #查看状态
    systemctl status vsftpd

    Pure-FTPd

    Pure-FTPd 是一款专注于程序健壮和软件安全的免费 FTP 服务器软件(基于 BSD License),以安全和配置简单为设计目标,支持虚拟主机,IPV6,PAM 等功能;可以在多种类 Unix 操作系统中编译运行,包括:Linux、OpenBSD、NetBSD、FreeBSD、DragonFly BSD、Solaris、Tru64、Darwin、Irix and HP-UX,还有 Android 移植版本。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #包安装
    yum install -y epel-release
    yum install pure-ftpd

    #编译安装
    wget https://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.51.tar.gz
    tar -zxvf pure-ftpd-1.0.51.tar.gz
    cd pure-ftpd-1.0.51
    ./configure
    make && make install
    which pure-ftpd

    配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    vi /etc/pure-ftpd/pure-ftpd.conf

    #指定路径,PureDB用户数据库文件
    PureDB /etc/pure-ftpd/pureftpd.pdb
    #开启日志 /var/log/pureftpd.log
    VerboseLog yes
    #拒绝匿名用户登录
    NoAnonymous yes
    #使用被动模式,并限制端口范围
    PassivePortRange 48000 50000
    | 参数 | 说明 |
    | —- | —- |
    | ChrootEveryone yes | 启用chroot,限制所有用户在其主目录中 |
    | BrokenClientsCompatibility yes | 兼容不同客户端 |
    | Daemonize yes | 后台运行 |
    | MaxClientsPerIP 20 | 每个ip最大连接数 |
    | VerboseLog yes | 记录日志 |
    | DisplayDotFiles no | 显示隐藏文件 |
    | AnonymousOnly no | 只允许匿名用户访问 |
    | NoAnonymous yes | 不允许匿名用户连接 |
    | SyslogFacility none | 不将日志在syslog日志中显示 |
    | DontResolve yes | 不进行客户端DNS解析 |
    | MaxIdleTime 15 | 最大空闲时间 |
    | LimitRecursion 2000 8 | 浏览限制,文件2000,目录8层 |
    | AnonymousCanCreateDirs no | 匿名用户可以创建目录 |
    | MaxLoad 4 | 超出负载后禁止下载 |
    | PassivePortRange 45000 50000 | 被动模式端口范围 |
    | AnonymousRatio 1 10 | 匿名用户上传/下载比率 |
    | UserRatio 1 10 | 所有用户上传/下载比率 |
    | AntiWarez yes | 禁止下载匿名用户上传但未经验证的文件 |
    | AnonymousBandwidth 200 | 匿名用户带宽限制(KB) |
    | UserBandwidth 8 | 所有用户最大带宽(KB) |
    | Umask 133:022 | 创建文件/目录默认掩码 |
    | MinUID 100 | 最大UID限制 |
    | AllowUserFXP no | 仅运行用户进行FXP传输 |
    | AllowAnonymousFXP no | 对匿名用户和非匿名用户允许进行匿名 FXP 传输 |
    | ProhibitDotFilesWrite no | 不能删除/写入隐藏文件 |
    | ProhibitDotFilesRead no | 禁止读取隐藏文件 |
    | AutoRename yes | 有同名文件时自动重新命名 |
    | AnonymousCantUpload yes | 不允许匿名用户上传文件 |
    | AltLog clf:/var/log/pureftpd.log clf | 格式日志文件位置 |
    | LDAPConfigFile /etc/pureftpd-ldap.conf | LDAP 配置文件 |
    | MySQLConfigFile /etc/pureftpd-mysql.conf | MySQL 配置文件 (参考 README.MySQL) |
    | PGSQLConfigFile /etc/pureftpd-pgsql.conf | Postgres 配置文件 (参考 README.PGSQL) |
    | PureDB /etc/pure-ftpd/pureftpd.pdb | 用户数据库文件 |
    | MaxDiskUsage 99 | 当磁盘使用量打到99%时禁止上传 |
    | CreateHomeDir yes | 如果虚拟用户的目录不存在则自动创建 |
    | CustomerProof yes | 防止命令误操作 |
    | LogPID yes | 如果你要为日志每一行添加 PID 去掉下面行的注释 |
    | NoChmod yes | 不接受 CHMOD 命令用户不能更改他们文件的属性 |
    | KeepAllFiles yes | 允许用户恢复和上传文件,却不允许删除他们 |

    用户权限

    添加 ftp 用户组
    1
    2
    groupadd www
    useradd -g www -s /sbin/nologin -d /dev/null www
    创建虚拟账户
    1
    pure-pw useradd www -u www -d /opt/www -m

    相关命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #获取命令帮助
    pure-pw --help
    #创建用户信息数据库
    pure-pw mkdb
    #增加一个虚用户
    pure-pw useradd
    #修改用户信息
    pure-pw usermod
    #删除一个虚用户
    pure-pw userdel
    #修改用户密码
    pure-pw passwd

    # 查看用户信息
    pure-pw show www
    # 修改用户上传路径
    pure-pw usermod www -d /opt/www -m
    # 修改用户密码
    pure-pw passwd www

    NFS

    安装服务

    1
    2
    3
    4
    5
    6
    7
    #yum 安装
    yum install -y nfs-utils rpcbind
    #rpm 包安装
    rpm -ivh nfs-utils-1.3.0-0.68.el7.2.x86_64.rpm rpcbind-0.2.0-49.el7.x86_64.rpm
    #启动并设置开机自启
    systemctl start nfs && systemctl start rpcbind
    systemctl enable nfs && systemctl enable rpcbind

    创建共享

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #创建文件夹并赋予读写权限
    mkdir -pv /data/nfs && chmod 755 /data/nfs
    #配置共享文件夹及挂载权限
    vi /etc/exports
    /data/nfs 10.10.10.0/24(rw,sync)
    /data/nfs *(rw,sync,no_root_squash,no_all_squash)
    #重新加载 NFS 配置
    systemctl reload nfs
    exports -a
    showmount -e xxx.xxx.xxx.xxx

    挂载共享

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #创建文件夹
    mkdir -pv /app/data
    #临时挂载,vers=3 解决权限 nobody 的问题
    mount -t nfs -o vers=3 10.10.10.x:/data/nfs /app/data && df -h
    #永久挂载
    vi /etc/fstab
    10.10.10.x:/data/nfs /app/data nfs defaults 0 0
    mount -a
    #检查挂载点
    df -h

    其余选项

    挂载文件系统时可使用半角逗号“,”分隔设置多种挂载选项:
  • rsize:定义数据块的大小,用于客户端与文件系统之间读取数据;建议值:1048576
  • wsize:定义数据块的大小,用于客户端与文件系统之间写入数据;建议值:1048576

PS.如果需要更改 IO 大小参数(rsize & wsize),建议尽可能使用最大值:1048576,以避免性能下降

  • hard:在共享暂时不可用的情况下,应用程序会停止并等待至恢复在线状态,按需启用该参数
  • timeo:超时参数,搭配 hard 使用,单位为 0.1 秒,建议值:150-600(15-60s)
  • retrans:重试次数,建议值:2
  • noresvport:重连时使用新的 TCP 端口,保障在网络发生故障恢复时不会中断连接,建议启用该参数
    1
    mount -t nfs -o vers=3,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport 10.10.10.x:/data/nfs /app/data

    Samba

    1
    yum install -y samba

    配置文件

    Samba 服务的主配置文件:/etc/samba/smb.conf
    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
    vi /etc/samba/smb.conf

    [global]
    #修改为 Windows 下组名称
    workgroup = WORKGROUP
    #新版本已经取消这种验证方式
    #security = share
    security = user
    #Guest 访问必备
    map to guest = Bad Password
    passdb backend = tdbsam
    #允许访问的 IP
    #host allow =
    #共享名称
    [Public]
    comment = Public
    path = /home/share/public
    #显示共享目录
    browseable = yes
    #允许写入
    writable = yes
    #允许 guest 访问
    public = yes
    guest ok = yes
    #允许访问的用户 ,@为组
    valid users = gg @gg
    #允许写入的用户 ,@为组
    write list = root @root
    create mask =0777
    directory mask=0777
    PS.Samba 有四种安全级别(v4.1.1 及以上版本不支持 share 和 server):
  • share:不需要用户名和密码就可登陆
  • user:默认级别,需要输入用户名和密码
  • server:由另外一台 Samba 服务器来对用户进行身份验证
  • domain:把 Samba 服务器加入到域,由域控制器来进行身份验证
    1
    2
    3
    4
    #创建相应的目录
    mkdir 0777 /home/share/public
    #备份共享文件夹
    tar cvpzf ys_share_backup.tgz

    用户权限

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #使用新版 tdbsam 管理帐号
    #新建 Samba 账户
    pdbedit -a username
    #删除 Samba 账户
    pdbedit -x username
    #显示账户详细信息
    pdbedit -v username
    #列出 Samba 用户列表,读取 passdb.tdb 数据库文件
    pdbedit -L
    #列出 Samba 用户列表详细信息
    pdbedit -Lv

    相关命令

    1
    2
    3
    4
    5
    6
    7
    8
    #添加开机启动
    systemctl enable smb
    #启动、关闭、重启 SMB 服务
    systemctl start smb
    systemctl stop smb
    systemctl restart smb
    #查看 SMB 服务状态
    systemctl status smb

    服务故障

    一般服务启动错误,可以用“journalctl -xe”查看错误信息

    无法访问

    网络正常,服务启动的情况下还是无法访问,基本就是防火墙的问题,需要关闭或者放行相应的端口:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #放行端口
    firewall-cmd --permanent --add-port=137/tcp
    firewall-cmd --permanent --add-port=138/tcp
    firewall-cmd --permanent --add-port=139/tcp
    firewall-cmd --permanent --add-port=445/tcp
    firewall-cmd --permanent --add-port=901/tcp
    firewall-cmd --reload
    #关闭防火墙
    systemctl stop firewalld
    #其他命令
    systemctl enable firewalld #开机启动
    systemctl disable firewalld #禁止开机启动

    无效权限

    一切配置好,但是就是无法获取写入权限,排查发现是 Linux 的 Selinux 问题:
    1
    2
    3
    setenforce 0									#临时停止 Selinux
    vm /etc/sysconfig/selinux #编辑文件永久关闭
    SELINUX=disabled

    共享权限

    NFS 服务端和客户端用户、用户组 ID 不一致时会出现共享目录用户、用户组变成 ID;修改用户、用户组 ID 为相同的
    1
    2
    usermod -u 1001 app
    groupmod -g 1001 app