Erfassen Sie IP-Pakete, wenn das Gateway nicht der ISP-Router ist

Erfassen Sie IP-Pakete, wenn das Gateway nicht der ISP-Router ist

In meinem Heimnetzwerk habe ich folgende Topologie

          Internet
              |
     wifi     |
C ----------- A ---------- B

Wo

  • A (statische IP 192.168.0.254) ist der Router/AP, den ich von meinem ISP erhalten habe.
  • B (statische IP 192.168.0.1) ist eine Linux-Maschine, die als lokaler DNS- und DHCP-Server arbeitet (auf der dnsmasq läuft).
  • C ist jeder Client, der eine Verbindung zum AP herstellt und per DHCP konfiguriert ist.

Das von B (als DHCP-Server) bereitgestellte Standard-Gateway ist derzeit einfach A.

Nehmen wir dann an, ich möchte in B den gesamten Datenverkehr erfassen, der von einem beliebigen Client C kommt. Folgendes habe ich in B getan:

  1. Aktivieren Sie die IP-Weiterleitung mit

    # sysctl net.ipv4.ip_forward=1"
    
  2. B als Gateway bereitstellen. Natürlich verwendet B selbst A als eigenes Gateway

  3. Führen Sie tcpdump auf B aus, um zu sehen, was los ist

Auf einem Client C starte ich eine beliebige Anfrage, z.B.

$ traceroute www.google.com

Nun gehe ich davon aus, dass der von C ausgehende Datenverkehr zu B, dann zu A und schließlich zum Internet weitergeleitet wird.

Was funktioniert.C kann auf das Internet zugreifen

Was funktioniert nicht.Abgesehen von der ersten Anfrage scheint B vollständig umgangen zu werden: tcpdump zeigt nichts an; die Adresse von B erscheint nicht in der Traceroute-Ausgabe. Trotzdem bin ich sicher, dass eine Umleitung stattfindet, da C vom Internet abgeschnitten ist, wenn ich die IP-Weiterleitung für B deaktiviere.

Wenn es zu einem Kurzschluss kommt, wie kann ich ihn vermeiden?

Haftungsausschluss: Ich weiß, dass eine Änderung der Netzwerktopologie das Problem „Erfassung des gesamten Datenverkehrs“ lösen könnte (z. B. durch Portspiegelung usw.), aber ich möchte wirklich verstehen, was mit meinem Setup los ist und wie ich das beheben kann, ohne die Topologie zu ändern.

Antwort1

Sie müssen Host B NAT-Übersetzungen durchführen lassen, damit A dasselbe Paket nicht noch einmal sieht. Stattdessen sollte B Pakete über A senden, als ob sie von B stammten. Um das zu erreichen, fügen Sie eine iptablesRegel wie folgt hinzu:

# iptables -t nat -A POSTROUTING -s ip-of-C -j MASQUERADE

Nach dieser Regel werden alle von B ausgehenden Pakete so umgeschrieben, dass sie aussehen, als kämen sie von B. Dabei bleibt jedoch eine Tabelle mit Rückübersetzungen erhalten, sodass zugehörige Antworten zurückübersetzt und an C gesendet werden können.

Beachten Sie den -s ...Teil, der die Regel so einschränkt, dass sie nur auf Pakete angewendet wird, die von C stammen (oder es könnte als lokales LAN festgelegt sein), und beispielsweise nicht auf die Antwortpakete.

BEARBEITEN (unter Berücksichtigung des Kommentars von @theuncle): Die Erklärung, warum es ohne NAT nicht funktioniert, wäre, dass Host B erkennt, dass das Paket über dieselbe Schnittstelle unverändert ein- und ausgeht, und er daher die Netzwerkverbindung verbessern kann, indem er C anweist, für den betreffenden Datenverkehr direkt mit A zu kommunizieren.

verwandte Informationen