我遇到的情况是,客户端通过telnet
(或netcat
) 建立 TCP 连接以连接到 Linux 服务器。然后,服务器必须发回包含一些文本信息的横幅...
在每个主机上,我启动了 Tcpdump 来捕获流量。
首先,两台机器进行传统的TCP握手,然后服务器向客户端发送一个包含banner的PUSH包,并从客户端收到一个ACK。
奇怪的是,客户端从未收到横幅(telnet
/中没有显示nc
任何内容),客户端启动的 tcpdump 没有捕获来自服务器的任何 PUSH 数据包,也没有捕获到指向服务器的 ACK。而服务器端的 tcpdump 捕获了所有数据包。
我这样做了几次,但每次都没有任何变化,似乎不是 tcpdump 的问题。
我想知道这是否是由防火墙引起的,因为两台机器之间有一个防火墙(但是服务器如何接收 ACK!?)
除此之外,客户端收到 PUSH 数据包时,有可能不是将其发送到 OSI 第 7 层 ( telnet
),而是出于某种原因在第 4 层 (TCP) 停止它并发回 ACK?这是否与客户端的一些应用程序过滤有关?
注意:两台机器都使用 Linux From Scratch 和不要使用 iptables。我不知道他们使用哪种 TCP 实现。
编辑:
以下是通信的架构:
服务器视图:
Server........................................................................client
<-----------------------------------SYN (Ip ID=3333)---------------------------
----------------------------------SYN-ACK (IP ID=4444)--------------------------->
<---------------------------------ACK (Ip ID=2222)-------------------------------
-----------------------------PUSH (data) (100 bytes, IP ID=4445)------------------->
<----------------------------ACK (Ip ID=2223, ack-num=101)------------------------
客户端视图:
Server........................................................................client
<---------------------------------SYN (Ip ID=3333)-----------------------------
---------------------------------SYN-ACK (IP ID=4444)--------------------------->
<--------------------------------ACK (Ip ID=3334)-----------------------------
在所有数据包中,除 IP 数据包标识符、Ack 号和序列号外,所有内容都匹配。
答案1
问题不在于第 7 层,而在于网络层。
假设您的tcpdump
客户端工作正常,客户端不会从服务器接收数据,因此毫无疑问它是否可以传递数据。
你已经知道中间有防火墙,可以尝试不带防火墙。有防火墙可以做很多事情。如果客户端没有收到数据包,因此没有发送 ACK,但服务器收到了 ACK,那么它一定来自防火墙。