报错详情:
能登录,执行ls、put命令报错,cd、lcd、mkdir命令不报错,且经过简单排错之后发现本地不报错,同网段其他服务器也不报错,都可以正常访问
网络环境:
服务器被映射了公网ip,且只有ftp的默认端口21做了公网映射,其余网络规则均被关闭
报错内容:
500 Illegal PORT command.
ftp: bind: Address already in use
#或者
227 Entering Passive Mode(192.168.1,1,54,207)
注意,上面的报错分别是ftp在主动模式和被动模式的报错
关于主动模式和被动模式:
主动模式
主动模式与被动模式的最大的区别就是,FTP服务器是主动连接发送数据(主动模式),还是被动接收连接发送数据(被动模式)。
原理图
主动模式原理图
流程
原理如上图,流程解释如下
- FTP服务器监听21端口
- FTP客户端使用一个随机端口N,连接服务器21端口,并登录成功
- FTP监听N+1
- FTP发送PORT命令,把客户端IP和端口N+1发送给服务器
- 服务器使用端口20主动连接客户端N+1端口,并发送数据
抓包分析
主动模式抓包分析
- 客户端使用端口49991连接服务器的21端口
- 发送的PORT命令中,Active IP Address : 172.25.0.12,Active port: 49893
- 服务器使用端口20,发送数据到172.25.0.12:49893
缺点
被动模式最大的问题,就是客户端监听的端口,必须映射到公网IP,否则服务器就连接不上
被动模式
原理图
被动模式原理图
流程
原理如上图,流程解释如下
- FTP服务器监听21端口
- FTP客户端使用一个随机端口N,连接服务器21端口,并登录成功
- FTP发送PASV命令
- 服务器监听随机端口M,并返回服务器IP和M
- 客户端连接服务器M端口,并接收数据
抓包分析
被动模式抓包分析
- 客户端使用端口60253连接服务器的21端口
- 发送的PASV命令给服务器
- 服务器监听端口58506
- 服务器返回Passive IP Address : 172.25.0.101,Passive port: 58506
- 客户端使用使用端口60254连接服务器端口58506,并获取数据
错误原因及排错
了解了两种模式之后,怀疑也许是网络问题,再通过本地和同网段其他服务器排查之后发现没有问题,那么大概率不是ftp服务配置的问题,很大可能是网络问题。
出现以上两种模式的错误造成的原因多种多样,但是总体可以分析为:ftp通信分为控制通道和数据传输通道,有不同的端口,而我们的错误是可以访问目录,但是ls和put出错,是因为ls的时候要返回目录列表,涉及到数据传输,put就更不用说了,根据报错,我们一般情况可以从以下步骤来排错及解决:
-
关闭服务器防火墙(linux的iptables和firewalld),linux的selinux,selinux如果不想关闭,就需要加入一些参数来允许ftp协议,具体加什么可以百度,防火墙不想关闭的话也需要开启相关策略:
- 主动模式放开ftp客户端所在服务器或电脑全部端口,被动模式放开ftp所在服务器指定范围内的端口
- Iptables防火墙不支持ip_nat_ftp和ip_conntrack_ftp
在linux的ftp服务器上执行下列命令即可解决 modprobe ip_nat_ftp、modprobe ip_conntrack_ftp
一般如果ftp服务器本地没问题而同网段其他服务器访问不了,大概率是防火墙;
-
如果本地和同网段其他服务器并没有问题,而远程出错,那么说明出现在远程这一步了,其实两种模式各有其局限性:
a. 主动模式基本只能在内网服务器中使用,因为根据主动模式的原理,ftp服务器的21端口为控制端口,负责通信,20端口为数据传输端口负责数据传输,而主动模式还要求客户端所在服务器开放所有端口,并且服务器ip不能在NAT路由器和交换机后面,意思是需要映射在公网上,像我们的个人电脑基本就不符合这个网络要求,因为我们的电脑网络ip都是通过路由器交换机等转换来的局域网ip;
b. 被动模式的话就需要ftp服务器开放一堆端口,根据被动模式的原理,ftp服务器通过21通信,通信过程中服务器会随机启动一到三个端口(具体几个不太清楚,可以通过系统查看)告诉ftp客户端跟这个端口进行数据传输,而客户端也会随机启动一个端口跟服务器的端口进行数据传输,这个被动模式的端口是可以限制范围的,通过下列参数可以限制范围,这个范围会决定你能访问服务器的客户端数量:
pasv_enable=YES ,是否允使用被动模式,默认是允许的。
pasv_min_port=10000 ,指定使用被动模式时打开端口的最小值
pasv_max_port=10004 ,指定使用被动模式时打开端口的最大值。
根据我们的网络情况,我们只有21端口映射到了公网上,而被动模式其他端口并未映射且放开,所以才会报错,同时因为我们用的个人电脑连接的服务器,所以主动模式也不行。
c.还有种情况是机房或者是云平台的防火墙禁止了ftp协议;
d.另外,vsftpd还有个ipv4和ipv6的配置也可能会造成报错,我碰到的情况一般是登录失败,默认配置是ipv6开,ipv4不开。
这里再给出csdn大佬发出的解决相关问题的连接,可以进行参考 添加链接描述
ftp客户端使用方式
linux
linux ftp命令客户端默认使用被动模式
#yum安装ftp
ftp ip port #登录
debug #打印日志
passive # 开关被动模式
quote pasv # 使用主动模式
lcd #选择本地目录
windows
windows资源管理器输入ftp://ip:port/ ,默认使用被动模式,可以更换成主动模式
windows cmd命令行输入ftp之后(windows的命令行ftp只能使用主动模式,即使你切换被动他也是主动)
> open ip port #登录
> user 用户 #登录
> debug #打印日志
> quote PASV #使用主动模式