Использование tcpdump для извлечения содержимого NFS RPC

Довольно простой вопрос … Я запускаю tcpdump и пытаюсь проанализировать содержимое пакетов TCP между сервером / клиентом. Я вижу, что RPC «GETATTR» получен, что здорово! Однако я хочу знать файл, для которого выполняется RPC. Я предполагаю, что это содержимое пакета. Когда я печатаю tcpdump как ASCII.

From server: tcpdump -vvv -s 200 port 2049 14:45:38.408949 IP (tos 0x0, ttl 64, id 58408, offset 0, flags [DF], proto TCP (6), length 296) myserver.nfs > myclient.2469839164: reply ok 240 getattr NON 3 ids 0/3 sz 0 

Здесь и на других сайтах показано, что можно сопоставить имена файлов. Может быть, это зависит от платформы? Я просто хочу убедиться, что нет tcpdump, которого я не вижу.

Я запускаю RH5 – Kernel 2.6.32-279.el6.x86_64

Итак, я думаю, мне удалось найти «обходной путь». Вы не сможете получить имя файла, используя NFSv3, но вы сможете указать индекс.

Используя Wireshark,

Перейдите в Edit -> Preferences -> Protocols -> NFS -> отметьте все поля и установите «Decode nfs handle как: KNFSD_LE.

Сохрани это. Теперь захватите и отфильтруйте протокол NFS.

Поиск пакета GETATTR Reply (Call in #) Regular file mode: ???.

Откройте это упакованное и разверните следующее:

 Network File System -> obj_attributes 

проверьте значение fileid , это будет номер inode файла.

на сервере перейдите на раздел nfs и

 find . -inum inode 

С NFSv4 вы видите вызов с именем файла напрямую.

Вы можете посмотреть инструмент nfstrace на github: ( https://github.com/epam/nfstrace ). Он отслеживает все захваченные процедуры NFSv3 / NFSv4.