FTP客户端连接服务器执行ls报错

报错详情:

能登录,执行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在主动模式和被动模式的报错

关于主动模式和被动模式:

下面内容引自 https://cloud.tencent.com/developer/article/2343463

主动模式

主动模式与被动模式的最大的区别就是,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就更不用说了,根据报错,我们一般情况可以从以下步骤来排错及解决:

  1. 关闭服务器防火墙(linux的iptables和firewalld),linux的selinux,selinux如果不想关闭,就需要加入一些参数来允许ftp协议,具体加什么可以百度,防火墙不想关闭的话也需要开启相关策略:

    1. 主动模式放开ftp客户端所在服务器或电脑全部端口,被动模式放开ftp所在服务器指定范围内的端口
    2. Iptables防火墙不支持ip_nat_ftp和ip_conntrack_ftp
      在linux的ftp服务器上执行下列命令即可解决 modprobe ip_nat_ftp、modprobe ip_conntrack_ftp

    一般如果ftp服务器本地没问题而同网段其他服务器访问不了,大概率是防火墙;

  2. 如果本地和同网段其他服务器并没有问题,而远程出错,那么说明出现在远程这一步了,其实两种模式各有其局限性:
    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 #使用主动模式
  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值