[root@localhost ~]# cat /etc/issue
Fedora release 17 (Beefy Miracle)
Kernel \r on an \m (\l)
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.6.10-2.fc17.i686 #1 SMP Tue Dec 11 18:33:15 UTC 2012 i686 i686 i386 GNU/Linux
[root@localhost ~]# tcpdump -i p3p1 -n -w out.pcap -C 16
tcpdump: out.pcap: Permission denied
エラーが発生するのはなぜですか?
私は何をすべきか?
centos 5で試してみましたが、tmpまたはルートフォルダーでも同じです。 tcpdumpのmanページから、最初のsavefileを開く前に-Zオプション(デフォルトで有効)とともに使用すると特権が削除されます。 "-C 1"を指定したため、ファイルサイズが既に1に達しているために拒否されたアクセス許可が発生し、新しいファイルを作成すると、アクセス許可拒否エラーが発生します。 -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) = ?
上記のstraceの結果を見ると、tcpdumpは特権をユーザーおよびグループpcap(77)にドロップしています。
# grep 77 /etc/group
pcap:x:77:
# grep 77 /etc/passwd
pcap:x:77:77::/var/arpwatch:/sbin/nologin
Tcpdumpのmanページから、-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 ]
-Z userで特定のユーザーを指定する
# 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
/tmp
または他のすべての書き込み可能なディレクトリからコマンドを実行してみてください。誰もが書き込みできないディレクトリでtcpdumpに問題があったことを覚えています。理由はわかりません-:)
cd /tmp
tcpdump -i p3p1 -n -w out.pcap -C 16
私がこれに遭遇したときPermission denied
問題が発生したことが判明しました.cap
の代わりにファイルの拡張子.pcap
。 RichLがコメントで指摘したように、UbuntuのAppArmorプロファイル/etc/apparmor.d/usr.sbin.tcpdump
が原因です。
# 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
Tcpdumpが 'tcpdump'ユーザーに特権をドロップしています。manページを確認してください( "-Z tcpdump"がデフォルトであり、tcpdumpユーザーにはrootのhomedirに書き込む権限がありません)。 Daniel T.が言ったように、/ tmpなどの誰でも書き込み可能なディレクトリ、または少なくともユーザーまたはグループに「tcpdump」の書き込み権限を与えたディレクトリでキャプチャを実行します。
SELinuxは稼働していますか?次のように入力して確認します:ターミナル:
/usr/sbin/getenforce
Enforcing
と表示されている場合は、SELinuxを無効にしてtcpdumpを再試行し、SEが停止しているかどうかを確認できます。
tcpdumpを実行しているディレクトリのモードを変更する必要があります。
chmod 777
次に、コマンドtcpdump -vv -i any -s0 -w file_name.pcapを実行します。
うまくいくはずです... !!
エラーメッセージは私にはあまり意味がありません。ただし、SELinuxは考えられる説明です。 straceを介してtcpdumpを開始すると、何が起こっているのかを詳しく調べることができます。
strace tcpdump -i p3p1 -n -w out.pcap -C 16