Назад | Перейти на главную страницу

Как понять, почему мой NAT-ящик отправляет пакеты TCP RST?

TL; DR: Я вижу, что хост Ubuntu (который я полностью контролирую) отправляет пакет при определенных обстоятельствах. Как найти модуль приложения / ядра, ответственный за этот пакет?

Разрабатываю самодельный NAT-бокс, и дошел до этого:

Топология сети: [192.168.1.100] - [192.168.1.1: 10.0.0.4] - [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)?

P.S. Я запускаю это в mininet 2.2.1 под Ubuntu 14.04

Можете ли вы проверить, что источник / клиент, отправляющий исходный пакет SYN, НЕ является двумя конечными точками с одним и тем же IP-адресом, совместно используемыми за NAT ??? Вы должны сначала проверить это, прежде чем мы сможем решить эту проблему за вас. Пожалуйста, подтвердите и свяжитесь с нами. Один из способов тестирования - использовать SSH из окна NAT в окно клиента, и это соединение должно быть сброшено в течение минуты или двух, если «клиент (исходный отправитель SYN в вашем сценарии выше)» на самом деле является двумя конечными точками с одним и тем же IP-адресом.