中途接触到 ESPV EPRT PASV PORT,也自己看了FTP Extensions RFC,FTP 协议还是蛮简单的!
首先说下主动模式 PORT EPRT 的不同
[root@54 ~]# curl -uming:ming --ftp-port 172.16.1.54 ftp://172.16.2.56 # EPRT 请求:
C -> S EPRT |1|172.16.1.54|61257|\r\n # 数据包如同这样
S -> C 200 PORT command successful\r\n
[root@54 ~]# curl -uming:ming --ftp-port 172.16.1.54 --disable-eprt ftp://172.16.2.56 # 关闭EPRT 使用 PORT
C -> S PORT 172,16,1,54,250,151\r\n # 不清楚 250,151 -> port: 64151
S -> C 200 PORT command successful\r\n
先说共同点,就是都包含端口,和IP,之所以包含IP是因为如果PORT经过SNAT后,FTP 无法访问一个内网IP,只能到达网关,所以需要指向网关IP!
EPRT |1|172.16.1.54|61247|\\ # 前面1 代表IPV4,如果是2则代表IPV6,这就说明兼容了IPV6 !
再来看看EPSV的不同!
[root@54 ~]# curl -uming:ming ftp://172.16.2.56 # EPSV请求
C -> S EPSV\r\n
S -> C 229 Extended Passive mode OK (|||41796|)\r\n
[root@54 ~]# curl -uming:ming --disable-epsv ftp://172.16.2.56 # 关闭EPSV 使用 PASV
C -> S PASV\r\n
S -> C 227 Entering Passive Mode (172,16,2,56,151,189)\r\n #
可 以看到,使用指令不同,返回的状态码也不同,两者都返回port,但是EPSV却没有返回IP地址,这是因为,如果FTP 在防火墙后端使用DNAT转发,那么这个IP正好是个内网就会导致访问错误,而EPSV 只返回端口,就避免了这个问题,Client直接连接到 FTP Server 外网防火墙,防火墙上正确转发就OK了!
总结:
可以看到rfc959和NAT确实存在些问题,用","作为分隔符很不舒服!
关于EPRT PESV 格式以及分隔符的说明,请阅读rfc2428!
rfc2428
FTP Extensions for IPv6 and NATs
2. The EPRT Command
EPRT
3. The EPSV Command
(