osnosn

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::

体积很小的vsftpd_pureftpd_docker_在unraid中的配置_支持TLS和ipv6

转载注明来源: 本文链接 来自osnosn的博客,写于 2022-06-02.

当需要,传大量的文件 (并且有多层目录结构) 给朋友的时候,
可以建个ftp服务,使用专用账号,加密传输。

家里的宽带已经有公网ipv6了。
把文件放家里,共享出去,让朋友方便的时候自己下载。

如果你用的不是unraid。但能装docker。此文也能参考。

配置环境

  • unraid 6.9.2。

安装 docker 镜像 bfren/ftps

  • 是vsftpd-3.0.5,支持 tls-1.3,只有一个账户,ipv4和ipv6可以同时工作。如果注重安全,推荐这款
    支持 "TLS 数据连接会话恢复",这项似乎有更好的安全性,性能也比pureftpd好一些。
    Your FTP / SSL solution is really secure, right?】【CESA-2008-002 - rev 1
    没有ftpwho命令。只能通过ps,netstat -an间接了解在线连接数。
  • 镜像包 7.4MB,安装完占用 18.7MB。
  • 在 unraid 的 APPS 中搜索 ftps tls。能搜到一款。
  • 点击 Install 安装。
  • 配置
    • Container Path 1:/files 映射到 /mnt/user/appdata/bfren_ftps/files。(这是ftp登陆后看到的根目录"/")
    • Container Path 2:/ssl 映射到 /mnt/user/appdata/bfren_ftps/ssl
      • 删除这项,或留空这项, 每次重启,证书会自动重新生成。(有效期10年)
    • Container Variable 6:FTPS_USER 自己设置一个。
    • Container Variable 7:FTPS_PASS 自己设置一个。
      • 虽然vsftpd可以多账号,但这个docker只能设置一个账号。
    • Container Variable 8:FTPS_EXTERNAL_IP 写你的外网IPv4地址,或内网地址, 比如"192.168.1.22"。
      • 这项对IPv6没用,因为IPv6用 EPSV 命令。
      • 这项配置,会在解决IPv6的时候,注释掉。建议就填ipv4的内网地址吧。
    • Container Variable 9:FTPS_EXTERNAL_URI 写你的ddns域名。
      • FTPS_EXTERNAL_IPFTPS_EXTERNAL_URI,二选一,必须填一个。是这个docker镜像的要求。
    • 其他默认。
    • 再根据自己需要,添加映射别的目录。比如,把/files/share映射到 有大量文件的目录。
  • 支持 TLS-1.3。
  • 这个vsftpd的docker默认强制binary方式传输。客户端不会报错。
    vsftpd可以支持 ASCII 方式传输,需要增加设置项。个人不建议打开ASCII传输支持。
    个人还建议,客户端设置默认为binary方式传输。无论服务端是否支持ASCII方式传输。
  • 如果你有公网IPv4的话,在你的路由器上,设置 IPv4 的端口映射。
    这时,vsftpd在21端口,pasv端口范围是18700-18710.
    你可以任意选一个端口映射到21/TCP,18700-18710/TCP必须原样映射。

解决 IPv4+IPv6 的访问

  • 在 docker 管理界面,找到这个 bfren/ftps ,编辑它。
    点击 右上角 的 BASIC VIEW 变为 ADVANCED VIEW
  • Network Type: 选择 Custom: br0
    指定一个内网的 IPv4 地址,比如 192.168.1.22。使用一个内网中,没有使用的IP,避开unraid,路由器的IP。
    高级视图编辑中,Extra Parameters:加入参数。增加在后面,原有的参数保留,不删除。多个参数之间,用空格隔开。
    --sysctl net.ipv6.conf.all.disable_ipv6=0 --sysctl net.ipv6.conf.eth0.use_tempaddr=2
    这样,这个docker就会获得一个内网的ipv6,和一个eui64的公网ipv6。
  • IPv4 就是你指定的 192.168.1.22
    还要把这个 IPv6 找出来。

  • 启动这个docker。
    • 进入这个docker的终端。(每次修改过docker的配置,或者升级过docker。这个修改要重新做)
      修改 /etc/bf/init.d/13-vsftpd-conf,在文件的末尾加上4行,
      sed -i 's/^listen=YES/listen=NO/g;s/^#listen_ipv6=YES/listen_ipv6=YES/g' /etc/vsftpd/vsftpd.conf;
      sed -i 's/^require_ssl_reuse=NO/require_ssl_reuse=YES/g;s/^pasv_addr/#pasv_addr/g' /etc/vsftpd/vsftpd.conf;
      echo "listen_port=2100" >> /etc/vsftpd/vsftpd.conf;
      echo "max_clients=6" >> /etc/vsftpd/vsftpd.conf;
    • 这4行的说明:
      第1行,解决IPv6的访问。
      第2行,增强安全性(强制TLS会话恢复),解决IPv4+IPv6的访问。
      第3行,改监听端口。
      第4行,限制同时登录数。
    • 这里有个坑,出现500 OOPS: run two copies of vsftpd for IPv4 and IPv6,
      网上的文章都是说,注释#listen=YES,打开listen_ipv6=YES,发现无法解决。
      应该是listen=NO, listen_ipv6=YES 才行。
    • 官方文档vsftpd.conf】【官方文档vsftpd.conf
      vsftpd官网】【vsftpd官网
  • 重启这个docker。
  • 防火墙开放 2100/TCP, 18700-18710/TCP。
    参考【设置openwrt路由器的防火墙_允许从外网访问_ipv6服务_ipv4端口映射
    目标端口填 2100 18700-18710
  • 用ipv6访问,ftp的端口是2100。
  • ipv4的访问,也没问题。
    • 如果不注释掉pasv_addressipv4的支持就有问题了。能登陆,不能列目录,不能上传/下载。因为 PASV 命令,给出的IPv4地址不对。应该是这个docker的bug,不是vsftpd的问题。

安装 docker 镜像 crazymax/pure-ftpd

  • 是pure-ftpd-1.0.50,支持 tls-1.3,可以多账户,ipv4和ipv6可以同时工作。如果要多账户,推荐这款
    缺点是,不支持 "TLS 数据连接会话恢复",有被劫持的风险,性能比vsftpd差一点。
    数据通道,有可能被劫持,特别是长时间传输大量文件的时候。
    当你通过控制通道,请求服务器打开数据通道的端口的时候,被人捷足先登连接了数据通道,就被劫持了。
    下图,是FileZilla首次连接时,给出的警告。

    pureftp-ftpwho命令。可以看到在线的用户,正在传输哪个文件,传输速度,百分比进度。
    默认不能chmod,不能改名,自动强制获取你的外网ipv4地址。
  • 镜像包 19.4MB,安装完占用 63.1MB。
  • 在 unraid 的 APPS 中搜索 pure ftpd。能搜到一款。
  • 点击 Install 安装。
  • 配置
    • Appdata:/data 映射到 /mnt/user/appdata/crazymax-pure-ftpd/。(用户登陆后见到的根目录"/",实际是"/data/用户名")
    • FTP Folder:/home 映射到 /mnt/user/crazymax-pure-ftpd/
    • SECURE_MODE: 默认是 true。将会限制--maxclientsnumber 5,--norename
    • 其他默认。
    • 再根据自己需要,添加映射别的目录。比如,把/data/登陆用户名/share映射到 有大量文件的目录。
  • 根据 【github上的说明
    创建 用户pureftpd-dhparams.pem,pureftpd.pem,pureftpd.flags
    • 启动这个docker,进入docker的终端。
    • 创建用户,pure-pw useradd foo -u 1003 -g 1005 -d /home/foo -m,输入密码。
      查看用户列表,pure-pw list
      查看在线用户,pureftp-ftpwho
      这个docker可以创建多个账号。
    • 创建dh,openssl dhparam -out /data/pureftpd-dhparams.pem 2048,这里耗时可能超过4分钟。
    • 创建自签名证书,openssl req -x509 -nodes -newkey rsa:2048 -sha256 -days 365 -keyout /data/pureftpd.pem -out /data/pureftpd.pem。(有效期1年)
      查看证书内容,openssl x509 -noout -text -in pureftpd.pem
    • 创建文本文件,pureftpd.flags 添加一行,--tls 3
  • 重启docker,就有TLS支持,并且能登陆了。支持TLS-1.3。
  • pureftpd本来就不支持 ASCII 方式传输,只支持 binary 方式传输。如果用ASCII方式传输,客户端会报错。
    记得修改客户端的配置。否则文本类的文件会上传/下载失败


  • 如果你有公网IPv4的话,在你的路由器上,设置 IPv4 的端口映射。
    这时,pureftpd在2100端口,pasv端口范围是30000-30009.
    你可以任意选一个端口映射到2100/TCP,30000-30009/TCP必须原样映射。

解决 IPv4+IPv6 的访问

  • 在 docker 管理界面,找到这个 crazymax/pure-ftpd ,编辑它。
    点击 右上角 的 BASIC VIEW 变为 ADVANCED VIEW
  • Network Type: 选择 Custom: br0
    指定一个内网的 IPv4 地址,比如 192.168.1.22。使用一个内网中,没有使用的IP,避开unraid,路由器的IP。
    高级视图编辑中,Extra Parameters:加入参数。增加在后面,原有的参数保留,不删除。多个参数之间,用空格隔开。
    --sysctl net.ipv6.conf.all.disable_ipv6=0 --sysctl net.ipv6.conf.eth0.use_tempaddr=2
    这样,这个docker就会获得一个内网的ipv6,和一个eui64的公网ipv6。
  • IPv4 就是你指定的 192.168.1.22
    还要把这个 IPv6 找出来。
  • 启动这个docker。
    • 进入这个docker的终端。(每次修改过docker的配置,或者升级过docker。这个修改要重新做)
      修改 /etc/cont-init.d/01-config.sh
      注释掉两行 FLAGS ="$FLAGS --bind 0.0.0.0,2100" , FLAGS ="$FLAGS --ipv4only"
      增加一行FLAGS ="$FLAGS --bind 2100"
  • 参考【pureftpd文档】。
  • 重启这个docker。
  • 防火墙开放 2100/TCP, 30000-30009/TCP。
    参考【设置openwrt路由器的防火墙_允许从外网访问_ipv6服务_ipv4端口映射
    目标端口填 2100 30000-30009
  • 同时支持ipv4和ipv6访问,ftp的端口是2100。

支持ftp over tls的命令行客户端

其他docker


转载注明来源: 本文链接 https://www.cnblogs.com/osnosn/p/16341795.html
来自 osnosn的博客 https://www.cnblogs.com/osnosn/
.

posted on 2022-06-04 15:05  osnosn  阅读(1056)  评论(0编辑  收藏  举报