Tcpdump gibi yerel bir unix alan soketini izleyebilir miyim?


59

Orijinal bağlantıları bozmadan, bir unix soketindeki yanıtları izlemek ve bunları işlem için bir komut dosyasına yönlendirmek istiyorum.

Bunu tcp bağlantıları için tcpdump ile nasıl yapacağımı biliyorum, ancak yerel unix soketleri için bir çözüm bulamıyorum.

Bu mümkün mü?


Yanıtlar:


15

İki soket arasında bir ağ geçidi görevi gören ve akan tüm verileri günlüğe kaydeden bir uygulama oluşturarak bunu iddia eden bir adam var. Böylece bir prize dokunamazsınız ancak hizmeti yeniden başlatıp bu adam uygulamasını kullanmak için ayarlayabilirseniz, tüm trafiği görebileceksiniz.

İşte yazıya link: Unix Soket Sniffer

Sokete takılı işlem kimliğini bulmanızı, ardından soketin dosya tanımlayıcısını bulup, strace kullanarak dosya tanımlayıcısına dokunun.

Herhangi bir istemci / sunucu soketi kullanan her şeyi durdurabilir ve yeniden yapılandırabilirseniz, her zaman ilk yöntemi öneririm, ikinci yöntem ise karmaşıktır ve bazı uygulamalarda çökmesine neden olabilecek geçerli bir işleme dokunmanızı gerektirir.

Birisi bizi anoter şekilde aydınlatıyor umarım :)

İyi şanslar


Yah, aracı yöntemini ayrıca socat ile de yapabilirsiniz, ancak başka bir yerde mevcut ayarları değiştirmeden daha doğrudan bir yol umuyorum.
ck_

1
Öyleyse yalnız kal ve tanıdığım tek yol bu. Süreçten ayrıldığınızda üretime dikkat edin, bundan sonra her şeyin çalışmaya devam ettiğini kontrol edin.
Valor

3
Etrafında biraz daha kazı yaptıktan sonra, bunun neden doğrudan üst üste olmadığına ilişkin bazı detaylarla benzer bir soru buldum stackoverflow.com/questions/8394613/…
ck_

80

socat kullanabilirsiniz.

sudo mv /path/to/sock /path/to/sock.original
sudo socat -t100 -x -v UNIX-LISTEN:/path/to/sock,mode=777,reuseaddr,fork UNIX-CONNECT:/path/to/sock.original

Yukarıda neler oluyor: İlk önce orijinal soketi sock.original konumuna getirin. Socat, orijinal konumunda yeni bir soket ('UNIX-LISTEN') oluşturur ve tümünü orjinaline iletir ('UNIX-connect'). -V, socat'a ayrıca STDERR'ye çıktı yazdırmasını söyler.


3
Biraz daha açıklama eklemek ister misin?
Kazark

4
Orijinal unix soketinin dosya sisteminde bir yolu olduğunda bu kolaydır. ama ya gerçekte hareket edemediğiniz soyut bir ad boşluğu soketi ise?
Valerio Schiavoni

6

Soketin her iki tarafındaki işlemlerden birinde strace özelliğini kullanmayı da deneyebilirsiniz, çünkü bu yazılanları / okunanları izlemenizi sağlar. Yaptığım üretim ortamlarında socat yok ama strace var.

Herhangi bir faydalı amaç için, büyük bir şeye ayarlamak bir zorunluluktur.


Bu benim için iyi çalıştı ve yapmak kolay. strace -p <pid>Çalışan bir işlemi izlemek için kullanın .
Matt Munson,

quick command: strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.logve sonra testleri çalıştırın. Günlük çok büyük olup olmadığını yavaşça kontrol etmek için /tmp/php.log var. Çok fazla trafik
alıyorsanız

1
@higuita Uzun zaman geçtiğini biliyorum, ancak bu döngü yerine printftekrarı halledebilirsiniz. printf " -p %s" $(pidof php5-fpm)Her pid argümanını ön ekleyecektir -pve yazmak çok daha pratiktir.
JoL

2
// backup the socket
sudo mv /var/run/docker.sock /var/run/docker.sock.original

// use tcp port 8089 proxy the original socket
sudo socat TCP-LISTEN:8089,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock.original

// use the new socket to proxy the 8089 port
sudo socat UNIX-LISTEN:/var/run/docker.sock,fork TCP-CONNECT:127.0.0.1:8089

sonra:

sudo tcpdump -i lo -netvv port 8089

El Magnifeco! Thanks
typelogic
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.