linux - 从 Linux 内核空间禁用反向路径过滤

标签 linux linux-kernel

在 Linux 内核模块中,我需要以某种方式禁用 rp_filter。 这通常可以通过几个简单的 sysctl 调用从用户空间实现:

sysctl net.ipv4.conf.all.rp_filter=0
sysctl net.ipv4.conf.[ifname].rp_filter=0

如何从内核空间获得相同的结果?我的第一个想法是我可能需要写入相关的 proc 文件。如果是这样,执行此操作的正确方法是什么?

最佳答案

我正在查看内核中 sysctl 的实现,我发现执行 sysctl 与将值写入文件一样在 /proc 文件系统中。

在您的情况下,您只想执行以下操作:

echo 0 >/proc/sys/net/ipv4/conf/all/rp_filter

这是一个粗略的代码示例,基于我在刚才阅读的内核代码中看到的内容:

struct vfsmount *mnt;
struct file *file;
ssize_t result;
char *pathname = "sys/net/ipv4/conf/all/rp_filter";
int flags = O_WRONLY;

mnt = task_active_pid_ns(current)->proc_mnt;
file = file_open_root(mnt->mnt_root, mnt, pathname, flags);
result = PTR_ERR(file);
if (IS_ERR(file)) {
  // oops, something bad happened
} else {
  char *buffer = "\0";
  result = kernel_write(file, buffer, 1, 0); // last 2 args are 'count' and 'pos'
  if (result < 0) {
    // oops, something else bad happened
  }
}
fput(file);

这只是一个粗略的示例,因此您必须自己进行研究和测试才能使其发挥作用。祝你好运!

关于linux - 从 Linux 内核空间禁用反向路径过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31000939/

相关文章:

c - Uart 16c950 linux 速度高于 B4000000 (4Mbps)

linux - 在 PATH 中添加 Storm

c - 结构数组末尾的空大括号 '{ }' 需要什么?

c++ - 使用 C 中系统调用的文件描述符

linux - 在 bash 中设置全局变量

php - 无法使用 nginx 实现 php

c - 系统调用表中的common abi有什么用

c - 稀疏抛出的警告

linux - 在 bash 中打印文件夹名称

linux - 使用自定义 header 编译 Linux 内核模块