какой самый простой способ нюхать tcp данные трафика на linux?

<p>мне нужен простой способ показать все данные tcp (не заголовки tcp или что-либо еще), проходящие через любой интерфейс на моем компьютере с linux.</p><p>например, я хочу волшебную команду, которая, если я сделаю:</p><pre><code>magic\_commmand\_i\_want port=1234 </code></pre><p>затем, если на моей машине был сервер, прослушивающий порт 1234, и кто-то сделал:</p><pre><code>echo hello | nc localhost 1234 # note: "nc" (aka "netcat") is a simple tool that sends data to a host/port </code></pre><p>тогда магическая команда просто распечатает:</p><pre><code>hello </code></pre><p>я пробовал "tcpdump", "ethereal", "tethereal", "tshark" и другие, но не совсем понятно, как их получить:</p><ul> <li>не показывать ip-адреса или другие метаданные</li> <li>показывать только отправляемые «данные», а не отдельные пакеты и их заголовки</li> <li>печатать данные как есть, не в шестнадцатеричном виде и не с маркерами смещения пакетов</li> <li>снифф<em> все </em>сетевой трафик (будь то<em> eth0 </em>или<em> eth1 </em>или<em> lo </em>и т. д ...)</li> </ul><p>да, вы могли бы, вероятно, связать воедино переданный набор команд unix, чтобы сделать это, но это не очень легко запомнить в следующий раз :)</p><p>если у вас есть простой пример точной командной строки, которая делает это, я бы этого хотел.</p>

<p><strong> обновить: </strong></p><p>как отметил михал в комментариях: с tcpflow версии 1.3 опция -e используется для указания имени сканера. поэтому выводится ошибка «неверное имя сканера« 8983 ». правильная команда</p><p><code>sudo tcpflow -i any -c -j port 1234</code></p><p>(также <code>-j</code> был изменен на <code>-g</code> в последней версии)</p><hr><p>спасибо ив за то, что указал мне на " <a href="https://github.com/simsong/tcpflow/wiki/tcpflow-%e2%80%94-a-tcp-ip-session-reassembler">tcpflow</a> ". вот командная строка:</p><pre><code>tcpflow -i any -c -e port 1234 # as root, or with sudo </code></pre><p>это все, что я хочу</p><ul> <li>отображает данные побайтно, как они поступают</li> <li>не отображает другие метаданные</li> <li>прослушивает все интерфейсы (таким образом, он захватывает данные, поступающие изнутри машины и снаружи)</li> </ul><p>«<code>-c</code>» говорит ему, чтобы дамп на консоль вместо файла. «<code>-e</code>» включает цвета, чтобы клиент-> сервер и сервер-> клиент были визуально различимы.</p><p>я установил tcpflow, просто выполнив</p><pre><code>sudo apt-get install tcpflow </code></pre>

<p>socat - это инструмент, который вы запрашиваете. он может выступать в качестве прокси:</p><pre><code>$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 </code></pre><p>предостережения: эта опция является однонаправленной. второй экземпляр netcat напечатает любой ответ с вашего сервера на стандартный вывод. вы все еще можете сделать тогда:</p><pre><code>$mkfifo my_fifo $netcat -l -p 4444 < my\_fifo | tee output\_file | netcat localhost 1234 > my\_fifo </code></pre>

<p>попробуйте <a href="http://en.wikipedia.org/wiki/wireshark">wireshark</a> . это отличный анализатор протоколов, предназначенный как для linux, так и для windows.</p>

<p>tcpflow - это то, что вы хотите. выдержка из справочной страницы:</p><blockquote> <p>описание<br> <strong> tcpflow - это программа, которая собирает данные, передаваемые как часть tcp соединений (потоков), и сохраняет данные удобным для анализа или отладки протокола. </strong>программа наподобие tcpdump (4) показывает сводку пакетов, увиденных на проводе, но обычно не хранит данные, которые фактически передаются. напротив, tcpflow реконструирует фактические потоки данных и сохраняет каждый поток в отдельном файле для последующего анализа. tcpflow понимает порядковые номера tcp и корректно восстанавливает потоки данных независимо от повторных передач или неупорядоченной доставки.</p> <p>tcpflow хранит все захваченные данные в файлах с именами вида</p> <p>192.168.101.102.02345-010.011.012.013.45103</p> <p>где содержимым вышеупомянутого файла будут данные, передаваемые с хоста 192.168.101.102 через порт 2345, на хост 10.11.12.13 через порт 45103.</p> </blockquote><p>установите соединение между приложением и сервером. когда соединение установлено и работает, tcpflow все еще может захватывать данные из него. например:</p><pre><code>$ sudo tcpflow -i lo port 5555 tcpflow[3006]: listening on lo </code></pre><p>все данные будут храниться в файле с именем 127.000.000.001.48842-127.000.000.001.05555.</p><p>вы можете все еще перенаправить это на стандартный вывод с опцией -cs. прочитайте страницу руководства, чтобы поиграть с выражением, чтобы настроить пакеты, которые вы хотите захватить tcpflow.</p>

<p><code>ngrep</code> очень хорош для этого. для поиска в пакетах требуется строка bpf и дополнительная строка, а затем выводит содержимое пакета на экран в довольно полезном формате. при желании он также создает дамп в файл pcap\_dump, который вы можете более подробно изучить в wireshark позже.</p>

<p>взгляните на <a href="http://chaosreader.sourceforge.net/">chaosreader</a> . хотя он делает немного больше, чем вы просите, и немного по-другому, возможно, вы могли бы изменить его код, чтобы сделать то, что вы хотите.</p>