Могу ли я отслеживать локальный сокет домена Unix, например, tcpdump?

Я хотел бы отслеживать ответы в Unix-сокете, не нарушая исходные соединения, и направлять их в сценарий для обработки.

Я знаю, как сделать это с tcpdump для соединений tcp, но я не могу найти решение для локальных сокетов unix.

Это вообще возможно?

5 ответов

Решение

Есть парень, который утверждает, что делает это, создавая приложение, которое действует как шлюз между двумя сокетами, и регистрирует все данные, которые передаются. Таким образом, вы не можете нажать на сокет, но если вы можете перезапустить сервис и настроить его для использования этого приложения, вы сможете увидеть весь трафик.

Вот ссылка на пост: Unix Socket Sniffer

Есть еще один способ, который требует, чтобы вы нашли идентификатор процесса, подключенный к сокету, затем найдите с помощью lsof дескриптор файла сокета и затем коснитесь дескриптора файла, используя strace.

Если вы можете остановить любой клиент / сервер, использующий сокет, и перенастроить его, я бы порекомендовал всегда первый метод, второй метод сложен и требует от вас прикосновения к текущему процессу, который в некоторых приложениях может вызвать его сбой.

Надеюсь, кто-то просветит нас другим способом:)

Удачи

Вы можете использовать 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.

Вы также можете попробовать использовать strace в одном из процессов по обе стороны сокета, так как это позволит вам наблюдать за тем, что пишется / читается. Я обнаружил в своей производственной среде, у меня нет socat, но есть strace.

Для любой полезной цели установка -s на что-то большое является обязательным.

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

Немного поздно, но я изменил сценарий systemtap, который будет делать это для людей, которые не могут пересылать трафик сокетов из прослушивающего процесса. Используйте на свой страх и риск, я тестировал это только для Red Hat Enterprise Linux 7, но структуры, на которые мы ссылаемся, являются общими и (надеюсь) не сильно меняются:

      /*
 * watch_unix_socket.stp
 *
 * This is a simply more modern version of the script found here:
 * https://sourceware.org/systemtap/wiki/WSunixSockets
 *
 * The first argument is the location of the file descriptor for a UNIX socket.
 * To find this address, for example, for the Docker socket run:
 *
 * # lsof 2>&1 | awk '/docker.sock/ {print $7}' | grep -v '0t0' | sort -u
 * 0xffff8ed0b4eb1800
 *
 * And use that address to run this systemtap script:
 * 
 * # stap watch_unix_socket.stp 0xffff8ed0b4eb1800
 */

probe begin {
    printf("Watching input into socket 0x%x...\n", $1);
}

probe kernel.function("unix_stream_sendmsg") {
    if ($sock->sk != $1) {
        printf("%d %s is accessing %p\n", pid(), execname(), $sock->sk);
        printf("====================\n");

        len = 0
        for (i = 0; i < $msg->msg_iovlen; i++) {
            len += $msg->msg_iov[i]->iov_len;
        }
    
        printf("%d [", len);
        for (i = 0; i < $msg->msg_iovlen; i++) {
            printf("%s", user_string_n($msg->msg_iov[i]->iov_base, $msg->msg_iov[i]->iov_len));
        }

        printf("] [");
        for (i = 0; i < $msg->msg_iovlen; i++) {
            printf("%s", user_string_n($msg->msg_iov[i]->iov_base, $msg->msg_iov[i]->iov_len));
        }

        printf("]\n\n");
    }
}

Я обновляю его как Github Gist на своей странице .

Другие вопросы по тегам