77

Я хочу простой способ показать все данные TCP (не заголовки TCP или что-либо еще), проходящие через любой интерфейс на моем компьютере с Linux.

Например, я хочу волшебную команду, которая, если я сделаю:

magic_commmand_I_want port=1234

затем, если на моей машине был сервер, прослушивающий порт 1234, и кто-то сделал:

echo hello | nc localhost 1234
# Note: "nc" (aka "netcat") is a simple tool that sends data to a host/port

Тогда магическая команда просто распечатает:

hello

Я пробовал "tcpdump", "ethereal", "tethereal", "tshark" и другие, но не совсем понятно, как их получить:

  • не показывать IP-адреса или другие метаданные
  • показывать только отправляемые "данные", а не отдельные пакеты и их заголовки
  • печатать данные как есть, не в шестнадцатеричном виде и не с маркерами смещения пакетов
  • перехватывать весь сетевой трафик (будь то на eth0, eth1 или lo и т. д.)

Да, возможно, вы могли бы связать воедино переданный набор команд Unix, чтобы сделать это, но это не очень легко запомнить в следующий раз :)

Если у вас есть простой пример точной командной строки, которая делает это, я бы этого хотел.

7 ответов7

103

Обновить:

Как отметил Михал в комментариях: Начиная с версии 1.3 tcpflow опция -e используется для указания имени сканера. Поэтому выводится ошибка «Неверное имя сканера« 8983 ». Правильная команда

sudo tcpflow -i any -C -J port 1234

(также -J был изменен на -g в последней версии)


Спасибо Ив за то, что указал мне на " tcpflow ". Вот командная строка:

tcpflow -i any -C -e port 1234  # as root, or with sudo

Это все, что я хочу

  • отображает данные побайтно, как они поступают
  • не отображает другие метаданные
  • слушает на всех интерфейсах (таким образом, это захватывает данные, приходящие изнутри машины и снаружи)

« -C » указывает, что нужно сделать дамп на консоль вместо файла. « -e » включает цвета, чтобы клиент-> сервер и сервер-> клиент были визуально различимы.

Я установил tcpflow, просто выполнив

sudo apt-get install tcpflow
28

Socat - это инструмент, который вы запрашиваете. Он может выступать в качестве прокси:

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello

тогда ваше приложение должно подключить порт 4444 вместо прямого подключения к 1234

Опция -v для socat распечатывает все, что получает по стандартной ошибке (stderr).

Обновить:

Если socat недоступен на вашем компьютере, вы все равно можете эмулировать его с помощью netcat:

$netcat -l -p 4444 | tee output_file | netcat localhost 1234

предостережения: эта опция является однонаправленной. второй экземпляр netcat напечатает любой ответ с вашего сервера на стандартный вывод. Вы все еще можете сделать тогда:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
20

Попробуйте Wireshark. Это отличный анализатор протоколов, предназначенный как для Linux, так и для Windows.

13

tcpflow - это то, что вы хотите. Выдержка из справочной страницы:

ОПИСАНИЕ
tcpflow - это программа, которая собирает данные, передаваемые как часть TCP-соединений (потоков), и сохраняет данные таким образом, который удобен для анализа или отладки протокола. Программа, подобная tcpdump (4), показывает сводные данные о пакетах, увиденных в сети, но обычно не хранит данные, которые фактически передаются. Напротив, tcpflow реконструирует фактические потоки данных и сохраняет каждый поток в отдельном файле для последующего анализа. tcpflow понимает порядковые номера TCP и корректно восстанавливает потоки данных независимо от повторных передач или неупорядоченной доставки.

tcpflow хранит все захваченные данные в файлах с именами вида

192.168.101.102.02345-010.011.012.013.45103

где содержимым вышеупомянутого файла будут данные, передаваемые с хоста 192.168.101.102 через порт 2345, на хост 10.11.12.13 через порт 45103.

Установите соединение между приложением и сервером. Когда соединение установлено и работает, tcpflow все еще может захватывать данные из него. Например:

$ sudo tcpflow -i lo port 5555
tcpflow[3006]: listening on lo

Все данные будут храниться в файле с именем 127.000.000.001.48842-127.000.000.001.05555.

Вы все еще можете перенаправить это на стандартный вывод с опцией -Cs. Прочитайте страницу руководства, чтобы поиграть с выражением, чтобы настроить пакеты, которые вы хотите захватить tcpflow.

2

ngrep очень хорош для этого. Для поиска в пакетах требуется строка BPF и необязательная строка, а затем выводится содержимое пакета на экран в довольно полезном формате. При желании он также создает дамп в файл pcap_dump, который вы можете более подробно изучить в Wireshark позже.

0

Посмотрите на Chaosreader. Хотя это немного больше, чем вы просите, и немного по-другому, возможно, вы могли бы изменить его код, чтобы сделать то, что вы хотите.

-1

Может быть, вы можете написать оболочку для tcpdump, например, которая удалит всю избыточную информацию

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .