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


93

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. Tek bir belirli işlemin ağ trafiğini yalıtmak tcpdumpveya wiresharkyakalamak için bir yol var mı ? (Kullanmak netstatyetersiz.)

Yanıtlar:


21

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

Öncelikle işleminiz tarafından kullanılan protokolleri ve portları bulmanız gerekir ( önceki açıklamadaki 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.


6
Basit bir bağlantı için bu mümkün, ancak geçmişte acele eden DNS, HTTP, vb. İzlemem gerekiyor, bu nedenle netstatyoğun bir makinede yalnızca basit ağ yakalama filtreleri kullanmak için basit bir yol yoktur .
Kees Cook

Tamam, HTTP ve DNS genel portları birçok uygulama tarafından kullanılır, ancak karşılık gelen özel port benzersizdir. Peki neden özel limana göre filtrelemeyi denemiyorsunuz?
OpenNingia

Çünkü hızlı küçük talepler tarafından görülmeyecek netstat; Sadece uzun ömürlü bağlantıları yakalayacağım. :(
Kees Cook,

peki işlem çalışma zamanında dinamik bağlantı noktaları kullanıyorsa, o zaman statik bağlantı noktası filtreleri kullanamayacaksınız
Unix Janitor

Burada en iyi cevabı bulduğunuzu düşünüyorum ... Ne yazık ki bir ağ koklama aracı ağ yığınının en alt seviyesinde çalışır, her şeyi yakalamaya çalışır, bu işletim sistemi üzerinde çalışan işlemlerin tamamen farkında değildir. Belirli bir aramanın ne olduğunu bulmak çok zor olurdu. Bir paket dinleyicisi sonunda bir işlem kimliğini belirleyebilir (bağlantı noktası numarasıyla) ancak bu işlemin tamamen bağımsız olduğu için hangi işlemi bir DNS araması yaptığını çözemez (büyük olasılıkla çağrıyı tetikleyen çekirdek ağ yığını). Ancak diğer süreçleri filtrelemek ve durdurmakla hedefinize ulaşabilmelisiniz.
Huygens

135

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 filtre tanımlar
  • -s dizi sınırını 32’den daha büyük
  • -p eklemek için işlem kimliğini alır

2
Bu yararlıdır, çünkü root erişimi veya özel izinler olmadan kullanılabilir (bazı Linux dağıtımlarında, yine de - Ubuntu'da özel izinlere ihtiyacınız olabilir).
Robin Green,

1
Bu da kullanışlıdır, çünkü daha önce başlatılmış bir işleme karşı çalıştırılabilir ve neredeyse tüm Linux kutularında kullanılabilir.
zakmck

53

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'ı etkinleştirin ve oluşturduğunuz ad alanından gelen trafiği iletmek için bir NAT kuralı oluşturun (ağ arayüzünü 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.


4
Harika bir fikir, ancak “sınırlamalara” dikkat edin. Bu ayrı bir ad alanı olduğundan, geridöngü adreslerini veya UNIX etki alanı soketlerini kullanarak varsayılan ad alanındaki yerel işlemlerle iletişim kuramazsınız. Sonuncusu D-Bus üzerinden iletişimi etkiler.
Lekensteyn

@Lekensteyn hala ağ ad alanlarında afaik'te unix alan soketlerini kullanabilirsiniz. Dosya sistemi onlar tarafından izole edilmez.
randunel

1
@randunel Bu konuda daha kesin olmalıydım. Demek istediğim, "soyut soket ad alanında" (dosya sistemini kullanmayan) Unix alan soketlerine doğrudan ağ ad alanları arasında erişilememesidir. Geçici bir çözüm olarak, bir proxy kullanabilirsinizsocat .
Lekensteyn,

Bağımsız --to-sourcedeğişken ile hangi IP adresini kullanıyorsunuz iptables? Seçeneğe ilettiğiniz arabirimin IP adresi, oluşturduğunuz -oIP adresi veya ??? Ben gerekmez maskeli versiyonunu denedik --to-source, burada açıklandığı şekilde ve bu çalıştı!
ntc2

3
Bunların hepsi kök erişimi gerektiriyor.
simplegamer

15
netstat -taucp | grep <pid or process name>

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


8
Bu, o anda var olan bağlantıları gösterir, ancak trafiğin kendisinin bir günlüğünü sağlamaz.
Kees Cook,

1
Kees Cook'un yorumu hakkında emin değilim. Basit bir netstat bir anki bağlantılar hakkında bilgi gösterir, ancak -c bayrağıyla her saniye bu durumun bir anlık görüntüsünü elde edersiniz (bkz. 'Man netstat'). Belki de tüm trafiğe sahip değildir, ancak bağlantıların benzersiz bir görüntüsü değildir.
trevendows

3
Şey, eminim. Bu olacak değil bir sürecin tüm ağ trafiği yakalamak.
Reinier Post

Bu, hangi port numarasının dahili bir güvenlik duvarı tarafından engellendiğini bulmak için kullanışlıdır. Çalıştırdığım komut tarafından gönderilen TCP SYN'lerin (hedef adres ve port numarası ile birlikte) gönderildiğini gösterdi.
Anthony Geoghegan

11

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

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

http://freshmeat.net/projects/fixsrcip

fixsrcipgiden TCP ve UDP istemci soketlerini ( IPv4 ) çok bağlantılı ana bilgisayarlardaki belirli kaynak IP adreslerine bağlamak için kullanılan bir araçtır

http://freshmeat.net/projects/force_bind

force_bindbelirli bir IP ve / veya bağlantı noktasında bağlamaya zorlamanıza izin verir. IPv4 ve IPv6 ile birlikte çalışır .


Çoğu uygulama kaynak IP'lerini belirlemeyi desteklemez, ancak bu aslında CLONE_NEWNET içeren bir kapsayıcı kullanarak ancak CLONE_NEWNS kullanmadan mümkün olabilir.
Kees Cook,

Alternatif olarak, bir ağ ad alanı oluşturabilir ve uygulamanızı içinde çalıştırabilirsiniz: www.evolware.org/?p=293
Flint

9

Benzer bir konuya geldim ve bu cevaba dayanarak ioerror tarafından NFLOG'u burada açıklandığı şekilde kullanarak çözebildim :

# 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 mesaj atmak istedim.


6

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

Buraya bakın: nsntrace github repo


Harika, ama nasıl alacağınız ve kullanacağınızla ilgili daha fazla ayrıntı eklemenin iyi olacağını düşünüyorum :)
Zanna

Teşekkürler! Kullanım ve örnekler içeren bir README.md dosyasını tutan github deposuna bir bağlantı ve indirme talimatlarını verdim!
Jonas Danielsson

5

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?


ama bu sadece gidenler için işe yarıyor, peki ya içeri girmek?
sonuçlar

5

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.


1
Güzel bir proje, ama ... "Tracedump şu anda sadece 32-bit Linux hostlarında çalışıyor" maalesef onu öldürüyor.
gertvdijk

4

İlgilendiğiniz işlemi strace altında gerçekleştirmeyi deneyin :

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ızda bir test makinesini kullanmak ve işleminizi bunun üzerinde izole ederek yerleştirmektir. O zaman bu makineden hepsini yakalamak için sadece Wireshark'ı kullanabilirsiniz . Yakaladığınız trafiğin alakalı olacağından oldukça emin olacaksınız.


Bir "-e trace = network" eklemek, aslında ağa yazılan verileri kaybetmek pahasına çıktının bir kısmını eritir. Yalnızca "açılmış soket sayısı" veya benzeri bir şeyle ilgileniyorsanız, bu işleri kolaylaştırır.
dannysauer

3

Bina IOError tarafından cevap Kullanabileceğin şüpheli iptables --uid-ownertrafik üzerindeki işaretleyici ayarlamak için, ve sonra o işaretleyici ile trafiği yakalamak için wireshark sorabilirsiniz. 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.



-1

belki iptables ve ulog çalışabilir? Tam bir tarifim yok, ancak iptables işlemlerinin eşleşebileceğini düşünüyorum , eşleştikten sonra ulog kullanabilirsiniz.


3
Ne yazık ki, iptables -m owner --pid-owner $PIDLinux 2.6.14'te kaldırıldı: ftp.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.14
Kees Cook,

-1

Netstat yürütme ve bir metin dosyasına günlüğe kaydetme yoluyla döngü için bir kabuk komut dosyası oluşturabilirsiniz düşünüyorum. Gibi bir şey (çok kaba adımlar):

echo "press q to quit"
while [ <q is not pressed>]
do
    `netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done

Ben programcı değilim, bu yüzden bunu düzeltemiyorum. Fakat buradaki biri kaldığım yerden başlayıp sizin için çalışan bir senaryo oluşturabilir.


Yeterince iyi değil. Soru tüm ağ trafiğini yakalamaktır , sadece kontrol ettiğiniz zamanlarda aktif olan her şeyi yakalamak değildir.
Reinier Post
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.