2009-08-13 22:44:50 +0000 2009-08-13 22:44:50 +0000
82
82

Какой самый простой способ прослушивания данных TCP-трафика под Linux?

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

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

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-адреса или другие метаданные
  • показывать только посылаемые “данные”, а не отдельные пакеты и их заголовки
  • печатать данные как есть, а не в hex, и не с помощью маркеров пакетного смещения
  • прослушивать all сетевой трафик (идет ли он по eth0 или eth1 или lo и т.д.). …)

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

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

Ответы (7)

109
109
109
2009-08-14 17:05:54 +0000

Обновление:

Как указала Михаль в комментариях: Начиная с версии tcpflow 1.3 для указания имени сканера используется опция -e. Таким образом, будет напечатана ошибка “Недействительное имя сканера ‘8983’”. Правильная команда -

sudo tcpflow -i any -C -J port 1234

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


Спасибо yves за то, что указали мне на tcpflow “. Вот запятая:

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

Это делает все, что я хочу

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

-C“ говорит ему делать дамп в консоль, а не в файл. -e” включает цвета, поэтому клиент>сервер и сервер>клиент визуально различимы.

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

sudo apt-get install tcpflow
```.
30
30
30
2009-08-13 22:48:27 +0000

Сокат - это инструмент, который вы просите. Он может действовать как доверенное лицо:

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

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

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

Обновление:

Если сокат недоступен на вашей машине, вы все равно можете эмулировать его с помощью 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
20
20
2009-08-13 22:47:06 +0000

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

13
13
13
2009-08-14 15:04:28 +0000

tcpflow - это то, что ты хочешь. Извлеките из man-страницы:

ОПИСАНИЕ 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
2
2
2009-08-13 23:15:48 +0000

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

0
0
0
2009-08-13 23:08:00 +0000

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

-1
-1
-1
2009-08-13 22:47:31 +0000

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

Похожие вопросы

6
10
3
5
5