Solución 1:
probé en Centos 5, sigue siendo el mismo incluso en tmp o en la carpeta raíz. desde la página de manual de tcpdump, los privilegios se eliminan cuando se usan con la opción -Z (habilitada de forma predeterminada) antes de abrir el primer archivo guardado. debido a que especificó "-C 1", el permiso denegado se debe a que el tamaño del archivo ya alcanzó 1, y cuando se crea un nuevo archivo, generará un error de permiso denegado. así que solo especifica el usuario -Z
# strace tcpdump -i eth0 -n -w out.pcap -C 1
fstat(4, {st_mode=S_IFREG|0644, st_size=903, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aea31934000
lseek(4, 0, SEEK_CUR) = 0
read(4, "root:x:0:root\nbin:x:1:root,bin,d"..., 4096) = 903
read(4, "", 4096) = 0
close(4) = 0
munmap(0x2aea31934000, 4096) = 0
setgroups(1, [77]) = 0
setgid(77) = 0
setuid(77) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, "\1\0\0\0\0\0\0\0\310\357k\0\0\0\0\0", 16) = 0
fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
recvfrom(3, 0x7fff9563d35f, 1, 32, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
fcntl(3, F_SETFL, O_RDWR) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, "\1\0\17\0\0\0\0\0P\327\233\7\0\0\0\0", 16) = 0
open("out.pcap", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 EACCES (Permission denied)
write(2, "tcpdump: ", 9tcpdump: ) = 9
write(2, "out.pcap: Permission denied", 27out.pcap: Permission denied) = 27
write(2, "\n", 1
) = 1
exit_group(1) = ?
puede ver el resultado de strace arriba, tcpdump eliminó los privilegios en el usuario y el grupo pcap (77).
# grep 77 /etc/group
pcap:x:77:
# grep 77 /etc/passwd
pcap:x:77:77::/var/arpwatch:/sbin/nologin
Desde la página man de tcpdump, -C
# man tcpdump
-C Before writing a raw packet to a savefile, check whether the file is currently larger than file_size and, if so,
close the current savefile and open a new one. Savefiles after the first savefile will have the name specified
with the -w flag, with a number after it, starting at 1 and continuing upward. The units of file_size are mil-
lions of bytes (1,000,000 bytes, not 1,048,576 bytes).
**Note that when used with -Z option (enabled by default), privileges are dropped before opening first savefile.**
# tcpdump --help
tcpdump version 3.9.4
libpcap version 0.9.4
Usage: tcpdump [-aAdDeflLnNOpqRStuUvxX] [-c count] [ -C file_size ]
[ -E algo:secret ] [ -F file ] [ -i interface ] [ -M secret ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ] [ -y datalinktype ] [ -Z user ]
[ expression ]
Especifique un usuario específico con -Z usuario
# tcpdump -i eth0 -n -w out.pcap -C 1 -Z root
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
35 packets captured
35 packets received by filter
0 packets dropped by kernel
Solución 2:
Intente ejecutar el comando desde /tmp
o cualquier otro directorio mundial grabable. Recuerdo haber tenido problemas con tcpdump en directorios en los que no se puede escribir en todo el mundo, no tengo ni idea de por qué -:)
cd /tmp
tcpdump -i p3p1 -n -w out.pcap -C 16
Solución 3:
Su tcpdump está perdiendo privilegios para el usuario 'tcpdump', verifique la página del manual ("-Z tcpdump" es el valor predeterminado, y el usuario tcpdump no tiene permisos para escribir en el directorio principal de la raíz). Como le dijo Daniel T., ejecute su captura en un directorio de escritura universal como /tmp, o al menos en un directorio en el que haya otorgado permisos de escritura al usuario o al grupo 'tcpdump'.
Solución 4:
Cuando me encontré con este Permission denied
resultó ser que estaba poniendo un .cap
extensión en el archivo en lugar de .pcap
. Como señaló RichL en los comentarios, el perfil de AppArmor en Ubuntu /etc/apparmor.d/usr.sbin.tcpdump
causa esto.
# uname -a ; lsb_release -a
Linux bidder-lb4 3.2.0-76-virtual #111-Ubuntu SMP Tue Jan 13 22:33:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04.5 LTS
Release: 12.04
Codename: precise
Solución 5:
¿Se está ejecutando SELinux? Comprueba escribiendo es terminal:
/usr/sbin/getenforce
Si dice Enforcing
, puede intentar deshabilitar SELinux e intentar tcpdump nuevamente, para ver si SE lo estaba deteniendo.