总结:我看到一台 ubuntu 主机(我对其有绝对控制权)在特定情况下发送了一个数据包。如何找到负责该数据包的应用程序/内核模块?
我正在开发一个自主研发的 NAT-box,并且已经到了这一步:
网络拓扑:[192.168.1.100] -- [192.168.1.1:10.0.0.4] -- [10.0.0.1]
- [10.0.0.1] 运行默认的 Apache2 Web 服务器。
- [192.168.1.1 : 10.0.0.4] 是自定义 NAT 盒,其中
192.168.1.1
iface 为内部 iface,而10.0.0.4
iface 为外部 iface。 - [192.168.1.100]-是客户端,正在运行
wget -O - 10.0.0.1
当我从服务器请求页面时,我在两个 NAT 接口上看到的流量如下:
No. Time Source Destination Protocol Length Info
1 0.000000000 ae:29:9f:0e:3a:0d da:32:d6:6c:18:e6 ARP 42 Who has 10.0.0.1? Tell 10.0.0.4
2 0.002477000 da:32:d6:6c:18:e6 ae:29:9f:0e:3a:0d ARP 42 10.0.0.1 is at da:32:d6:6c:18:e6
3 0.752175000 192.168.1.100 10.0.0.1 TCP 74 52054 > http [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=1584 TSecr=0 WS=512
4 0.762395000 10.0.0.4 10.0.0.1 TCP 74 48394 > http [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=1584 TSecr=0 WS=512
5 0.763218000 10.0.0.1 10.0.0.4 TCP 74 http > 48394 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=1587 TSecr=1584 WS=512
6 0.763230000 10.0.0.4 10.0.0.1 TCP 54 48394 > http [RST] Seq=1 Win=0 Len=0
11 0.770654000 10.0.0.1 192.168.1.100 TCP 74 http > 52054 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=1587 TSecr=1584 WS=512
12 0.771153000 192.168.1.100 10.0.0.1 TCP 66 52054 > http [ACK] Seq=1 Ack=1 Win=29696 Len=0 TSval=1589 TSecr=1587
13 0.771350000 192.168.1.100 10.0.0.1 HTTP 172 GET / HTTP/1.1
7 0.781889000 10.0.0.4 10.0.0.1 TCP 66 48394 > http [ACK] Seq=1 Ack=1 Win=29696 Len=0 TSval=1589 TSecr=1587
8 0.782015000 10.0.0.1 10.0.0.4 TCP 54 http > 48394 [RST] Seq=1 Win=0 Len=0
9 0.782163000 10.0.0.4 10.0.0.1 HTTP 172 GET / HTTP/1.1
10 0.782173000 10.0.0.1 10.0.0.4 TCP 54 http > 48394 [RST] Seq=1 Win=0 Len=0
14 0.791486000 10.0.0.1 192.168.1.100 TCP 54 http > 52054 [RST] Seq=1 Win=0 Len=0
15 0.792103000 10.0.0.1 192.168.1.100 TCP 54 http > 52054 [RST] Seq=1 Win=0 Len=0
换句话说,发生的事情是(忽略ARP):
- 客户端发送 SYN 数据包
- NAT 盒接收该数据包,并重新发送到外部服务器
- 服务器以 SYN、ACK 进行响应 - 握手的第二步。
- NAT 盒收到 SYN、ACK 并执行两件事:
- 它向客户端发送 SYN、ACK(很好)
- 它向服务器发送一个 RST 数据包(断开连接)
我认为运行 NAT 的应用程序无法发送 RST 数据包。我怀疑它来自 NetFilter,但我不知道如何确认。
我怎样才能知道这个数据包(#6)来自哪里?
PS 我在 ubuntu 14.04 下的 mininet 2.2.1 中运行这个
答案1
您能否验证发送原始 SYN 数据包的源/客户端实际上不是在 NAT 后面共享相同 IP 地址的两个端点???您必须先验证这一点,然后我们才能继续为您解决此问题。请验证并回复我们。一种测试方法是从 NAT 盒通过 SSH 连接到客户端盒,如果“客户端(上述场景中的原始 SYN 发送者)”实际上是具有相同 IP 的两个端点,则该连接应在一两分钟内重置。