如何在linux内核模块中识别tcp数据包来自哪个程序?

时间:2017-12-04 20:15:25

标签: c linux tcp linux-kernel

我目前正在编写一个我需要编写linux防火墙扩展的作业。

一点背景:

我的内核模块将维护一个“规则”列表。规则只是一个端口号,带有可执行文件的路径。规则表示允许程序在相应端口上建立传出连接。

如果端口X有规则且程序A不是其中之一,则只应终止程序A在端口X上的连接。因此,如果端口没有设置规则,任何人都可以在端口上进行通信。

我知道如何分析TCP数据包标头并提取源端口。我的问题是,如何判断哪个程序创建了这个数据包?

以下是我的讲师给我的一些示例代码,虽然我不确定它有何帮助。我删除了与清晰度无关的部分。

int init_module(void)
{
    struct path path;
    pid_t mod_pid;
    struct dentry *procDentry;
    struct dentry *parent;

    char cmdlineFile[BUFFERSIZE];
    int res;

    mod_pid = current->pid;
    snprintf (cmdlineFile, BUFFERSIZE, "/proc/%d/exe", mod_pid); 
    res = kern_path (cmdlineFile, LOOKUP_FOLLOW, &path);
    if (res) {
      return -EFAULT;
    }

    procDentry = path.dentry;
    parent = procDentry->d_parent;
    printk (KERN_INFO "The name is %s\n", procDentry->d_name.name);
    printk (KERN_INFO "The name of the parent is %s\n", parent->d_name.name);
    path_put(&path);
    return 0;
}

0 个答案:

没有答案