URL: https://www.opennet.dev/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 114063
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Трассировка обмена данными через Un..."

Отправлено auto_tips , 12-Апр-18 10:04 
Для Unix domain socket до сих пор отсутствовал инструмент  для захвата или ослеживания содержимого канала связи, наподобие tcpdump для IP. Для решения данной задачи [[http://laforge.gnumonks.org/blog/20180330-udtrace/ подготовлен]] новый инструмент [[https://github.com/laf0rge/udtrace udtrace]], который реализован в виде разделяемой библиотеки, подключаемой через LD_PRELOAD.


Загружаем код из Git:

    git clone git://git.gnumonks.org/udtrace

Собираем командой:

    make

Запускаем интересующее приложение в режиме трасиировки:

    LD_PRELOAD=libudtrace.os программа

Например, чтобы узнать какие данные передаёт systemctl через Unix-сокет при выполнении команды "stat", можно запустить:

    LD_PRELOAD=libudtrace.so systemctl status

    >>> UDTRACE: Unix Domain Socket Trace initialized (TITAN support DISABLED)
    >>> UDTRACE: Adding FD 4
    >>> UDTRACE: connect(4, "/run/dbus/system_bus_socket")
    4 sendmsg W 00415554482045585445524e414c20
    4 sendmsg W 3331333033303330
    4 sendmsg W 0d0a4e45474f54494154455f554e49585f46440d0a424547494e0d0a
    [...]
     UDTRACE: Removing FD 4

где,

* 4 - номер файлового дескриптора
* sendmsg - имя системного вызова (кроме sendmsg может быть  read, write , readv и т.п.)
* R|W - операция чтения или записи (со стороны отслеживаемого процесса)
* шестнадцатеричный дамп переданных или полученных данных (отображаются только реально переданные через сокет данные, а не попавшие буфер передачи)

Для декодирования шестнадцатеричного дампа можно собрать декодировщики от проекта Osmocom, написанные на языке TTCN-3 с использованием [[https://projects.eclipse.org/projects/tools.titan Eclipse TITAN]]. Для их включения при сборке можно указать флаг

   make ENABLE_TITAN=1

После чего запускать трассировку строкой вида:

   LD_LIBRARY_PATH=/usr/lib/titan LD_PRELOAD=libudtrace.so systemctl status

URL: http://laforge.gnumonks.org/blog/20180330-udtrace/
Обсуждается: http://www.opennet.dev/tips/info/3057.shtml


Содержание

Сообщения в этом обсуждении
"Трассировка обмена данными через Unix domain socket"
Отправлено Онанимус , 12-Апр-18 10:04 
А чего не показали, как изменится выхлоп, после применения шестнадцатеричного декодировщика?

"Трассировка обмена данными через Unix domain socket"
Отправлено Qasta , 12-Апр-18 12:31 
Тоже интересно было бы посмотреть...

"Трассировка обмена данными через Unix domain socket"
Отправлено Аноним , 13-Апр-18 09:42 
Где тот герой, кто оторвет жопу от дивана, и пересоберет udtrace, и воспроизведет пример из статьи?

"Трассировка обмена данными через Unix domain socket"
Отправлено EHLO , 12-Апр-18 11:23 
Что из этого нельзя в strace? Или strace слишком архаично для *Ops-ов?

"Трассировка обмена данными через Unix domain socket"
Отправлено щи , 12-Апр-18 15:35 
Тем, что strace работает через ptrace? Разве не очевидно?

"Трассировка обмена данными через Unix domain socket"
Отправлено Аноним , 12-Апр-18 18:04 
В *strace очевидно много лишнего.

Интересней зачем кому-то использовать unix sockets - для общесистемных нужд?

Для каких прикладных задач может быть полезно. nginx не предлагать, Сысоев не одобрит.


"Трассировка обмена данными через Unix domain socket"
Отправлено Аноним , 12-Апр-18 18:07 
Для каких прикладных задач - это вопрос. Вопросительный знак потерялся. :)

"Трассировка обмена данными через Unix domain socket"
Отправлено Аноним , 13-Апр-18 10:24 
>Для каких прикладных задач может быть полезно. nginx не предлагать, Сысоев не одобрит.

А что, чтобы применить для чего-либо этот nginx, нужно спрашивать одобрения у Сысоева? Такой "свободный" проект...


"Трассировка обмена данными через Unix domain socket"
Отправлено Аноним , 18-Апр-18 12:31 
Одобрение спрашивать не нужно, но полезно знать ограничения продукта, который ты используешь.

Так вот Сысоев как-то высказался в духе, что использовать unix sockets в nginx не стоит.


"Трассировка обмена данными через Unix domain socket"
Отправлено Andrey Mitrofanov , 13-Апр-18 10:45 
> В *strace очевидно много лишнего.
> Интересней зачем кому-то использовать unix sockets - для общесистемных нужд?

Пошарь на своём локалхостике в выводе -

for mp in /{,var/,run/}; do
    mountpoint -q $mp && find $mp -mount -type s;
done 2>/dev/null
и подумай, зачем _тебе_ это?

> Для каких прикладных задач может быть полезно. nginx не предлагать, Сысоев не
> одобрит.


"Трассировка обмена данными через Unix domain socket"
Отправлено Аноним , 18-Апр-18 12:43 
Годный ответ. Спасибо.

"Трассировка обмена данными через Unix domain socket"
Отправлено Andrey Mitrofanov , 18-Апр-18 14:25 
> Годный ответ. Спасибо.

Пожалуйста.

Там ещё ',tmp/'  перед '}' имеет смысл добавить.

...и, для ценителей:
$ lsof -U |sort -k9 |less -S
# lsof -U |sort -k6,6 -k9 |awk '{if($6!=x){l=$0;x=$6}else{if(l)print l;print;l=""}}' |less -S


"Трассировка обмена данными через Unix domain socket"
Отправлено Аноним , 12-Апр-18 22:51 
Можно как-то так:
$ sudo socat -v UNIX-LISTEN:/tmp/socat-listen,ignoreeof,fork UNIX-CONNECT:/var/run/docker.sock,ignoreeof &
[1] 14726
$ sudo docker --host=unix:///tmp/socat-listen images
> 2018/04/12 12:46:29.989304  length=79 from=0 to=78

GET /_ping HTTP/1.1\r
Host: docker\r
User-Agent: Docker-Client/1.13.1 (linux)\r
\r
< 2018/04/12 12:46:29.994767  length=196 from=0 to=195
HTTP/1.1 200 OK\r
Api-Version: 1.26\r
Docker-Experimental: false\r
Server: Docker/1.13.1 (linux)\r
Date: Thu, 12 Apr 2018 19:46:29 GMT\r
Content-Length: 2\r
Content-Type: text/plain; charset=utf-8\r
\r
OK> 2018/04/12 12:46:29.999271  length=91 from=79 to=169
GET /v1.26/images/json HTTP/1.1\r
Host: docker\r
User-Agent: Docker-Client/1.13.1 (linux)\r
\r
< 2018/04/12 12:46:30.000197  length=516 from=196 to=711
HTTP/1.1 200 OK\r
Api-Version: 1.26\r
Content-Type: application/json\r
Docker-Experimental: false\r
Server: Docker/1.13.1 (linux)\r
Date: Thu, 12 Apr 2018 19:46:30 GMT\r
Content-Length: 329\r
\r
[{"Containers":-1,"Created":1522924888,"Id":"sha256:8ac48589692a53a9b8c2d1ceaa6b402665aa7fe667ba51ccc03002300856d8c7","Labels":null,"ParentId":"","RepoDigests":["busybox@sha256:58ac43b2cc92c687a32c8be6278e50a063579655fe3090125dcb2af0ff9e1a64"],"RepoTags":["busybox:latest"],"SharedSize":-1,"Size":1146369,"VirtualSize":1146369}]
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              8ac48589692a        7 days ago          1.15 MB
$

Вместо -v можно -x (hexadecimal), или комбирированный -v -x. Ну и банальный strace -e.... никто не отменял.


"Трассировка обмена данными через Unix domain socket"
Отправлено izyk , 13-Апр-18 13:17 
Можно так:
https://superuser.com/a/576404
если можно.

"Трассировка обмена данными через Unix domain socket"
Отправлено Аноним , 24-Апр-18 19:17 
Способ с LD_PRELOAD вообще позволяет прикалываться над программами по всякому. Можно завернуть неугодные вызовы, можно туфту возвращать. Ну и просто изучать что программа делает. И логгить, если хочется.

Я так делал для open - можно логить что программа пыталась открыть. А можно и завернуть нафиг. Все. Или не все. Дешево и сердито.


"Трассировка обмена данными через Unix domain socket"
Отправлено Andrey Mitrofanov , 25-Апр-18 06:42 
>Ну и просто изучать что программа делает.

Маленький Столман плачет в каждом читающем это.


"Трассировка обмена данными через Unix domain socket"
Отправлено universite , 28-Апр-18 06:07 
На FreeBSD не собирается:

root@tank1:/tmp/udtrace/udtrace# gmake
cc -Wall -fPIC -o utils.o -c utils.c
cc -Wall -fPIC -o sock_events.o -c sock_events.c
In file included from sock_events.c:3:
./sock_events.h:8:10: fatal error: 'sys/epoll.h' file not found
#include <sys/epoll.h>
         ^~~~~~~~~~~~~
1 error generated.
gmake: *** [Makefile:18: sock_events.o] Ошибка 1


"Трассировка обмена данными через Unix domain socket"
Отправлено xm , 11-Май-18 14:54 
Патамушта там kqueue

"Трассировка обмена данными через Unix domain socket"
Отправлено Sfinx , 09-Май-18 21:15 
sysdig не ?

"Трассировка обмена данными через Unix domain socket"
Отправлено Всем Сосать , 17-Май-18 16:07 
Нажрались системдятины? Теперь трассировщик нужен?
Не хотели кушать bash, жрите блобы и дампы.