linux虚拟机上vsftpd服务器与另一台linux平台ftp客户虚拟机之间的进行主动被动切换的问题
我在使用虚拟机测试vsftpd的搭建效果的时候,发现如果我们使用linux平台上的ftp工具,并从默认的被动传输模式切换到主动模式的时候,ftp的数据连接怎么样都建立不起来。于是我就做了抓包分析。以下是分析过程:1、我的windows主机使用自带的ftp工具是完全可以登录并获取数据的,且其默认使用的是主动模式。这就说明我的服务器上的主动模式是开启的,当我们使用linux的ftp工具进行服务器的登录
我在使用虚拟机测试vsftpd的搭建效果的时候,发现如果我们使用linux平台上的ftp工具,并从默认的被动传输模式切换到主动模式的时候,ftp的数据连接怎么样都建立不起来。于是我就做了抓包分析。以下是分析过程:
1、我的windows主机使用自带的ftp工具是完全可以登录并获取数据的,且其默认使用的是主动模式。这就说明我的服务器上的主动模式是开启的,当我们使用linux的ftp工具进行服务器的登录的时候,也可以登录上说明被动模式也是OK的。
当我使用linux客户机的ftp工具从被动模式切换到主动模式的时候却出现了数据通道连接建立失败的情况。我查了很多资料,在配置vsftpd的时候都有使用iptables加入一些防火墙的规则,我的两台ftp服务器和ftp客户机上面都使用的是iptables,firewalld都卸载了,我并没有对iptables做过多的规则限制,它们的iptables上filter表的INPUT,OUTPUT以及FORWARD三个链的默认都是通过。上面有的规则只有默认添加了有关DNS和DHCP的规则,也就是说这两台主机之间应该是畅通无阻的,即便有任何的数据交互,也会因为iptables的默认规则而放行。但是却出现了从被动模式下切换到主动模式时,数据连接的建立失败,我进行抓包之后发现会有很奇怪的现象产生:
1、服务器没有开防火墙,客户机开了防火墙
首先是客户端向服务器发出命令请求,然后看灰色那一行,服务器向客户端主动地建立数据通道,客户端通过一个ICMP报文告诉服务器你请求的端口不可达。这就很奇怪了,当我将客户端的防火墙关闭之后,整个交互又正常了起来,难道说客户端从被动切换到主动的时候没有开启对应的端口吗?但是这个理由能够说服谁呢?因为是客户端主动的向服务器说我要使用主动模式,并且都将其开放的端口发送给了服务器,然后当服务器去和客户端发送给的端口进行数据连接的时候,客户端又告诉服务器它的端口不能用,这明显就是此地无银三百两。而且此时的iptables并没有对任何的端口进行限制,所以这个明显就又问题啊。
当我换了一台主机之后,同样的情况我将firewalld关闭,然后安装了iptables并使用默认规则开启。此时服务器的防火墙全部都是关闭的,这时这台主机却又可以正常地切换主动和被动模式。我也真的是无语了。
2、服务器开了防火墙,客户端没有开防火墙(或者说客户端即便开了防火墙也没有影响)
同样的,服务器的iptables的默认规则是放行,而且没有做关于ftp流量的限制,此时使用任意一台linux虚拟机并使用ftp工具进行被动到主动模式的切换的时候,会发现会有一段时间的加载,然后到最后告诉你连接建立失败,然后我又抓包了,情况现在是这样的:
当客户端告诉服务器
他要使用主动模式并告诉服务器它的端口是多少之后,服务器就用20号端口主动地向客户端告诉他的端口 进行数据通道的连接,客户端收到这个请求之后做出了回应,也就是三次握手的第二个包,上图中第二个灰色行,但是后面却出现无穷无尽的TCP重传包,可以看到无论是客户端还是服务器都进行了重传,这就说明虽然客户端做出了回应,但是服务器把这个回应忽视了,或者说抛弃掉了,于是客户端和服务器端都进行了重传,然后就没有然后了。
也就是说原因是处在服务器端,但是服务器端上的iptables默认是放行的,且没有针对FTP做任何的流量限制。当我将iptables关闭之后,又可以正常切换了,我真的是无语。
而我查了大多数人的针对iptables规则的设定,无非是放行20,21端口同时允许新连接,相关连接以及已建立连接的数据包通行。
但是这些规则的设定对于一个默认是放行的防火墙又有什么样的作用呢,除非iptables被设定成默认是拒绝的。
而且不要和我说iptables防火墙可能默认就是拒绝的,那如果是这样那么为什么ssh服务还可以正常地连接上呢?
我只能说是无语了,浪费我一天的时间。
更多推荐
所有评论(0)