禁用 setsockopt(IPV6_V6ONLY)

禁用 setsockopt(IPV6_V6ONLY)

我喜欢映射地址,但一些糟糕的软件(lighttpd)认为我错了 - 事实上,他们让我更改的唯一配置键是它是否会调用setsockopt(IPV6_V6ONLY, true)。禁用该配置并未明确设置IPV6_V6ONLYfalse

为了让每个人都开心,我想禁用该程序的功能setsockopt(IPV6_V6ONLY),同时保持/proc/sys/net/ipv6/bindv6only原样0

有什么方法可以在普通的旧 Linux 中做到这一点吗?

答案1

由于大多数程序通过 libc 进行此类调用,因此使用 $LD_PRELOAD 来拦截它们:

  1. 编写一个共享库(.so 文件),提供您自己的实现setsockopt()

  2. 在您的实现中,您可以检查参数并调用原始函数,或者不调用。(使用dlsym(RTLD_NEXT, …)获取指向“原始”函数的指针,以便您可以调用它。)

    int frob(const char *path) {
        static int (*real_frob)(const char *);
        if (!real_frob)
            real_frob = dlsym(RTLD_NEXT, "frob");
        return real_frob(path);
    }
    
  3. 将.c 文件编译为.so 后,将守护进程的 $LD_PRELOAD 环境变量设置为新库的路径。

相关内容