如何弄清楚为什么我的 NAT-box 发送 TCP RST 数据包?

如何弄清楚为什么我的 NAT-box 发送 TCP RST 数据包?

总结:我看到一台 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.1iface 为内部 iface,而10.0.0.4iface 为外部 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):

  1. 客户端发送 SYN 数据包
  2. NAT 盒接收该数据包,并重新发送到外部服务器
  3. 服务器以 SYN、ACK 进行响应 - 握手的第二步。
  4. 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 的两个端点,则该连接应在一两分钟内重置。

相关内容