Blog

So analysieren Sie VPC-Flow-Protokolle und finden verdächtige Ziele über die Befehlszeile

Mark van Holsteijn

Aktualisiert Oktober 15, 2025
7 Minuten

In diesem Blog zeige ich Ihnen, wie Sie die Protokolle der VPC-Flows ganz einfach über die Befehlszeile analysieren und verdächtige Internet-Ziele finden können. Der Prozess läuft in den folgenden 5 Schritten ab.

  1. Ablaufprotokoll in einer Textdatei abrufen
  2. Beschränken Sie das Flussprotokoll auf den NAT-Gateway-Verkehr
  3. Entfernen des Datenverkehrs zu eigenen öffentlichen IP-Adressen
  4. Entfernen des Datenverkehrs zu Datadog
  5. Analysieren Sie die restlichen Flussprotokolle

Aber zunächst einmal: Was finden wir in einem VPC-Flow-Protokoll?

VPC-Ablaufprotokolle

VPC-Flow-Protokolle enthalten Aufzeichnungen über die Netzwerkflüsse innerhalb Ihrer VPC. Ein Protokolleintrag ist ziemlich einfach und enthält zumindest die Quell- und Ziel-IP-Adresse, das Protokoll, die Ports sowie die übertragene Datenmenge. Ein VPC-Flow-Protokolleintrag sieht etwa so aus:

2 123456789012 eni-adf878fe 10.10.1.10 13.233.147.224 38511 443 6 56 60297 1732951951 1732951981 ACCEPT OK 

Es sind nicht viele Informationen enthalten. Es sind einfach nur Daten. In der folgenden Tabelle finden Sie eine Beschreibung der einzelnen Spalten:

FeldWertBeschreibung
Version 2Hier wird die Version des Flow Log-Formats angegeben.
Konto-ID 123456789012Dies ist die AWS-Konto-ID, die mit der VPC verbunden ist.
ENI IDeni-adf878feDies ist die Elastic Network Interface (ENI) ID. Sie identifiziert die spezifische Netzwerkschnittstelle, mit der der Datenverkehr verbunden ist.
Quelle IP 10.10.1.10Dies ist die private IP-Adresse der Quelle des Datenverkehrs (die Instanz oder Ressource innerhalb der VPC).
Ziel-IP 13.233.147.224Dies ist die öffentliche IP-Adresse des Ziels (eine externe IP-Adresse, möglicherweise ein Internetdienst).
Quelle Hafen 38511Dies ist die Portnummer der Quellinstanz, von der der Datenverkehr ausgeht.
Zielhafen443Dies ist die Portnummer des Ziels, auf das der Datenverkehr abzielt. Port 443 wird in der Regel für HTTPS-Datenverkehr verwendet.
Protokoll6Dies steht für das Protokoll, das für den Datenverkehr verwendet wird. In diesem Fall entspricht 6 dem TCP (Transmission Control Protocol).
Pakete 56Hier wird die Anzahl der Pakete angezeigt, die während dieses Flusses übertragen wurden.
Bytes 60297Zeigt die Gesamtzahl der während dieses Vorgangs übertragenen Bytes an.
Startzeit 1732951951Dies ist die Startzeit des Flusses in Unix-Epochenzeit (Sekunden seit dem 1. Januar 1970).
Endzeit 1732951981Dies ist die Endzeit des Flusses in Unix-Epochenzeit.
Aktion ACCEPTDies bedeutet, dass der Datenverkehr über die Netzwerkschnittstelle zugelassen wurde (gemäß den Sicherheitsgruppen und Netzwerk-ACLs).
Status protokollieren OKDies zeigt den Status des Protokolleintrags an. In diesem Fall zeigt es an, dass die Protokollierung erfolgreich war.

Sie können Flussprotokolle für Ihre VPC konfigurieren, um den gesamten Datenverkehr in Ihrem Cloud-Netzwerk zu verfolgen: Ich gehe davon aus, dass Sie dies bereits getan haben.

1. Abrufen von Flow Log-Datensätzen

Um die VPC-Flow-Protokolle abzurufen, habe ich das Dienstprogramm flowlogs_reader verwendet. Es unterstützt sowohl das Lesen aus S3-Buckets als auch aus CloudWatch-Protokollen. In meinem Fall habe ich die Flussprotokolle in CloudWatch, also gebe ich ein:

$ flowlogs_reader --location-type cwl /vpc/flow-log > flow-logs.txt

Um herauszufinden, wie viele Datensätze abgerufen wurden, geben Sie ein:

$ wc -l flow-logs.txt
1512436 flow-logs.txt

In diesem Fall sind es sage und schreibe 1.512.436 Datensätze!

2. Beschränken Sie das Flussprotokoll auf NAT-Gateway-Verkehr

Führen Sie die folgenden Schritte aus, um die Flussprotokolle auf ausgehenden, NAT-Gateway-bezogenen Verkehr zu beschränken:

  1. Rufen Sie die privaten IP-Adressen des NAT-Gateways ab
  2. Filter zum Entfernen von Flussdatensätzen mit anderen Quelladressen
  3. Entfernen Sie Flow Records vom NAT-Gateway in die VPC

2.1. Abrufen von privaten NAT-Gateway-IP-Adressen

Ich interessiere mich nur für den Verkehr, der vom NAT-Gateway ausgeht. Um die privaten IP-Adressen der NAT-Gateways in der VPC zu erhalten, geben Sie ein:

$ nat_gateways=$(aws ec2 describe-nat-gateways 
                  --query 'join(`n`,NatGateways[].NatGatewayAddresses[].PrivateIp)' 
                  --output text)

2.2. Ein AWK-Filter für NAT-Gateway-Verkehr

Mit den öffentlichen IP-Adressen können wir die Datenflussprotokolle nach Verkehr filtern, der von den NAT-Gateways ausgeht, indem wir eingeben:

$ awk_filter=$(sed -e 's/.*/$4 == "&"/g' <<< "$nat_gateways" | 
                paste -s -d '|' - | 
                sed -e 's/|/ || /g' 
                -e 's/^/$4 != "-" && (/' 
                -e 's/$/) {print $0}')

$ awk "$awk_filter" flow-logs.txt > from-nat-gateways.txt

So, jetzt haben wir alle Protokolle, die von den NAT-Gateways stammen.

2.3. Filterung des Rückverkehrs zum Anfragesteller

Wir konzentrieren uns auf den vom NAT-Gateway ausgehenden Datenverkehr in das öffentliche Internet. Um jeglichen Verkehr herauszufiltern, der für die VPC (CIDR 10.0.0.0/8) bestimmt ist, geben Sie ein:

$ awk '$5 !~ /^10..*/{print $0}' from-nat-gateways.txt > from-nat-gateways-out.txt
$ wc -l from-nat-gateways-out.txt
28894 from-nat-gateways-out.txt

Das ist gut: Die Menge der zu analysierenden Datensätze hat sich bereits von 1,5 Millionen auf 29000 reduziert!

3. Entfernen des Datenverkehrs zu unseren eigenen öffentlichen IP-Adressen

Um Flow-Protokolle des Datenverkehrs von unserer VPC zu ihren eigenen öffentlichen IP-Adressen zu entfernen, gehen Sie wie folgt vor:

  1. Rufen Sie die öffentlichen IP-Adressen in der VPC ab
  2. Verwenden Sie einen Awk-Filter, um Flow-Records zu unseren eigenen IPs zu entfernen

3.1. Abrufen der öffentlichen IP-Adressen unserer VPC

Um die öffentlichen IP-Adressen zu finden, die von der VPC angeboten werden, geben Sie ein:

public_ips=$(aws ec2 describe-network-interfaces 
            --query 'join(`n`,NetworkInterfaces[].PrivateIpAddresses[].Association.PublicIp)' 
            --output text)

3.2. Verwenden Sie AWK, um den Datenverkehr zurück zu eigenen IPs zu filtern

Um alle Flow-Protokolle des Datenverkehrs zurück zu den öffentlichen IP-Adressen der VPC zu entfernen, geben Sie ein:

awk_filter=$(sed -e 's/.*/$5 != "&"/g' <<< "$public_ips" | 
                paste -s -d '|' -  | 
                sed -e 's/|/ && /g' 
                -e 's/$/ {print $0}/')
awk "$awk_filter" from-nat-gateways-out.txt > outgoing-public-internet.txt

4. Entfernen von ausgehenden Datadog-Zielen

In unserem Fall ist ein ausgehender Datenverkehr zu Datadog bekannt. Wenn Sie Datadog nicht verwenden, können Sie diesen Schritt überspringen.

Es war nicht einfach, Protokolleinträge für eine Reihe von IP-Adressbereichen zu filtern. Daher habe ich das folgende Python-Skript filter-datadog-ips erstellt. Mit dem folgenden Befehl werden alle Datenströme zu Datadog entfernt:

filter-datadog-ips < outgoing-public-internet.txt > outgoing-public-internet-without-datadog.txt

5. Analyse des verbleibenden Verkehrs

Nach dem Filtern können Sie analysieren, was übrig bleibt:

  • Die Anzahl der eindeutigen Ziel-IP-Adressen
  • Die Anzahl der eindeutigen Ziel-IP-Ports
  • Der DNS-Name der IP-Adressen
  • Der Zertifikatsname der IP-Adresse
  • Identifizieren von Zielen

5.1. Identifizierung von Ziel-IP-Adressen

Um die Anzahl der eindeutigen Ziel-IP-Adressen zu ermitteln, geben Sie ein:

$ awk '{print $5, $7}' outgoing-public-internet-without-datadog.txt | sort -u > unique-ip-and-port.txt
$ wc -l unique-ip-and-port.txt
26 unique-ip-and-port.txt

Wie cool ist das denn! Ich habe nur noch 26 IP-Adressen zu analysieren. Eine große Verbesserung gegenüber 1,6 Millionen!

5.2. Identifizierung der verwendeten Ports

Um zu sehen, auf welche Ports zugegriffen wird, geben Sie ein:

$ awk '{print $2}' unique-ip-and-port.txt | sort | uniq -c | sort -r -n
  19 443
   3 80
   2 465
   1 30120
   1 2593

Offensichtlich einige HTTP-, HTTP-, SMTP- und zwei vage Zielports.

5.3. DNS Reverse-Lookup der IP-Adressen

Um eine Vorstellung vom Zielort zu bekommen, führen Sie einen DNS-Reverse-Lookup der IP-Adressen durch, indem Sie eingeben:

cat unique-ip-and-port.txt | while read ip port ; do
    domain_name=$(dig +short -x $ip)
    echo "$ip,$port,${domain_name:--}"
done > dns-lookups.csv

Dieses Skript führt für jede IP-Adresse einen Reverse-Lookup durch. Wenn die Suche erfolglos ist, wird stattdessen ein Bindestrich verwendet.

5.4. Abrufen der Zertifikatsnamen der IP-Adressen

Für den IP-Verkehr zu den Ports 80 oder 443 ist es möglicherweise möglich, die Namen auf den SSL-Zertifikaten zu lesen. Um das herauszufinden, geben Sie ein:

cat unique-ip-and-port.txt |while read ip port;   do
        if [[ $port -eq 80 ]] || [[ $port -eq 443 ]]; then
                alt_subject_name=$(timeout 3 openssl s_client -connect $ip:443 < /dev/null 2>&/dev/null | 
                 openssl x509 -noout -text 2>/dev/null | 
                 grep DNS: | 
                 tr 'n' ' ' | 
                 sed -e 's/[    ]*DNS://g' -e 's/,/ /g' | tr -d 'n'
                 )
                 [[ -z $alt_subject_name ]] && alt_subject_name="-"
        else
                alt_subject_name="-"
        fi      
        echo "$ip,$port,$alt_subject_name"
done > certificate-lookups.csv

Dieses Skript versucht, das SSL-Zertifikat von der IP-Adresse an Port 443 abzurufen. Wenn es gefunden wird, extrahiert es die DNS-Namen des Zertifikats. Dies ist möglicherweise nicht ganz korrekt. Da die SSL-Verbindung ohne einen Hostnamen aufgebaut wird, kann es sein, dass der Server das Standardzertifikat auf diesem Host präsentiert. Wenn Sie zum Beispiel eine Verbindung zu einer IP-Adresse xebia.com herstellen, wird ein Zertifikat von kinsta.cloud angezeigt.

5.5. Identifizieren von Reisezielen

Nachdem Sie den DNS und den Zertifikatsnamen erfasst haben, führen Sie die beiden Datensätze zusammen, indem Sie eingeben:

paste -d, dns-lookups.csv certificate-lookups.csv > domain-and-certificate-names.csv

In der resultierenden Datei finden Sie alle öffentlichen IP-Verkehrsziele, die mit DNS- und Zertifikatsnamen vermerkt sind.

Fazit

Mit dieser Reihe von Unix-Befehlen können Sie schnell herausfinden, mit welchen öffentlichen IP-Adressen sich unsere Anwendungen verbinden. Der Reverse-DNS-Lookup und das Abrufen von Zertifikaten für HTTP/HTTPS-Hosts helfen bei der Identifizierung der Ziele und bei der Erstellung einer Liste der zulässigen Egress-Autorisierungen. Beachten Sie, dass dies keine generische Lösung ist. Jede Situation ist anders, und Sie müssen möglicherweise zusätzliche Schritte einleiten.


Bild von Alex S.von Pixabay

Verfasst von

Mark van Holsteijn

Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.

Contact

Let’s discuss how we can support your journey.