试验验证ftp的主动与被动连接的具体过程

发布于 2022-10-03 00:47:05 字数 14619 浏览 25 评论 0

大部分人都知道ftp server的连接有主动和被动之分,但是具体主动和被动连接的具体过程,知道的人

恐怕就不多了,下面的试验,可以验证不同的连接方式是怎样的一个过程。

试验机是两台linux,一台做ftp client,IP为192.168.1.246,一台做ftp server,IP为192.168.1.253

,两边都要配上防火墙,只有配上防火墙我们才能控制连接的每一个步骤,才能分别在server端和clie

nt端看到每个包的具体状态。

iptable配置如下:
# iptables-save

# Generated by iptables-save v1.2.11 on Tue Mar 29 11:23:04 2005
*filter
:INPUT DROP [172087]
:FORWARD DROP [0]
:OUTPUT ACCEPT [45]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -d 127.0.0.1 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.1.254 -p udp -m udp --sport 53 --dport 1025:65535 -j ACCEPT
COMMIT
# Completed on Tue Mar 29 11:23:04 2005

试验1:passive方式
通过ssh连到client端(192.168.1.246),该窗口我们称之为窗口1

# ftp 192.168.1.253
Connected to 192.168.1.253.
220 Welcome to VST media (china) FTP service.
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.1.253:root): yang
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>;

此时,分别在client端和server端用netstat -an | grep tcp命令查看如下:
client端
# netstat -an | grep tcp

tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      
tcp        0      0 192.168.1.246:22        192.168.1.225:3218      ESTABLISHED
tcp        0      0 192.168.1.246:32812     192.168.1.253:21        ESTABLISHED
tcp        0    272 192.168.1.246:22        192.168.1.225:3963      ESTABLISHED

server端
# netstat -an | grep tcp

tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      
tcp        0      0 192.168.1.253:21            192.168.1.246:32812         ESTABLISHED
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0    128 ::ffff:192.168.1.253:22     ::ffff:192.168.1.225:4330   ESTABLISHED

说明,此时client端32812端口和server端的21端口建立连接,

在窗口1,继续向下执行

ftp>; ls
227 Entering Passive Mode (192,168,1,253,40,164)

会发现窗口1死在此处,无法建立连接。此时我们再查看两台机器的连接情况

client端

# netstat -an | grep tcp
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      
tcp        0      0 192.168.1.246:22        192.168.1.225:3218      ESTABLISHED
tcp        0      0 192.168.1.246:32812     192.168.1.253:21        ESTABLISHED
tcp        0    272 192.168.1.246:22        192.168.1.225:3963      ESTABLISHED
tcp        0      1 192.168.1.246:32813     192.168.1.253:10404     SYN_SENT   

server端

# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 192.168.1.253:10404         0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      
tcp        0      0 192.168.1.253:21            192.168.1.246:32812         ESTABLISHED
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0    224 ::ffff:192.168.1.253:22     ::ffff:192.168.1.225:4330   ESTABLISHED

此时我们会发现,在server端呢,我们会发现它开了一个10404端口监听,在client端则开了了一个32813端口(32812+1)端口向server的10404端口发了一个syn包,准备建立握手。
由于syn包不属于RELATED和ESTABLISHED,所以该包被server端丢弃,并不返回信息,所以导致client

一直等待直到超时。
这也是我们建立防火墙的目的,否则,一旦建立连接我们就看不到这种状态了。

因此,得出结论1,在用passive方式连接时,client端开一个大于1024的端口号x连接server的21端口

,然后,server开一个大于1024的端口y监听,等待client连接y端口以传送数据,client这时会再开一

个x+1(不一定是+1,如果再次连接就是+2,依次类推)端口并向server的y端口发送一个syn-sent数据

包,然后等待建立连接。

试验2,用port方式连接
通过ssh连到client端(192.168.1.246),该窗口我们称之为窗口1

# ftp 192.168.1.253
Connected to 192.168.1.253.
220 Welcome to VST media (china) FTP service.
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.1.253:root): yang
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>; passive
Passive mode off.
ftp>;

此时,分别在client端和server端用netstat -an | grep tcp命令查看如下:
client端

# netstat -an | grep tcp
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      
tcp        0      0 192.168.1.246:22        192.168.1.225:3218      ESTABLISHED
tcp        0      0 192.168.1.246:32817     192.168.1.253:21        ESTABLISHED
tcp        0     48 192.168.1.246:22        192.168.1.225:3963      ESTABLISHED

server端

# netstat -an | grep tcp
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      
tcp        0      0 192.168.1.253:21            192.168.1.246:32817         ESTABLISHED
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0     48 ::ffff:192.168.1.253:22     ::ffff:192.168.1.225:4330   ESTABLISHED

此时和试验1的情况是一样的,紧紧是client端和server端的21端口建立连接

在窗口1继续向下执行

ftp>; ls
200 PORT command successful. Consider using PASV.

同样会发现窗口1,死在这里,此时查看client端和server端的连接情况,如下:

client端

# netstat -an | grep tcp
tcp        0      0 192.168.1.246:32818     0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      
tcp        0      0 192.168.1.246:22        192.168.1.225:3218      ESTABLISHED
tcp        0      0 192.168.1.246:32817     192.168.1.253:21        ESTABLISHED
tcp        0     48 192.168.1.246:22        192.168.1.225:3963      ESTABLISHED

server端

# netstat -an | grep tcp
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      
tcp        0      1 192.168.1.253:20            192.168.1.246:32818         SYN_SENT   
tcp        0      0 192.168.1.253:21            192.168.1.246:32817         ESTABLISHED
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0     48 ::ffff:192.168.1.253:22     ::ffff:192.168.1.225:4330   ESTABLISHED

此时,我们会发现,在client端会起一个端口32818端口(32817+1)监听,server端会从20端口向client

端的32818端口发送一个syn包,准备建立握手。
同样因为该包是一个syn包,而不是一个RELATED和ESTABLISHED包,所以被client的防火墙丢弃,并且

不返回信息,使得等待状态能够被我们看到。

由此,我们可以得出结论2,在用port方式连接时,client端开一个大于1024的端口号x连接server的21

端口,同时client端会起一个x+1(不一定是+1,如果再次连接就是+2,依次类推)端口监听,等待ser

ver端的连接。然后,server端会使用20端口向client端的x+1端口发送一个syn-sent的数据包,然后等

待建立连接。

这两个结论就是passive方式和port方式的建立连接的过程。同时可以引出如下认识上的误区:

误区1:具体使用被动方式连接还是主动方式连接只与服务端有没有防火墙有关系,正确的结论应该是c

lient还是server,只要有防火墙,都可能有关系。

误区2:iptable防火墙是支持RELATED的状态的防火墙,所以,使用iptables做防火墙时,可以支持pas

sive模式,正确的结论应该是,由于传输数据建立连接的第一个数据包是syn的,不是RELATED的,所以

不能够建立连接,所以仍然不能支持passive模式。

总结:两个误区,两个结论

结论1,在用passive方式连接时,client端开一个大于1024的端口号x连接server的21端口,然后,server开一个大于1024的端口y监听,等待client连接y端口以传送数据,client这时会再开一个x+1(不一定是+1,如果再次连接就是+2,依次类推)端口并向server的y端口发送一个syn-sent数据包,然后等
待建立连接。

结论2,在用port方式连接时,client端开一个大于1024的端口号x连接server的21端口,同时client端会起一个x+1(不一定是+1,如果再次连接就是+2,依次类推)端口监听,等待server端的连接。然后,server端会使用20端口向client端的x+1端口发送一个syn-sent的数据包,然后等待建立连接。

误区1:具体使用被动方式连接还是主动方式连接只与服务端有没有防火墙有关系,正确的结论应该是client还是server,只要有防火墙,都可能有关系。

误区2:iptable防火墙是支持RELATED的状态的防火墙,所以,使用iptables做防火墙时,可以支持passive模式,正确的结论应该是,由于传输数据建立连接的第一个数据包是syn的,不是RELATED的,所以不能够建立连接,所以仍然不能支持passive模式。

作者:yanghz  2005-02-29

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

め可乐爱微笑 2022-10-10 00:47:05

好文!!
支持作者1!

听不够的曲调 2022-10-10 00:47:05

上回在网络版问windows下的ftp支不支持用被动方式,好像没人回复,借个地方问问。不知楼主有何高见。

难得心□动 2022-10-10 00:47:05

应该是都一样,ftp是通用的协议,各平台都支持的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文