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

79

Я хочу простой способ показать все данные 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, чтобы сделать это, но это не очень легко запомнить в следующий раз :)

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

Dustin Boswell
источник
2
tcpdump - волшебная команда, которую вы хотите. Wireshark - хороший графический интерфейс поверх библиотеки, которую использует tcpdump
Vinko Vrsalovic
3
Я знаю, что это старый вопрос, но мне любопытно узнать, почему использование nc для "серверной части" также не было вариантом? «nc -l 1234» создает сервер, который прослушивает порт 1234, распечатывает все, что ему отправлено, и закрывает соединение. Если вы хотите сохранить соединение и не отключать его, вы можете добавить опцию «-k».
StFS
2
@StFS, потому что он хочет прослушать работающий порт, а nc будет жаловаться.
Infoclogged

Ответы:

106

Обновить:

Как отметил Михал в комментариях: Начиная с версии 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
Dustin Boswell
источник
2
Ух ты. tcpflow потрясающий, спасибо! Спасло меня тонну боли, которую я испытывал с Wireshark. Wireshark, tcpdump и т. Д. Содержат слишком много информации и на самом деле не выполняют то, что задает исходный вопрос. tcpflow идеально подходит для этого.
Расс
10
Начиная с версии 1.3 tcpflow эта -eопция используется для указания имени сканера. Поэтому выводится ошибка «Неверное имя сканера« 8983 ». Правильная командаsudo tcpflow -i any -C -J port 1234
Михал Ковач
6
Обратите внимание, что -Jэто было изменено -gв последних выпусках.
tvon
2
Кто-то должен объяснить авторам инструмента, что означает термин «обратная совместимость»!
Шридхар Сарнобат
Он печатает «вещи» дважды, для меня. Почему это ? lpaste.net/3984129577801744384
user1198559
29

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
yves Baumes
источник
Предположим, у меня нет контроля над клиентом и сервером (или я не хочу его останавливать), поэтому я не могу изменить какой порт задействован или перехватить трафик. Тогда что?
20

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

Кевин Бойд
источник
3
Мой опыт показывает, что интерфейс действительно отстой в Linux.
Джо Филлипс
блин, ты добрался до меня, +1 на wireshark
Можете ли вы привести пример командной строки?
Взгляните на эту ссылку wiki.wireshark.org/Tools. Здесь приведен список инструментов командной строки для wireshark. Ищите Dumpcap.
Кевин Бойд
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 позже.

Hobbs
источник
0

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

Андрей Y
источник
-1

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

dimba
источник