1
2
3
4
5
6
7
8
docker pull fauria/vsftpd

docker run -d -v /var/ftp:/home/vsftpd \
-p 20:20 -p 21:21 -p 21100-21110:21100-21110 \
-e FTP_USER=test -e FTP_PASS=test \
-e PASV_ADDRESS=192.168.60.128 \
-e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 \
--name vsftpd --restart=always fauria/vsftpd
  • /var/ftp:/home/vsftpd:映射 docker 容器 ftp 文件根目录(冒号前面是宿主机的目录,建议宿主机使用 /var 这样公共权限文件夹,如果使用类似 /home 这样的目录可能会造成客户端无法连接上服务器问题)
  • -p:映射 docker 端口(冒号前面是宿主机的端口)
  • -e FTP_USER=test -e FTP_PASS=test :设置默认的用户名密码(都为 test
  • PASV_ADDRESS:宿主机 ip,当需要使用被动模式时必须设置。
  • PASV_MIN_PORT~ PASV_MAX_PORT:给客服端提供下载服务随机端口号范围,默认 21100-21110,与前面的 docker 端口映射设置成一样。
1
docker run -d -v /var/ftp:/home/vsftpd -p 20:20 -p 21:21 -p  21100-21110:21100-21110 -e FTP_USER=liangbo -e FTP_PASS=liangbo4869 -e PASV_ADDRESS=192.168.1.103 -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 --name vsftpd fauria/vsftpd

Centos6新建用户并且限制用户的访问权限在某个指定目录中

新建一个新的用户,并且为了保证系统的安全性,指定该用户在指定的目录内进行访问

  1. 新建用户组:groupadd sftpusers

  2. 新建用户并将用户添加到分组中

    1. 使用root权限建立新用户的主目录,注意这里必须是root权限,否则后续的sftp不能连接

      1
      adduser sftpuser1 -d /sftp/sftpuser1 --shell /bin/false -g sftpusers

      如果上面已经用root建立了一个主目录。所以会有一个warning,不用管他。

    2. 设置密码: passwd sftpuser1

    3. 查看group情况: groups sftpuser1

  3. 修改sshd_config,使用 chroot 监狱限制 SSH 用户访问指定目录vim /etc/ssh/sshd_config

    1. 注释掉Subsystem sftp /usr/libexec/openssh/sftp-server

    2. 下一行添加Subsystem sftp internal-sftp

    3. 在文件最后添加;

      1
      2
      3
      4
      5
      Match User sftpuser1           #也可设置为用户组  Match group sftpusers
      ChrootDirectory /sftp/sftpuser1
      X11Forwarding no
      AllowTcpForwarding no
      ForceCommand internal-sftp

      这一段的意思是对visitors分组里的所有用户,我们只给他们通过sftp访问/home/fangke的权限,不能直接通过ssh登录服务器

    4. 重启sshd

      1
      2
      3
      4
      5
      6
      # service sshd restart
      Stopping sshd: [ OK ]
      Starting sshd: [ OK ]

      OR
      systemctl restart sshd
  4. 目录和权限设置

1)/sftp/sftpuser1
ChrootDirectory设置的目录/sftp/sftpuser1的所有者必须是root,并且该目录的上级目录/sftp的所有者也必须是root.
而且只有所有者拥有写权限,/sftp/sftpuser1和/sftp的权限最大设置只能是755.

1
2
chown root:root /sftp/sftpuser1
chmod -R 755 /sftp

2)/sftp/sftpuser1/download
由于上一层目录的权限是755,
因此所有非root用户都无法在目录中写入文件.
我们需要在ChrootDirectory指定的目录下建立子目录比如download,重新设置属主和权限.

这样就可以在读写download目录了.

1
2
3
mkdir /sftp/sftpuser1/download
chown sftpuser1:sftpusers /sftp/sftpuser1/download
chmod 755 /sftp/sftpuser1/download
  1. 测试

sftp -oPort=22 sftpuser1@127.0.0.1
输入密码

1
2
3
4
5
6
# sftp -oPort=22 sftpuser1@127.0.0.1
Connecting to 127.0.0.1...
sftpuser1@127.0.0.1's password:
sftp> ls
download
sftp>

在这里插入图片描述
\6. 问题和经验教训
按照网上的教程设置后,出现过几种情况
1)Write failed: Broken pipe
错误: Received unexpected end-of-file from SFTP server
错误: 无法连接到服务器

解决:
这个问题是由于ChrootDirectory指定的目录的权限问题。
注意归属和权限

drwxr-xr-x 3 root root 4096 Jun 17 16:12 sftp

drwxr-xr-x 3 root root 4096 Jun 17 15:21 sftpuser1

drwxr-xr-x 2 sftpuser1 sftpusers 4096 Jun 17 15:24 download

我最后的解决方案是: 单独建/sftp/sftpuser1 文件夹, 不要放在/home底下。

https://www.codenong.com/cs106809592/