Sichern Sie TCP-Verbindungen ohne TCP-Dump

17

Auf einer Centos-Box möchte ich TCP-Verbindungen sichern - ich möchte sehen, ob ein Server versucht, Anforderungen an eine bestimmte IP zu senden. Normalerweise würde tcpdump den Trick machen - aber tcpdump ist nicht installiert und die Installation von Software ist keine Option (aus Gründen der Unternehmensrichtlinie). Ich fürchte, netstat zeigt mir keine einzige Anfrage.

Also habe ich mich gefragt, welche anderen Optionen ich habe. Ich habe root-Zugriff auf den Server.

Isaac
quelle
Haben Sie Root-Zugriff auf dem Server?
user9517 unterstützt GoFundMonica
Ja, ich habe root-Zugriff.
Isaac
11
Sie sollten auch daran arbeiten, die Unternehmensrichtlinien zu korrigieren. Wenn es Sie daran hindert, Ihre Arbeit zu erledigen, ist die Richtlinie verletzt.
Michael Hampton
1
Nun, Änderungskontrolle ist im Grunde genommen eine FDA-Anforderung - also nichts, was ich in diesem Leben ändern werde :)
Isaac

Antworten:

15

Sicher hast du python?

from socket import * 
from struct import unpack 
import sys 

INTERFACE = "eth0"
TARGET = "8.8.8.8" 

if __name__ == "__main__": 
  sock = socket(AF_PACKET, SOCK_DGRAM, 0x0800) 
  sock.bind((INTERFACE, 0x0800)) 
  while True: 
    data = sock.recvfrom(1500, 0)[0] 
    ip = inet_ntop(AF_INET, data[12:16]) 
    if ip == TARGET: 
      print "GOT TARGET" 
      sys.exit(1)

Dies wird beendet, wenn "GOT TARGET" die IP-Adresse angibt, deren Übereinstimmung wiederhergestellt wird. Da TCP während eines Handshakes etwas zurücksenden muss, sollte dies alles von einer bestimmten Zieladresse abfangen. Es ist egal, ob das Protokoll TCP oder UDP ist (noch überprüfe ich).

Vergessen Sie nicht, ZIEL und SCHNITTSTELLE zu ändern.

Matthew Ife
quelle
Wie würden Sie dies ändern, um auch ein TCP-Syn-Paket abzufangen? Wenn das Ziel nicht erreichbar ist, wird eine versuchte, aber fehlgeschlagene Verbindung nicht angezeigt.
Isaac
3
Ist dieses Skript nicht eine neue Software (also nicht im System zu installieren)?
Vi.
@Vi mit dieser Logik können Sie argumentieren, dass jedes Shell-Skript "neue Software" ist. Es hängt davon ab, wie Sie "Software" definieren.
Matthew Ife
1
-1 Sorry, das ist eine schreckliche Lösung. Es tötet nicht nur ein Huhn mit einem Maschinengewehr (Schreiben eines Programms, für das es bereits eine Lösung gibt), sondern es ist auch eine Endlosschleife, die unnötig CPU-Ressourcen verbraucht (Sie müssen den Python-Prozess einschränken ... sondern Sie müssen bereit sein Mit der Control-C-Taste!) wird die Frage des Benutzers nicht richtig gelöst: Es wird auf eingehende und ausgehende TCP-Verbindungen mit "GOT TARGET" geantwortet (Benutzer hat nach "Versuche, Anforderungen zu senden ..." gefragt). Schließlich wird es bei Erfolg mit 1 beendet (was ein Fehlschlagen der Shell anzeigt).
Mike S
1
sehr cool, aber dafür brauchst du noch erhöhte Berechtigungen. Ich bekamsocket.error: (1, 'Operation not permitted')
Grant Bowman
17

Ich würde wirklich versuchen, tcpdump zu bekommen. Einige Alternativen, um festzustellen, ob für eine IP eine bestimmte Verbindung besteht, sind:

strace:

[kbrandt@ny-kbrandt01: ~] strace -e trace=network nc 1.2.3.4 1234
...
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(1234), sin_addr=inet_addr("1.2.3.4")}, 16) = -1 EINPROGRESS (Operation now in progress)

lsof:

[kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 &
[1] 11434
[kbrandt@ny-kbrandt01: ~] lsof -p 11434
....
nc      11434 kbrandt    3u  IPv4 4543149      0t0     TCP 10.7.0.78:58886->1.2.3.4:search-agent (SYN_SENT)

netstat:

[kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 &
[1] 11486
[kbrandt@ny-kbrandt01: ~] sudo netstat -a -p | grep 11486
tcp        0      1 10.7.0.78:58891             1.2.3.4:search-agent        SYN_SENT    11486/nc
Kyle Brandt
quelle
1
Das war die Art von Antwort, auf die ich gehofft hatte. Leider Strace ist auch nicht installiert: /
Isaac
Ich werde es versuchen
Isaac
1
Ich denke, das Original-Poster mochte die Antwort, aber seltsamerweise beantwortet es seine Frage nicht wirklich ("... TCP-Verbindungen - Ich möchte sehen, ob ein Server versucht, Anfragen an eine bestimmte IP zu senden ...). Diese werden Geben Sie Netzwerkverbindungsinformationen für einen bestimmten Prozess an ... Vielleicht möchte er das. Für diejenigen wie mich, die hier nach Informationen über TCP-Verbindungen von einem Computer zum nächsten suchen, reicht dies möglicherweise nicht aus verschiedene Beispiele für Shell-Befehle, mit denen Sie Informationen über Ihre Netzwerkverbindungen sammeln können
Mike S
15

Iptables verfügt über eine Debug-Funktion, die auch für die Verkehrsanalyse verwendet werden kann.

Die Lösung ist unter der folgenden URL beschrieben.

Debugregeln in Iptables

Lesen Sie auch die folgende URL, um die Protokollierung der Trace-Ausgabe in einer Datei Ihrer Wahl einzurichten.

http://backreference.org/2010/06/11/iptables-debugging/

Ich würde diese Lösung nicht als gleichbedeutend mit tcpdump betrachten, aber sie kann mit einer minimalen Installation von Centos durchgeführt werden. Sie müssen vorsichtig sein, um die Festplatte nicht mit den Protokollen zu füllen, da tcpdump bei der Festplattennutzung viel effizienter ist. Deaktivieren Sie die Protokollierung, wenn sie nicht benötigt wird.

Sie können Folgendes als grundlegende Vorlage in Ihrem Skript verwenden.

# Logging
log(){
SOURCE=a.b.c.d (IP address)
$IPT -A INPUT   -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "In: "
$IPT -A OUTPUT  -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Out: "
$IPT -A FORWARD -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Fw: "
$IPT -t nat -A POSTROUTING -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Nat: "
}
#log  (remove comment to enable)

trace(){
iptables -t raw -A PREROUTING -p tcp  -j TRACE
iptables -t raw -A OUTPUT     -p tcp  -j TRACE
}
#trace (remove comment to enable)
John Auld
quelle
8

Wenn Sie eine bestimmte Software für Ihre Arbeit benötigen und dies nicht dürfen, machen Sie entweder keinen guten Business Case oder verkaufen Ihre Ideen an die richtigen Leute ... oder Sie haben keine Kontrolle über dieses System. .

Wenn ich beauftragt wäre, etwas zu tun, und die Art von Debugging- / Fehlerbehebungsinformationen benötige, die Sie in diesem Fall benötigen, würde ich das richtige Tool verwenden. Das ist wahrscheinlich tcpdumpoder tshark. Ja, das sind Software-Teile, aber ich würde sie für wesentlich wichtigere Dienstprogramme halten . Tatsächlich handelt es sich um Dienstprogramme, die vorübergehend auf dem System installiert oder geladen und ohne Zwischenfälle entfernt werden können (ist ein Wechselmedium eine Option? ... Hinweis ).

Der Punkt ist jedoch, dass eine ruckelige Umgehung der Unternehmensrichtlinien wahrscheinlich mehr Aufwand erfordert, als die Genehmigung für diesen Anwendungsfall zu erhalten.

ewwhite
quelle
Ich bin völlig einverstanden, das richtige Werkzeug für den richtigen Job zu verwenden. Tatsächlich kann ich Software installieren, aber wir müssen die Änderungskontrolle verwenden, daher dauert der Vorgang einige Tage - ich brauchte den Dump jetzt, daher war die Installation keine Option. Ich habe mich nur gefragt, ob ich einige Optionen übersehen habe, über die ich noch nicht nachgedacht habe.
Isaac
:( über Change-Management. Gibt es eine Möglichkeit, ein politisches Spiel zu spielen und die Leute / Parteien, die von dem Dump profitieren würden, dazu zu bringen, den Change-Management-Prozess zu beschleunigen?
ewwhite
1
Ich fürchte nicht - aber da es der Kunde ist, der Änderungsmanagement und auch tcpdump benötigt, muss er die Fakten akzeptieren. Ich hatte gehofft, ich könnte ihn trotzdem glücklich machen.
Isaac
3
@ewwhite: Bei einer guten Änderungsverwaltungsrichtlinie sollte es möglich sein, bestimmte Änderungen oder Änderungsklassen vom vollständigen Prozess auszuschließen. Wenn dies nicht der Fall ist ...
Scott Pack
2
Können Sie keine statisch verknüpften tcpdumpDateien kompilieren und sie einfach nach / tmp kopieren und von dort ausführen?
Che
5

Kyle bot einige großartige Optionen an. Eine weitere wäre zu verwenden iptables:

[james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32
...
[james@server ~]$ sudo iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 105 packets, 35602 bytes)
 pkts bytes target  prot opt in  out  source      destination
   87 33484 LOG     all  --  *   *    0.0.0.0/0   1.2.3.4     LOG flags 0 level 4

Dies ist im Wesentlichen eine Rechnungslegungsvorschrift. Der Datenverkehr wird nicht explizit zugelassen oder abgelehnt, daher wird die Standardrichtlinie für die OUTPUT-Kette verwendet (standardmäßig ACCEPT). Jedes übereinstimmende Paket erhöht jedoch die Zähler für die Regel.

Optional können Sie Details log über das Paket als auch mit der -j LOGOption:

[james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32 -j LOG
...
[james@server ~]@ dmesg | grep 1.2.3.4 | tail -1
IN= OUT=eth0 SRC=192.168.1.1 DST=1.2.3.4 LEN=100 TOS=0x10 PREC=0x00 TTL=64 ...

Die Protokolle werden an die Kernel-Protokollierungsfunktion gesendet. Sie sollten daher in / var / log / messages unter Red Hat-Derivaten und /var/log/kern.log unter Debian-Derivaten angezeigt werden. Es wäre auch in der Ausgabe von sichtbar dmesg, wie gezeigt. Im Gegensatz dazu tcpdumpwird jedoch nicht der vollständige Inhalt des Pakets protokolliert, sondern nur der Inhalt des Paketheaders.

James Sneeringer
quelle
Ich habe selbst an iptables gedacht, aber auch nicht installiert: /. Wie auch immer, schöne Lösung.
Isaac
3

Da Ihr Server eine Verbindung zu einer bestimmten IP herstellt, wird es sich vermutlich um einen Port handeln, über den Sie ebenfalls Bescheid wissen.

In jedem Fall netstatoder sssind entworfen, um zu tun, was Sie wollen. Sie können dasselbe mit beiden Befehlen tun:

netstat -n -t | awk '{print $5}' | grep A.B.C.D:n
ss      -n -t | awk '{print $5}' | grep A.B.C.D:n

Dabei A.B.C.Dsteht "Wobei" für eine IPv4-Adresse und " n Wobei" für eine Portnummer, mit der Ihr Server auf der Remote-Seite eine Verbindung herstellt. Beispielsweise:

ss      -n -t | awk '{print $5}' | grep 10.137.54.22:3389

Oder, wenn Sie nur wissen möchten, dass die Verbindung hergestellt wurde:

ss      -n -t | awk '{print $5}' | grep -q 10.137.54.22:3389 && echo "CONNECTION MADE"

Wenn Sie die Portnummer, zu der Sie eine Verbindung herstellen möchten, nicht kennen, ist der Job schwieriger, da TCP auf beiden Seiten der Konversation einen Port für die Daten- und ACK-Pakete öffnet. In diesem Fall können Sie einfach nach der IP-Adresse suchen, um anzuzeigen, dass eine Verbindung hergestellt wurde, unabhängig davon, ob eine Verbindung besteht oder nicht.

Schließlich können Sie dies nach Herzenslust als Überwachungswerkzeug verwenden:

while true; do
    ss -n -t | awk '{print $5}' | grep -q A.B.C.D:n && \
        echo "CONNECTION MADE" && \
        exit 0
    sleep 1
done
Mike S
quelle
Hervorragende Möglichkeit zum Überwachen, ohne erhöhte Kernel-Berechtigungen zu benötigen.
Grant Bowman