Linux'ta hangi sürecin UDP trafiğini yaptığını nasıl belirleyebilirim?


39

Makinem sürekli udp dns trafik isteği yapıyor. Bilmem gereken, bu trafiği oluşturan sürecin PID'si.

TCP bağlantısındaki normal yol netstat / lsof kullanmak ve iadeyle ilişkili süreci almaktır.

UDP mi bağlantı stateles, yani netastat / lsof'u çağırdığımda sadece UDP soketi açıldığında ve trafik gönderiyorsa görebiliyorum.

İle lsof -i UDPve ile denedim nestat -anpue, ancak bu işlemi yapan işlemin ne olduğunu bulamıyorum çünkü udp trafiği gönderilirken lsof / netstat'ı tam olarak çağırmam gerekiyor, eğer udp datagramı gönderilmeden önce / sonra lsof / netstat'ı çağırmam gerekiyor. açılan UDP soketini görmek imkansız.

Netstat / lsof'u tam olarak 3/4 udp paketi gönderildiğinde IMPOSSIBLE olarak çağırın.

Rezil süreci nasıl tespit edebilirim? Gönderilen PID'yi paketin içeriğinden tanımlamayı denemek için trafiği zaten inceledim, ancak trafiğin içeriğinden tanımlamak mümkün değil.

Birisi bana yardım edebilir mi ?

Ben bu makinede rootum FEDORA 12 Linux noise.company.lan 2.6.32.16-141.fc12.x86_64 # 1 SMP Çar 7 Temmuz 04:49:59 UTC 2010 x86_64 x86_64 x86_64 GNU / Linux

Yanıtlar:


48

Linux denetimi yardımcı olabilir. En azından kullanıcıları ve datagram ağ bağlantılarını yapan işlemleri bulur. UDP paketleri datagramlardır.

İlk önce, auditdçerçeveyi platformunuza yükleyin ve auditctl -lkural tanımlanmadığını söylese bile bir şeylerin iade edildiğinden emin olun .

Ardından, sistem çağrısını izlemek ve socket()daha sonra kolayca bulmak için etiketlemek için bir kural ekleyin ( -k). Sana 64-bit mimarisine olduklarını varsaymak gerekir, ancak yerini alabilir b32yerine b64sen değilsen.

auditctl -a exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET

Bunu oluşturmak için man sayfaları ve başlık dosyalarını seçmeniz gerekir, ancak yakaladığı şey aslında bu sistem çağrısıdır: socket(PF_INET, SOCK_DGRAM|X, Y)üçüncü parametrenin belirtilmediği, ancak genellikle sıfır olduğu. PF_INET2 ve SOCK_DGRAM2. TCP bağlantılarını kullanmak istiyorsunuz olduğunu SOCK_STREAMbelirleyecek olan a1=1. ( SOCK_DGRAMikinci parametrede ORed SOCK_NONBLOCKveya ile karşılaştırılabilir. Bu SOCK_CLOEXECnedenle, &=karşılaştırma yapılır.) Daha -k SOCKETsonra denetim izlerini ararken kullanmak istediğimiz anahtar kelimemizdir. Herhangi bir şey olabilir, ama basit tutmayı seviyorum.

Birkaç dakika geçip denetim yollarını gözden geçirin. İsteğe bağlı olarak, ağdaki bir sunucuyu ping yaparak birkaç paketi zorlayabilir ve bu, UDP kullanan ve denetim alarmımızı tetiklemesi gereken bir DNS araması yapılmasına neden olur.

ausearch -i -ts today -k SOCKET

Ve aşağıdaki bölüme benzer çıktılar görünecektir. Önemli kısımları vurgulamak için onu kısaltıyorum

type=SYSCALL ... arch=x86_64 syscall=socket success=yes exit=1 a0=2 a1=2 ... pid=14510 ... auid=zlagtime uid=zlagtime ... euid=zlagtime ... comm=ping exe=/usr/bin/ping key=SOCKET

Yukarıdaki çıktıda, pingkomutun soketin açılmasına neden olduğunu görebiliriz . Sonra çalıştırabilir strace -p 14510hala çalışıyor olması halinde, süreci. ppid(Ana süreç kimliği) ayrıca durumda listelenen bir script yumurtlar problem çocuk çok olduğunu.

Şimdi, çok fazla UDP trafiğiniz varsa, bu yeterince iyi olmayacak ve ikisi de şu anda uzmanlığımın ötesinde olan OProfile veya SystemTap’e başvurmanız gerekecektir .

Bu, genel davada işleri daraltmaya yardımcı olmalıdır.

İşiniz bittiğinde, bunu oluşturmak için kullanılan aynı hattı kullanmak suretiyle denetim kuralı kaldırmak, sadece yerine -asahip -d.

auditctl -d exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET

deneyeceğim, ama bence doğru cevap.
boos

Bu, en azından benim için, iptables tarafından bırakılan trafiği toplamak değildir.
02,

1
Sadelik için sistemtap yöntemine kıyasla +1 (ki bu daha analitik, ancak çekirdek devel paketlerine ihtiyaç duyuyor)
basos

23

Netstat'ı kullanabilirsiniz, ancak doğru bayraklara ihtiyacınız vardır ve bu yalnızca verileri gönderen işlem hala canlıysa çalışır. Hayata kısaca gelen, UDP trafiği gönderen, sonra giden bir şeyin izlerini bulamaz. Ayrıca yerel kök ayrıcalıkları gerektirir. Bahsedilen:

İşte yerel sunucumda bir ncat başlatıyorum, (var olmayan) bir makinede 2345 numaralı bağlantı noktasına UDP trafiği gönderiyorum 10.11.12.13:

[madhatta@risby]$ ncat -u 10.11.12.13 2345 < /dev/urandom

İşte trafiğin gittiğini kanıtlayan bazı tcpdump çıktıları:

[root@risby ~]# tcpdump -n -n port 2345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:41:32.391750 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.399723 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.401817 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.407051 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.413492 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.417417 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192

İşte yararlı bit , -a bayrağıyla netstat'ı (bağlantı noktası ayrıntılarını görmek için) ve işlem kimliği ayrıntılarını görmek için -p bayrakını kullanıyor. Kök ayrıcalıkları gerektiren -p bayrağı:

[root@risby ~]# netstat -apn|grep -w 2345
udp        0      0 192.168.3.11:57550          10.11.12.13:2345            ESTABLISHED 9152/ncat     

Gördüğünüz gibi, pid 9152, belirtilen uzak ana bilgisayardaki 2345 numaralı bağlantı noktasına açık bir bağlantıya sahip olduğu için parmaklanmıştır. Netstat, ps yoluyla da yardımcı olur ve bana işlem adının ne olduğunu söyler ncat.

Umarım bu biraz yararlıdır.


gerçekten güzel bitti! : thumbup:
ThorstenS

2
Yine de bir yakalama var. Soruna, DNS aramasını yapan ve bu işlemi hızlı bir şekilde çıkaran bir alt işlemi oluşturan bir kabuk komut dosyası neden oluyorsa, kaynak bağlantı noktası (yukarıdaki 57550) her zaman değişecektir. Bu durumda, teknik çalışmaz ve daha sert önlemler almak zorunda kalırsınız. Ek olarak, netstat'ınızın bir işlem yapması gerekirdi grep -w 57550çünkü aynı işlem için birden fazla işlem DNS araması yapıyor olabilir. Yöntemin onları ayırt etmeyecekti.
Sıfır laf zamanı

1
Her iki itirazınızla da aynı fikirdeyim (hem de hemfikir olduğunuz zaman için teşekkürler, ThorstenS!).
MadHatter,

17

Ben de aynı problemi yaşadım ve maalesef auditdbenim için pek bir şey yapmadı.

Bazı sunucularımdan google DNS adreslerine doğru giden trafik vardı 8.8.8.8ve 8.8.4.4. Şimdi ağ yöneticimde hafif OKB var ve internetteki DNS önbelleklerimizden beri tüm gereksiz trafiği temizlemek istedi. Bu önbellek sunucuları dışındaki herkes için giden 53 numaralı bağlantı noktasını devre dışı bırakmak istedi.

Yani, ile başarısız sonra auditctl, ben kazmak systemtap. Aşağıdaki senaryo ile geldim:

# cat >> udp_detect_domain.stp <<EOF
probe udp.sendmsg {
  if ( dport == 53 && daddr == "8.8.8.8" ) {
    printf ("PID %5d (%s) sent UDP to %15s 53\n", pid(), execname(), daddr)
  }
}
EOF

Sonra sadece koşun:

stap -v udp_detect_domain.stp

Bu benim elde ettiğim çıktı:

PID  3501 (python) sent UDP to  8.8.8.8 53
PID  3501 (python) sent UDP to  8.8.8.8 53
PID  3506 (python) sent UDP to  8.8.8.8 53

Bu kadar! resolv.confBu PID'leri değiştirdikten sonra değişiklikleri almadım.


Bu yardımcı olur umarım :)


5

Burada, 1.8 ve sonraki sürümlerde bulunan netfilter problarını kullanan bir systemtap seçeneği sunulmaktadır. Ayrıca bakınız man probe::netfilter.ip.local_out.

# stap -e 'probe netfilter.ip.local_out {
  if (dport == 53) # or parametrize
      printf("%s[%d] %s:%d\n", execname(), pid(), daddr, dport)
}'
ping[24738] 192.168.1.10:53
ping[24738] 192.168.1.10:53
^C

4

DNS isteklerini görüntülemek için tcpdump veya wireshark gibi bir net-sniffer kullanırdım. Sorgunun içeriği, hangi programın yayınladığı hakkında fikir verebilir.


trafikte hiçbir bilgi koklamadım ben zaten görüyorum.
boos

Bilgi yok? Boş paketler? Demek istediğim, eğer bir şey updates.java.sun.com veya rss.cnn.com adreslerini çözmeye çalışıyorsa, faydalı bir şekilde bundan bir şey çıkartabilirsiniz.
RedGrittyBrick

dns iç proxy için arama sorgusu. Şu anda ben wich süreçtir bulundu, ancak tekniklerini çözme genel sorunu için hayatta hala soru
Boos

lsof -i | awk '/ UDP /'
c4f4t0r

3

Autitctl kullanırken, örneğin nscd'nin bir DNS sorgusu yaparken soket sistem çağrısında biraz farklı bir parametre kullandığını unutmayın:

socket(AF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP)

Dolayısıyla, yukarıda belirtilenlere ek olarak bu sorguları yakaladığınızdan emin olmak için, isterseniz, aynı adda bir ek filtre ekleyebilirsiniz:

auditctl -a exit,always -F arch=b64 -F a0=2  -F a1=2050 -S socket -k SOCKET

Burada 2050, bit cinsinden bir OR SOCK_DGRAM (2) ve SOCK_NONBLOCK (2048).

Ardından, arama her iki filtreyi de aynı anahtarla bulur SOCKET:

ausearch -i -ts today -k SOCKET

Burada bulduğum yuva sabitleri için onaltılık değerler: https://golang.org/pkg/syscall/#pkg-constants

Yorum yapacak puanlarım olmadığı için bunu ekledim.

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.