PASV ftp

1.功能描述

文件传输协议(File Transfer Protocol,FTP),基于该协议FTP客户端与服务端可以实现共享文件、上传文件、下载、删除文件。FTP服务器端可以同时提供给多人共享使用。

FTP服务是Client/Server(简称C/S)模式,基于FTP协议实现FTP文件对外共享及传输的软件称之为FTP服务器源端,客户端程序基于FTP协议,则称之为FTP客户端,FTP客户端可以向FTP服务器上传、下载文件。

FTP上传和下载文件需要有两个tcp连接:

一个是控制连接(port:21),控制连接用于在两个主机之间传输控制信息,如口令,用户标识,存放、获取文件等命令

一个是数据连接(port:20)。数据连接用于实际发送一个文件,发送完文件之后数据连接会关闭

关于数据连接的建立实际又有两种模式:主动模式和被动模式

主动模式 Port(服务端连接客户端)

客户端开启一个端口N(>1023)向服务端的21端口,建立连接,同时开启一个N+1端口监听,告诉服务端,我监听的是N+1端口,服务端接到请求之后,用自己的20端口连接到客户端的N+1端口,进行传输

被动模式 Passive(客户端连接服务端)

客户端同时随机开启两个端口(比如1024,1025),一个端口(1024)跟服务端的21端口建立连接。服务端接到请求之后,随机会开启一个端口(1027)并告诉客户端我开启的是1027端口,客户端用另一个端口(1025)与服务端的(1027)端口进行连接,传输数据

隐式FTPS

FTP服务器要求FTP客户必须初始化SSL握手过程并和FTP服务器之间建立安全的加密控制连接, 加密控制连接建立之后FTP命令才能够被送到FTP服务器. 如果FTP客户不支持SSL功能,或它和服务器之间没有建立安全的加密控制连接,FTP服务器将不对来自FTP客户的命令做出任何反应

功能支持

  • 支持明文的FTP反向代理
  • 支持隐式FTPS模式(客户端和服务端先建立加密连接,再开始发送命令,数据连接也需要加密)
  • FTP/FTPS被动模式支持(ipv4)
  • FTP/FTPS被动模式支持(ipv6)

2.依赖模块

该功能的实现需要依赖range模块 提供的端口流量转发功能

njet.conf:

load_module modules/njt_range_module.so;           

3.指令说明

  • 控制通道指令
Syntax ftp_ctrl zone={ftp_zone:10M} proxy_ip={192.168.40.136} min_port={12000} max_port={13000};
Default -
Context stream,server
  • 参数说明

端口范围跟真实的ftp服务端端口范围没有必然联系,对于客户端来说,只会看到代理的端口范围,并发数受代理端口范围限制

参数 类型 必填 描述
zone string 配置共享内存以及大小
proxy_ip string 代理是ipv4情况下会使用此ip返回给客户端ftp代理的IP,因为可能存在默认的127.0.0.1或者多ip情况,必须明确填写ip
min_port int ftp 代理支持的端口范围下限
max_port int ftp 代理支持的端口范围上限(max_port-min_port 表示ftp代理支持的最多ftp并发数据连接)
  • 数据通道指令:
Syntax ftp_data zone={ftp_zone};
Default -
Context stream,server
  • 参数说明
参数 类型 必填 描述
zone string 设置共享内存名称,由控制通道创建,此处只需要指定共享内存名称,与控制通道共享内存名称保持一致

4.配置样例

系统依赖

需要系统上先执行如下命令:
modprobe nf_conntrack_ipv4
modprobe nf_conntrack_ipv6

注:curl低版本有的不支持ftp 被动模式等配置,请使用高版本测试

4.1 FTP/FTPS被动模式支持(ipv4)

明文FTP模式

njet.conf配置

helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
helper ctrl modules/njt_helper_ctrl_module.so conf/njet_ctrl.conf;
 
load_module modules/njt_http_location_module.so;

load_module modules/njt_range_module.so;           #依赖range模块
load_module modules/njt_http_dyn_range_module.so;  #动态range模块,如果不需要动态修改,可不加载这个模块
 

user  root;
worker_processes  1;

cluster_name helper;
node_name node1;

error_log  logs/error.log info;
pid        logs/njet.pid;

events {
    worker_connections  1024;
}

#此处配置range规则,range模块会使用系统的iptables规则
range type=tcp src_ports=11000:12000 dst_port=10001; 
#默认路径为/usr/sbin/iptables, 如果系统路径不一致需要调用该指令设置下路径
range iptables_path=/usr/sbin/iptables;

stream {

        upstream ctl_upstream {
                hash $remote_addr consistent;
                server 192.168.40.91:21;
                
        }

        server {
                listen       8001;
                ftp_ctrl  zone=ftp_zone:10M proxy_ip=192.168.40.156 min_port=11000 max_port=12000;
                proxy_pass  ctl_upstream;
                proxy_timeout 2000s;  #ftp连接默认10分钟会断开,如果传输大文件超过10分钟时,配置该指令
        }

        server {
                #不能再配置proxy_pass指令
                listen       10001 mesh;
                ftp_data   zone=ftp_zone;
        }
}

注:proxy_ip 配置的是部署njet代理的服务器的ip ,upstream ctl_upstream 里配置的是部署的ftp server的服务器的ip

vsftpd服务端建议配置:vi /etc/vsftpd/vsftpd.conf

#listen_ipv6=YES  
#配置为ftp 被动模式
pasv_enable=YES

#配置被动模式数据端口范围
pasv_min_port=60000
pasv_max_port=60100
pasv_promiscuous=YES 
#这个配置是允许user_list文件里配置的用户可以访问
userlist_deny=no
隐式FTPS模式

OpenNJet配置

helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
helper ctrl modules/njt_helper_ctrl_module.so conf/njet_ctrl.conf;

load_module modules/njt_http_location_module.so;

load_module modules/njt_range_module.so;           #依赖range模块
load_module modules/njt_http_dyn_range_module.so;  #动态range模块,如果不需要动态修改,可不加载这个模块

user  root;
worker_processes  1;

cluster_name helper;
node_name node1;

error_log  logs/error.log info;
pid        logs/njet.pid;

events {
    worker_connections  1024;
}

#此处配置range规则,range模块会使用系统的iptables规则
range type=tcp src_ports=11000:12000 dst_port=10001; 
#默认路径为/usr/sbin/iptables, 如果系统路径不一致需要调用该指令设置下路径
range iptables_path=/usr/sbin/iptables;

stream {

        upstream ctl_upstream {
                hash $remote_addr consistent;
                server 192.168.40.91:990;
        }


        server {
                listen       21 ssl;
                
                ftp_ctrl  zone=ftp_zone:10M proxy_ip=192.168.40.136 min_port=11000 max_port=12000;

                ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
                ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
                ssl_certificate     /etc/vsftpd/.sslkey/vsftpd.pem;
                ssl_certificate_key     /etc/vsftpd/.sslkey/vsftpd.pem;

                proxy_ssl on;
                proxy_pass  ctl_upstream;
                proxy_timeout 2000s;  #ftp连接默认10分钟会断开,如果传输大文件超过10分钟时,配置该指令
        }

        server {
                listen       10001 ssl mesh;
                
                ftp_data   zone=ftp_zone;
                ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
                ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
                ssl_certificate     /etc/vsftpd/.sslkey/vsftpd.pem;
                ssl_certificate_key     /etc/vsftpd/.sslkey/vsftpd.pem;
                proxy_ssl on;
        }
}

vsftpd配置示例

#配置服务端为隐式ftp
implicit_ssl=YES

#开启ssl
ssl_enable=YES
ssl_sslv2=YES
ssl_sslv3=YES
ssl_tlsv1=YES

#控制连接与数据连接不共用ssl session, 一定要配置
require_ssl_reuse=NO
#配置ssl证书
rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem
#一般隐式ftp 端口会只用990端口,如果不配置,vsftpd默认还是21,
#有的ftp服务可能会默认为990,此处明确指定端口为990
listen_port=990

#配置ftp server 日志文件
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
xferlog_file=/var/log/xferlog

#配置为ftp 被动模式
pasv_enable=YES

#配置被动模式数据端口范围,这个端口范围跟ftp代理的端口范围没有必然关系
pasv_min_port=60000
pasv_max_port=60100
#这个配置是允许user_list文件里配置的用户可以访问
userlist_deny=no

4.2 FTP/FTPS被动模式支持(ipv6)

明文FTP模式

vsftpd服务端配置( /etc/vsftpd/vsftpd.conf )

#下面方式二选一, 只能同时选择一个,不能同时两个都配置YES
#listen 配置为YES,ipv4 端口监听
listen=NO

#listen_ipv6 配置为YES, 会同时开启ipv4和ipv6端口监听
listen_ipv6=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
xferlog_file=/var/log/xferlog

#被动模式支持,一定开启
pasv_enable=YES

#被动模式端口范围
pasv_max_port=60300
pasv_min_port=60000


userlist_deny=no
  1. njet.conf 配置(代理ipv6 后端ipv6):
...
load_module modules/njt_range_module.so;           #range 模块
load_module modules/njt_http_dyn_range_module.so;  #range 动态修改模块,依赖于上面的range模块

...

#配置ip6tables路径
range ip6tables_path=/usr/sbin/ip6tables;
#配置ipv6 端口映射
range type=tcp family=ipv6 src_ports=8200:8300 dst_port=8100;

stream {
        
        upstream ctl_upstream {
                hash $remote_addr consistent;
                #后端为vsftp 服务器(ipv6)
                server [2408:8606:8400:30a:6::1a]:21;
        }
        
        
        server {
                #配置ipv6 控制面监听端口
                listen       [::]:8000;
                
                #配置ftp控制通道
                #proxy_ip参数在代理是ipv4情况下会使用此ip返回给客户端
                ftp_ctrl  zone=ftp_zone:10M proxy_ip=192.168.40.158 min_port=8200 max_port=8300;

                proxy_pass  ctl_upstream;
                proxy_timeout 2000s;  #ftp连接默认10分钟会断开,如果传输大文件超过10分钟时,配置该指令
        }
        
        server {
                #配置ipv6 数据面监听端口
                listen       [::]:8100 mesh;
                
                #配置ftp数据通道
                ftp_data   zone=ftp_zone;
        }
}

2.njet.conf 代理ipv6 后端ipv4

...
load_module modules/njt_range_module.so;           #range 模块
load_module modules/njt_http_dyn_range_module.so;  #range 动态修改模块,依赖于上面的range模块
 
...

#配置ip6tables路径
range ip6tables_path=/usr/sbin/ip6tables;
#配置ipv6 端口映射
range type=tcp family=ipv6 src_ports=8200:8300 dst_port=8100;

stream {
        
        upstream ctl_upstream {
                hash $remote_addr consistent;
                #后端为vsftp 服务器(ipv4)
                server 192.168.40.157:21;
        }
        
        
        server {
                #配置ipv6 控制面监听端口
                listen       [::]:8000;
                
                #配置ftp控制通道
                #proxy_ip参数在代理是ipv4情况下会使用此ip返回给客户端
                ftp_ctrl  zone=ftp_zone:10M proxy_ip=192.168.40.158 min_port=8200 max_port=8300;

                proxy_pass  ctl_upstream;
                proxy_timeout 2000s;  #ftp连接默认10分钟会断开,如果传输大文件超过10分钟时,配置该指令
        }
        
        server {
                #配置ipv6 数据面监听端口
                listen       [::]:8100 mesh;
                
                #配置ftp数据通道
                ftp_data   zone=ftp_zone;
        }
}
隐式FTPS模式

vsftpd服务端配置( /etc/vsftpd/vsftpd.conf )

#listen 配置为YES,ipv4 端口监听
listen=no

#listen_ipv6 配置为YES, 会同时开启ipv4和ipv6端口监听
listen_ipv6=YES


#配置服务端为隐式ftp
implicit_ssl=YES

#开启ssl
ssl_enable=YES
ssl_sslv2=YES
ssl_sslv3=YES
ssl_tlsv1=YES

#控制连接与数据连接不共用ssl session, 一定要配置
require_ssl_reuse=NO
#配置ssl证书
rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem
#一般隐式ftp 端口会只用990端口,如果不配置,vsftpd默认还是21,
#有的ftp服务可能会默认为990,此处明确指定端口为990
listen_port=990

#配置ftp server 日志文件
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
xferlog_file=/var/log/xferlog

#配置为ftp 被动模式
pasv_enable=YES

#配置被动模式数据端口范围(根据业务需要配置端口范围),这个端口范围跟ftp代理的端口范围没有必然关系
pasv_max_port=60300
pasv_min_port=60000

#这个配置是允许user_list文件里配置的用户可以访问
userlist_deny=no
  1. njet.conf代理ipv6 后端ipv6
...
load_module modules/njt_range_module.so;           #range 模块
load_module modules/njt_http_dyn_range_module.so;  #range 动态修改模块,依赖于上面的range模块
  
...

#配置ip6tables路径
range ip6tables_path=/usr/sbin/ip6tables;
#配置ipv6 端口映射
range type=tcp  family=ipv6 src_ports=8200:8300 dst_port=8100;
stream {
        
        upstream ctl_upstream {
                hash $remote_addr consistent;
                #后端为vsftp 服务器(ipv4)
                server [2408:8606:8400:30a:6::1a]:990;
        }
        
        
        server {
                #配置ipv6 控制面监听端口
                listen       [::]:8000 ssl;
                
                #配置ftp控制通道
                #proxy_ip参数在代理是ipv4情况下会使用此ip返回给客户端
                ftp_ctrl  zone=ftp_zone:10M proxy_ip=192.168.40.158 min_port=8200 max_port=8300;

                ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
                ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
                ssl_certificate     /etc/vsftpd/.sslkey/vsftpd.pem;
                ssl_certificate_key     /etc/vsftpd/.sslkey/vsftpd.pem;

                proxy_ssl on;
                proxy_pass  ctl_upstream;
                proxy_timeout 2000s;  #ftp连接默认10分钟会断开,如果传输大文件超过10分钟时,配置该指令
        }

        server {
                #配置ipv6 数据面监听端口
                listen       [::]:8100 ssl mesh;

                #配置ftp数据通道
                ftp_data   zone=ftp_zone;
                ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
                ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
                ssl_certificate     /etc/vsftpd/.sslkey/vsftpd.pem;
                ssl_certificate_key     /etc/vsftpd/.sslkey/vsftpd.pem;
                proxy_ssl on;
        }
}
  1. njet.conf代理ipv6 后端ipv4
...
load_module modules/njt_range_module.so;           #range 模块
load_module modules/njt_http_dyn_range_module.so;  #range 动态修改模块,依赖于上面的range模块
  
#配置ip6tables路径
range ip6tables_path=/usr/sbin/ip6tables;
#配置ipv6 端口映射
range type=tcp family=ipv6 src_ports=8200:8300 dst_port=8100;

stream {
        
        upstream ctl_upstream {
                hash $remote_addr consistent;
                #后端为vsftp 服务器(ipv4)
                server 192.168.40.158:990;
        }
        
        server {
                #配置ipv6 控制面监听端口
                listen       [::]:8000 ssl;
                
                #配置ftp控制通道
                #proxy_ip参数在代理是ipv4情况下会使用此ip返回给客户端
                ftp_ctrl  zone=ftp_zone:10M proxy_ip=192.168.40.158 min_port=8200 max_port=8300;

                ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
                ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
                ssl_certificate     /etc/vsftpd/.sslkey/vsftpd.pem;
                ssl_certificate_key     /etc/vsftpd/.sslkey/vsftpd.pem;

                proxy_ssl on;
                proxy_pass  ctl_upstream;
                proxy_timeout 2000s;  #ftp连接默认10分钟会断开,如果传输大文件超过10分钟时,配置该指令
        }

        server {
                #配置ipv6 数据面监听端口
                listen       [::]:8100 ssl mesh;

                #配置ftp数据通道
                ftp_data   zone=ftp_zone;
                ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
                ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
                ssl_certificate     /etc/vsftpd/.sslkey/vsftpd.pem;
                ssl_certificate_key     /etc/vsftpd/.sslkey/vsftpd.pem;
                proxy_ssl on;
        }
}

5.调用样例

5.1 FTP服务器和客户端搭建

5.1.1 FTP 服务端安装

安装vsftpd

yum -y install vsftpd
systemctl start|stop|restart vsftpd

Root 权限登录

修改vsftpd.conf文件:sudo vim /etc/vsftpd.conf,将 #write_enable=YES 前面的注释#去掉

sudo vim /etc/ftpusers  更改/etc/ftpusers,注释掉root用户
systemctl stop vsftpd
systemctl start vsftpd

5.1.2 FTP 客户端安装 (也可以使用带有图形化页面的FlashFXP)

yum -y install ftp

5.1.3 下载文件(ipv4)

[root@CDN157 ~]# ftp 192.168.40.156 8001
Connected to 192.168.40.156 (192.168.40.156).
220 (vsFTPd 3.0.2)
Name (192.168.40.156:root): root      #此处输入的用户名和密码是部署的ftp server 的用户名和密码
331 Please specify the password.  
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 
ftp> 
ftp> get /home/limin/ftp//upload/log2.txt /home/limin/ftp/aa.txt
local: /home/limin/ftp/aa.txt remote: /home/limin/ftp//upload/log2.txt
227 Entering Passive Mode (192,168,40,156,42,248).
150 Opening BINARY mode data connection for /home/limin/ftp//upload/log2.txt (65536 bytes).
226 Transfer complete.
65536 bytes received in 0.000294 secs (222911.57 Kbytes/sec)
ftp> 

5.1.4 上传文件(ipv4):

[root@CDN157 ~]# ftp 192.168.40.156 8001
Connected to 192.168.40.156 (192.168.40.156).
220 (vsFTPd 3.0.2)
Name (192.168.40.156:root): root
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put /home/limin/ftp/upload/log3.txt
local: /home/limin/ftp/upload/log3.txt remote: /home/limin/ftp/upload/log3.txt
227 Entering Passive Mode (192,168,40,156,42,249).
150 Ok to send data.
226 Transfer complete.
65536 bytes sent in 0.00012 secs (546133.38 Kbytes/sec)
ftp> 

5.1.5 下载文件(隐士:代理ipv6 后端ipv6):

[limin@CDN156 ipv6]$ lftp -u root:root ftps://[2408:8606:8400:30a:6::1a]:8000
lftp root@2408:8606:8400:30a:6::1a:~> ls
-rw-r--r--    1 0        0               0 Dec 20  2023 11
-rw-r--r--    1 0        0        1073741824 Dec 20 02:57 6622og
-rw-r--r--    1 0        0            4120 Nov 28 02:54 HD_BDS.hdb888
-rw-r--r--    1 0        0            4120 Nov 28 03:01 HD_BDS1.hdb888
-rw-r--r--    1 0        0             343 Dec 20 03:04 down.sh
lftp root@2408:8606:8400:30a:6::1a:~> get down.sh /home/limin/ftp/ipv6
get: Access failed: 550 Failed to open file. (/home/limin/ftp/ipv6)
343 bytes transferred in 45 seconds (8b/s)
Transfer of 1 of 2 files failed
lftp root@2408:8606:8400:30a:6::1a:~> bye


[limin@CDN156 ipv6]$ ll
总用量 4
-rw-rw-r-- 1 limin limin 343 12月 20 11:04 down.sh

5.1.6 上传文件(隐士:代理ipv6 后端ipv6):

[limin@CDN156 ipv6]$ lftp -u root:root ftps://[2408:8606:8400:30a:6::1a]:8000
lftp root@2408:8606:8400:30a:6::1a:~> put /home/limin/ftpipv6/download/11.log 
1073741824 bytes transferred in 19 seconds (52.80M/s)                                      
lftp root@2408:8606:8400:30a:6::1a:~> bye

5.1.7 下载文件(明文:代理ipv6 后端ipv4)

EPSV方式

根据目标地址为ipv6,curl都只会选择使用EPSV方式连接

禁用epsv,也会使用epsv方式

[root@CDN157 ~]# curl --disable-epsv -u root:root ftp://[2408:8606:8400:30a:6::1a]:8000/11.log -o testbak -vvv             
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying [2408:8606:8400:30a:6::1a]:8000...
* Connected to 2408:8606:8400:30a:6::1a (2408:8606:8400:30a:6::1a) port 8000
< 220 (vsFTPd 3.0.2)
> USER root
< 331 Please specify the password.
> PASS root
< 230 Login successful.
> PWD
< 257 "/root"
* Entry path is '/root'
* Request has same path as previous transfer
> EPSV
* Connect data stream passively
* ftp_perform ends with SECONDARY: 0
< 229 Entering Extended Passive Mode (|||8200|).
* Connecting to 2408:8606:8400:30a:6::1a (2408:8606:8400:30a:6::1a) port 8200
*   Trying [2408:8606:8400:30a:6::1a]:8200...
* Connected to 2408:8606:8400:30a:6::1a (2408:8606:8400:30a:6::1a) port 8000
> TYPE I
< 200 Switching to Binary mode.
> SIZE 11.log
< 213 1073741824
> RETR 11.log
< 150 Opening BINARY mode data connection for 11.log (1073741824 bytes).
* Maxdownload = -1
* Getting file with size: 1073741824
{ [7140 bytes data]
 94 1024M   94  972M    0     0   101M      0  0:00:10  0:00:09  0:00:01 84.1M* Remembering we are in dir ""
< 226 Transfer complete.
100 1024M  100 1024M    0     0   104M      0  0:00:09  0:00:09 --:--:-- 85.3M
* Connection #0 to host 2408:8606:8400:30a:6::1a left intact

5.1.8 上传文件(明文:代理ipv6 后端ipv4)

[root@CDN157 ~]# sudo curl --disable-epsv -u root:root -T /home/limin/ftp/log2.txt   ftp://[2408:8606:8400:30a:6::1a]:8000 -vvv                      
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying [2408:8606:8400:30a:6::1a]:8000...
* Connected to 2408:8606:8400:30a:6::1a (2408:8606:8400:30a:6::1a) port 8000
< 220 (vsFTPd 3.0.2)
> USER root
< 331 Please specify the password.
> PASS root
< 230 Login successful.
> PWD
< 257 "/root"
* Entry path is '/root'
* Request has same path as previous transfer
> EPSV
* Connect data stream passively
* ftp_perform ends with SECONDARY: 0
< 229 Entering Extended Passive Mode (|||8201|).
* Connecting to 2408:8606:8400:30a:6::1a (2408:8606:8400:30a:6::1a) port 8201
*   Trying [2408:8606:8400:30a:6::1a]:8201...
* Connected to 2408:8606:8400:30a:6::1a (2408:8606:8400:30a:6::1a) port 8000
> TYPE I
< 200 Switching to Binary mode.
> STOR log2.txt
< 150 Ok to send data.
} [42840 bytes data]
 22  390M    0     0   22 89.4M      0   428M --:--:-- --:--:-- --:--:--  427M* We are completely uploaded and fine
* Remembering we are in dir ""
< 226 Transfer complete.
100  390M    0     0  100  390M      0   384M  0:00:01  0:00:01 --:--:--  384M
* Connection #0 to host 2408:8606:8400:30a:6::1a left intact