Sniff розетка домену UNIX


9

Я знаю, що якийсь процес записується до певного сокета домену unix ( /var/run/asterisk/asterisk.ctl), але я не знаю, як відправник. Як я можу дізнатися, хто пише в сокет? Я спробував:

sudo lsof /var/run/asterisk/asterisk.ctl

але це просто список власника розетки. Мені хотілося б знати, хто пише / читає в цю розетку, і я також хотів би обнюхати дані. Чи можливо це?

Відповіді:


4

Короткі відповіді - не і нелегко.

У Linux lsof покладається на /proc/net/unixотримання інформації щодо розеток домену UNIX. Цей інтерфейс перераховує всі пов'язані сокети, але він не відстежує кінцеві точки. Таким чином, ви можете бачити, які розетки існують, але ви не бачите, що з ними пов'язано. Де - то ця інформація буде відслідковуватися, вона повинна бути відстежено чи інакше з'єднання розетки не буде працювати. Я ще не знайшов жодного механізму для отримання інформації про з'єднання.

Питання нюху трохи цікавіше, але не менш розчаровує. Те, що я мав на увазі під «не легко», - це те, що не існує жодного гачка, який би проникнув і захопив ці дані. Найближчим аналогом є використання tcpdump або Wireshark, обидва вони використовують libpcap, щоб реально здійснити важкий підйом. У той час як мережеві (AF_INET) та UNIX домени (AF_UNIX) створюються за допомогою socket()виклику функції, обидва використовуються connect()для з'єднання, використання read()та write()обробки даних, ними обробляються різні підсистеми ядра. Це має сумний побічний ефект, що libpcap не призначений для роботи з розетками домену UNIX.

Існує дещо менш тьмяна сторона проблеми. Погляньте на сторінку чоловіка recv(2). Це системний виклик нижчого рівня, який read()використовує. Існує прапор для recv()дзвінка MSG_PEEK. Це дозволить вам нюхати трафік, що проходить через розетку домену UNIX. Отже, це світла сторона, темна сторона полягає в тому, що, наскільки мені відомо, не існує жодного поточного додатку, призначеного для цього. Отже, ви дивитесь на певні зусилля з розвитку.

Мені дуже хочеться, щоб на обидві частини вашого запитання була приємна проста відповідь F'YEAH.


11

Так, ви можете це зробити. Все, що вам потрібно, це systemtap.

Розглянемо один із прикладних скриптів systemtap, який буде друкувати PID та ім'я обробки будь-якої програми, яка читає або записує вказаний inode (а ваш сокет домену Unix - саме така річ).

Ви можете тривіально змінити цей сценарій, щоб надрукувати фактичні дані, які читаються / записуються; Я залишаю це робити як вправу для читача.


4

Я знаю, що це не відповідає на головне запитання, але я закінчився тут, шукаючи просто нюхаючи зв’язок на сокет. Я вирішив публікувати таких, як я. Ось як я це зробив:

$> sudo socat -t100 -x -v UNIX-LISTEN: /var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT: /var/run/php5-fpm.sock

Ви можете видалити -x і просто залишити -v для спілкування ascii. Сподіваюся, що хтось допомагає.


працює чудово
JSmyth

-1

socat -t100 UNIX-LISTEN: /tmp/file.sock,mode=777,reuseaddr,fork STDOUT

Немає дублювання виводу, немає циклічного виводу. Помилка попереднього коментаря ".sock.socat"


2
Хоча це може бути корисною командою, будь ласка, додайте пояснення / пояснення (а чим це відрізняється від цієї відповіді ?)
HBruijn

Мені шкода. Немає дублювання виводу, немає циклічного виводу. Помилка попереднього коментаря ".sock.socat"
srvf
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.