体积很小的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_IP
和FTPS_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的终端。(每次修改过docker的配置,或者升级过docker。这个修改要重新做)
- 重启这个docker。
- 防火墙开放 2100/TCP, 18700-18710/TCP。
参考【设置openwrt路由器的防火墙_允许从外网访问_ipv6服务_ipv4端口映射】
目标端口填2100 18700-18710
- 用ipv6访问,ftp的端口是2100。
- ipv4的访问,也没问题。
- 如果不注释掉
pasv_address
,ipv4的支持就有问题了。能登陆,不能列目录,不能上传/下载。因为 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。
- 参考【pureftpd文档】。
- 重启这个docker。
- 防火墙开放 2100/TCP, 30000-30009/TCP。
参考【设置openwrt路由器的防火墙_允许从外网访问_ipv6服务_ipv4端口映射】
目标端口填2100 30000-30009
- 同时支持ipv4和ipv6访问,ftp的端口是2100。
支持ftp over tls的命令行客户端
- 【lftp】
其他docker
转载注明来源: 本文链接 https://www.cnblogs.com/osnosn/p/16341795.html
来自 osnosn的博客 https://www.cnblogs.com/osnosn/.