Чи можу я відстежувати локальний сокет домену unix, як tcpdump?


59

Я хотів би відстежувати відповіді на unix-сокет, не порушуючи оригінальних з'єднань, і передавати їх до сценарію для обробки.

Я знаю, як це зробити за допомогою tcpdump для tcp-з'єднань, але я не можу знайти рішення для локальних сокетів Unix.

Це навіть можливо?


Відповіді:


15

Там є хлопець, який стверджує, що це робить, створивши додаток, який діє як шлюз між двома сокетами та реєструє всі дані, що передаються. Таким чином, ви не можете натиснути на сокет, але якщо ви зможете перезапустити послугу і налаштувати її на використання цього додатка для хлопців, ви зможете побачити весь трафік.

Ось посилання на пост: Unix Socket Sniffer

Є ще один спосіб, який потребує того, щоб ви знайшли ідентифікатор процесу, приєднаний до сокета, потім знайдіть за допомогою дескриптора файлу сокет і натисніть дескриптор файлу за допомогою strace.

Якщо ви можете зупинити будь-який клієнт / сервер, використовуючи сокет, і перенастроїти його, я б рекомендував завжди перший метод, другий метод - хитрий і вимагає натиснути на поточний процес, який у деяких додатках може призвести до його збою.

Сподіваюся, хтось освітить нас іншим способом :)

Удачі


Так, ви можете зробити метод посередника також з socat, але я сподіваюся на більш прямий спосіб, не змінюючи існуючі налаштування в іншому місці.
ck_

1
Тоді lsof і strace - це єдиний спосіб, про який я знаю. Слідкуйте за виробництвом, коли ви знімаєте напругу з процесу, переконайтеся, що після цього все працює.
доблесть

3
Після того, як деякі більш копати навколо , я знайшов таке запитання з деякими деталями про те, чому це не відразу можливо більш на StackOverflow stackoverflow.com/questions/8394613 / ...
ck_

80

ви можете використовувати socat.

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

Що відбувається вище: спочатку перенесіть оригінальну розетку на sock.original. Socat створює нову розетку ("UNIX-LISTEN") у вихідному місці та пересилає все до оригіналу ("UNIX-connect"). -V повідомляє socat також друкувати вихід на STDERR.


3
Хочете додати трохи більше пояснень?
Казарк

4
Це легко, коли оригінальний сокет Unix має шлях до файлової системи. але що робити, якщо це абстрактний сокет простору імен unix, який фактично не можна переміщувати?
Валеріо Скіавоні

6

Ви також можете спробувати використовувати strace для одного з процесів з обох боків сокета, оскільки це дозволить вам спостерігати, що написано / прочитано. Я знайшов у своїх виробничих середовищах, у мене немає socat, але у мене є напруга.

Для будь-якої корисної мети, встановлення на щось велике є обов'язковим.


Це добре працювало для мене, і це легко зробити. Використовуйте strace -p <pid>для перегляду запущеного процесу.
Метт Мунсон,

швидка команда: strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.logа потім запустіть тести. У вас є /tmp/php.log, щоб повільно перевірити, чи журнал занадто великий. Якщо ви отримуєте занадто багато трафіку, зробіть запит із рядком запиту з вашим іменем або чимось таким чином, щоб ви могли шукати його в журналах
higuita

1
@higuita Я знаю, що минуло давно, але замість цього циклу ви можете дозволити printfобробляти повторення. printf " -p %s" $(pidof php5-fpm)буде префіксом кожного pid-аргументу -pі набагато практичніше написати.
JoL

1
// 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

потім:

sudo tcpdump -i lo -netvv port 8089
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.