【问题标题】:Tcpdump not being able to write pcap file. Permission deniedTcpdump 无法写入 pcap 文件。没有权限
【发布时间】:2019-06-28 10:10:58
【问题描述】:

我正在为我的 Java 应用程序开发一个网络监控解决方案,这样我就可以在我的机器接口上嗅探数据包并将结果转储到滚动的 PCAP 文件中。从 Java 代码启动 tcpdump 命令(使用 sudo)时,我得到 tcpdump: /path/to/app/log/GTP00: Permission denied

详情

使用Runtime.getRuntime().exec(command) 执行命令,其中command 是一个值为sudo tcpdump -i eth0 -w /path/to/app/log/GTP -W 50 -C 20 -n net 10.246.212.0/24 and ip 的字符串

启动 Java 应用程序的用户是“testUser”,属于“testGroup”组。允许该用户使用 sudo tcpdump。

目标目录具有以下属性:

[testUser@node ~]$ ls -ld /path/to/app/log drwxrwxr-x. 2 testUser testGroup 4096 Feb 4 15:40 /path/to/app/log

更多详情

从命令行启动命令成功地在指定文件夹中创建 pcap 文件。

[testUser@node ~]$ ls -l /path/to/app/log/GTP00 -rw-r--r--. 1 tcpdump tcpdump 1276 Feb 4 16:12 /path/to/app/log/GTP00

我为测试目的开发了一个简化的 Java 应用程序

package execcommand;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ExecCommand {

    public static void main(String[] args) {
        try {

            String command;
            String line;
            String iface = "eth0";
            String capturePointName = "GTP";
            String pcapFilterExpression = "net 10.246.212.0/24 and ip";
            int capturePointMaxNumberOfFilesKept = 50;
            int capturePointMaxSizeOfFilesInMBytes = 20;

            command = "sudo tcpdump -i " + iface + " -w /path/to/app/log/"
                    + capturePointName + " -W " + capturePointMaxNumberOfFilesKept + " -C "
                    + capturePointMaxSizeOfFilesInMBytes + " -n " + pcapFilterExpression;

            Process process = Runtime.getRuntime().exec(command);
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            while ((line = br.readLine()) != null) {
                System.err.println(line);
            }
        } catch (IOException ex) {
            Logger.getLogger(ExecCommand.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

此测试程序由同一用户启动,成功在指定文件夹中创建 pcap 文件。

[testUser@node ~]$ ls -l /path/to/app/log/GTP00 -rw-r--r--. 1 tcpdump tcpdump 1448 Feb 4 16:21 /path/to/app/log/GTP00

然后,我可以推断问题在某种程度上仅限于我的 Java 应用程序。这就是我的 Java 应用程序的启动方式:

exec java -Dknae_1 -Djavax.net.ssl.trustStorePassword=<trust_pass> -Djavax.net.ssl.trustStore=/path/to/app/etc/certificates/truststore -Djavax.net.ssl.keyStorePassword=<key_store_pass> -Djavax.net.ssl.keyStore=/path/to/app/etc/certificates/keystore -d64 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8887,suspend=y -XX:-UseLargePages -Xss7m -Xmx64m -cp /path/to/app/lib/knae.jar:/path/to/app/lib/xphere_baseentity.jar:/path/to/app/lib/mysql.jar:/path/to/app/lib/log4j-1.2.17.jar:/path/to/app/lib/tools.jar:/path/to/app/conf:/path/to/app/lib/pcap4j-core-1.7.5.jar:/path/to/app/lib/pcap4j-packetfactory-static-1.7.5.jar:/path/to/app/lib/jna-5.1.0.jar:/path/to/app/lib/slf4j-api-1.7.25.jar:/path/to/app/lib/slf4j-simple-1.7.25.jar com.app.package.knae.Knae knae_1

更新

我可以在/tmp 中写入 pcap 文件。 我也尝试将 777 权限授予/path/to/app/log,但无济于事。 这些是两个目录的属性:

[testUser@node ~]$ ls -ld /tmp
drwxrwxrwt. 10 root root 4096 Feb  6 10:13 /tmp
[testUser@node ~]$ ls -ld /path/to/app/log
drwxrwxrwx. 2 testUser testGroup 4096 Feb  6 09:25 /path/to/app/log

我会根据需要提供任何其他信息。

为什么 tcpdump 抱怨无法写入这个文件?

【问题讨论】:

  • 如果你从 root 而不是 sudo 运行它会发生什么?还要检查/path/to/app/log/GTP 上的写入,也许它是只读的ls -l
  • @deathangel908 原来 SELinux 是这个错误的原因。我已将其停用,并且 PCAP 文件的写入没有进一步的问题。因此,我现在只需要正确调整 SELinux 以便 tcpdump 能够写入 /path/to/app/log 目录。

标签: java tcpdump


【解决方案1】:
  • 在命令行中使用绝对路径而不是“sudo”和“tcpdump
  • 使用ProcessBuilder.class 而不是Runtime.exec(),因为您可以指定工作目录,您可以在选项中使用空格等等。
  • 在 tcpdump 命令中,您必须使用-Z 标志来指定用户,因为 PCAP 使用不同于调用者之一。检查 ServerFault 上的此链接:tcpdump permisson denied

【讨论】:

  • 没用。我使用“sudo”和“tcpdump”的完整路径,使用 ProcessBuilder 创建流程(审美变化)并使用 -Z 选项与“testUser”和“root”。结果没有什么不同,得到相同的错误。
  • @adrikayak 不美观,因为 tcpdump 的表达式部分包含空格。如果您使用Runtime.exec(),“net 10.246.212.0/24 和 ip”是 4 个不同的命令行选项,如果您使用 myProcessBuilder.command("net 10.246.212.0/24 and ip");,则为 1 个
猜你喜欢
  • 2013-08-05
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 2022-07-16
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
相关资源
最近更新 更多