【发布时间】:2014-04-27 11:42:11
【问题描述】:
我的测试环境
客户
- IP 192.168.0.2/24
- 网关 192.168.0.1
服务器
- IP 192.168.0.1/24
- http 服务在 80 端口运行
当我尝试将网页托管在服务器上时,一切正常。
然后我在服务器上使用 netfilter 编写一个内核模块,如果源 dest IP 是 192.168.1.1,它将更改 dest IP 为 192.168.0.1,如果源源 IP 是 192.168.0.1,则将源 IP 更改为 192.168.1.1 .我想你可以理解,我只是为客户端假装服务器是192.168.1.1。(IP头校验和和TCP校验和正确更改)
我在客户端使用浏览器(chrome, firefox...)访问192.168.1.1并在客户端抓包,结果如下:
192.168.0.2:someport_1 -> 192.168.1.1:80 [SYN]
192.168.1.1:80 -> 192.168.0.2:someport_1 [SYN, ACK]
192.168.0.2:someport_2 -> 192.168.1.1:80 [SYN]
192.168.1.1:80 -> 192.168.0.2:someport_2 [SYN, ACK]
192.168.0.2:someport_3 -> 192.168.1.1:80 [SYN]
192.168.1.1:80 -> 192.168.0.2:someport_3 [SYN, ACK]
我不知道为什么客户端永远不会发送TCP握手的最后一个ACK,有什么想法吗?
编辑1:
现在我认为浏览器没有从服务器获取 [SYN, ACK] 数据包,虽然 Wireshark 可以看到它,所以可能是因为操作系统(Windows7)从服务器丢弃了 [SYN, ACK] 数据包.现在问题变成了为什么windows会丢弃一个正确的[SYN,ACK]数据包?
【问题讨论】: