it-swarm-tr.com

Tek bir işlemin ağ trafiğini nasıl yakalayabilirim?

Ağ trafiğinin tek bir işlem tarafından ele alındığını incelemek istiyorum, ancak bu kadar yoğun bir sistemle (aynı anda gerçekleşen çok fazla trafik var) ilgilendiğim için basit ağ yakalamaları işe yaramayacak. Belirli bir işlemin ağ trafiğini tcpdump veya wireshark yakalamayı izole etmenin bir yolu var mı? (netstat kullanmak yetersiz.)

88
Kees Cook

Gerçekten de Wireshark filtrelerini kullanarak bir yol var. Ancak, doğrudan işlem adına veya PID'ye göre filtre uygulayamazsınız (çünkü bunlar ağ büyüklüğü değildir).

İlk önce işleminiz tarafından kullanılan protokolleri ve portları bulmanız gerekir (önceki yorumdaki netstat komutu iyi sonuç verir).

Ardından, gelen (veya giden) bağlantı noktasını yalnızca aldığınız bağlantı noktasıyla filtrelemek için Wireshark kullanın. Bu, işleminizin gelen ve giden trafiğini izole etmelidir.

20
OpenNingia

Yeni bir işlemi başlatmak ve izlemek için:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

Bilinen bir PID ile mevcut bir işlemi izlemek için:

strace -p $PID -f -e trace=network -s 10000
  • -f "yeni süreçleri takip et" içindir
  • -e bir filtre tanımlar
  • -s, dizgelerin sınırını 32'den büyük olarak ayarlar.
  • -p, eklenecek işlem kimliğini alır
127
Clausi

Bu iş parçacığının biraz eski olduğunu biliyorum ama bunun bazılarınıza yardımcı olabileceğini düşünüyorum:

Çekirdeğiniz izin veriyorsa, tek bir işlemin ağ trafiğini yakalamak, bahsedilen işlemi yalıtılmış bir ağ ad alanında çalıştırmak ve bahsedilen ad alanında wireshark (veya diğer standart ağ araçları) kullanarak çok kolay bir şekilde yapılır.

Kurulum biraz karmaşık görünebilir, ancak bir kez anladığınızda ve ona aşina olduğunuzda işinizi çok kolaylaştıracak.

Bunu yapmak için:

  • bir test ağı ad alanı oluşturun:

    ip netns add test
    
  • bir çift sanal ağ arayüzü oluşturun (veth-a ve veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • veth-a arayüzünün aktif ad alanını değiştirin:

    ip link set veth-a netns test
    
  • sanal arabirimlerin IP adreslerini yapılandırın:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • sınama ad alanındaki yönlendirmeyi yapılandırın:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • ip_forward işlevini etkinleştirin ve oluşturduğunuz ad alanından gelen trafiği iletmek için bir NAT kuralı oluşturun (ağ arabirimini ve SNAT ip adresini ayarlamanız gerekir):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address>
    

    (İsterseniz MASQUERADE kuralını da kullanabilirsiniz)

  • son olarak, analiz etmek istediğiniz işlemi yeni ad alanında çalıştırabilir ve wireshark'ı da çalıştırabilirsiniz:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Veth-a arayüzünü izlemeniz gerekecek.

52
felahdab
netstat -taucp | grep <pid or process name>

Bu, kullanılan portu içeren bir uygulamanın yaptığı bağlantıları gösterecektir.

15
Oli

Sadece bir fikir: Başvurunuzu farklı bir IP adresine bağlamak mümkün müdür? Öyleyse, olağan şüphelileri kullanabilirsiniz ( tcpdump , vb.)

Başka bir IP adresine bağlanamayan uygulamalar için araçlar:

http://freshmeat.net/projects/fixsrcip

fixsrcip giden TCP ve UDP istemci soketlerini ( IPv4 ) çok bağlantılı ana makinelerde belirli kaynak IP adreslerine bağlamak için bir araçtır

http://freshmeat.net/projects/force_bind

force_bind, belirli bir IP ve/veya bağlantı noktasında bağlanmayı zorlamanıza izin verir. Hem IPv4 hem de IPv6 ile çalışır.

10
Clausi

Benzer bir konuya geldim ve ioerror tarafından verilen bu cevabı 'ya göre tanımlandığı gibi NFLOG kullanarak burada :

# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# dumpcap -i nflog:30 -w uid-1000.pcap

Ardından, söz konusu işlemi başka bir şey yapmayan bir kullanıcı hesabından çalıştırabilirsiniz - ve işte, sadece tek bir işlemden gelen trafiği izole ettiniz ve yakaladınız.

Sadece kimseye yardım etmesi durumunda geri göndermek istedim.

9
szymon

Yukarıdaki büyük cevapta felahdab tarafından açıklananları yapan bir C uygulaması yazdım!

Buraya bakın: nsntrace github repo

6
Jonas Danielsson

Tracedump'ı deneyebilirsiniz - http://mutrics.iitis.pl/tracedump

İstediğinizi tam olarak yapar, bir işlem kimliği veya çalıştırması gereken bir program verebilirsiniz.

5
pjf

Bu kirli bir kesmek, ancak belirli bir UID için iptables olan bir yönlendirme veya günlük hedefi öneririm. Örneğin:

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -m tcp -j LOG 
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $USER -m udp -j LOG 

Ayrıca bu günlük hedefi için '--log-tcp-dizisi', '--log-tcp-options', '--log-ipc-options', '--log-uid' gibi bir şeye bakmaya değer olabilir. . Her ne kadar bunun sadece tonlarca veri içeren bir pcap işleminde size yardımcı olacağından şüpheleniyorum.

Paketleri işaretlemek istiyorsanız NFLOG hedefi yararlı olabilir ve ardından belirli etiketli paketler bir netlink soketi üzerinden seçtiğiniz bir işleme gönderilir. Bunun wireshark ve belirli bir kullanıcı olarak çalışan belirli bir uygulama ile bir şey hack için yararlı olup olmadığını merak ediyorum?

5
ioerror

İlgilendiğiniz işlemi altında çalışmayı deneyin strace :

strace ping www.askubuntu.com

İşleminizin ne yaptığı hakkında size çok detaylı bilgiler verecektir. Bir işlem istediği herhangi bir portu herhangi bir yerde açabildiği için, önceden tanımlanmış bir filtre kullanarak bir şeyi kaçırabilirsiniz.

Başka bir yaklaşım, soyulmuş bir sanal makineyi veya ağınızdaki bir test makinesini kullanmak ve işleminizi bunun üzerine izole etmek olacaktır. O zaman sadece bu makineden hepsini yakalamak için Wireshark kullanabilirsiniz. Yakaladığınız trafiğin alakalı olacağından oldukça emin olacaksınız.

4
The Unix Janitor

Oluşturma ioerror tarafından verilen cevap Trafiğe bir işaretçi koymak için iptables --uid-owner kullanabileceğinizi sanıyordum ve ardından wireshark'tan yalnızca bu işaretleyiciyle trafik çekmesini isteyebilirsiniz. Bir DSCP (diferansiyel servis işaretçisi), akış kimliği veya bir qos işaretçisi kullanabilirsiniz.

Ya da gerçekten bu paketleri farklı bir arayüze göndermek ve ardından sadece bu arayüzü yakalamak için kullanabilirsiniz.

3
poolie

wireshark bug # 1184 bu özellik. Henüz uygulanmadı.
Kullanıcıdan kopyalandı ask.wireshark.org adresindeki cmanynard

2