我喜欢映射地址,但一些糟糕的软件(lighttpd)认为我错了 - 事实上,他们让我更改的唯一配置键是它是否会调用setsockopt(IPV6_V6ONLY, true)
。禁用该配置并未明确设置IPV6_V6ONLY
为false
。
为了让每个人都开心,我想禁用该程序的功能setsockopt(IPV6_V6ONLY)
,同时保持/proc/sys/net/ipv6/bindv6only
原样0
。
有什么方法可以在普通的旧 Linux 中做到这一点吗?
答案1
由于大多数程序通过 libc 进行此类调用,因此使用 $LD_PRELOAD 来拦截它们:
编写一个共享库(.so 文件),提供您自己的实现
setsockopt()
。在您的实现中,您可以检查参数并调用原始函数,或者不调用。(使用
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); }
将.c 文件编译为.so 后,将守护进程的 $LD_PRELOAD 环境变量设置为新库的路径。