Disallow to use --no-ipv6 in kernel space

This commit is contained in:
Vadim Vetrov
2025-01-08 23:58:55 +03:00
parent 16ba8801c1
commit 37c8a798fd
2 changed files with 44 additions and 30 deletions

View File

@@ -478,7 +478,15 @@ int yparse_args(int argc, char *argv[]) {
#endif #endif
break; break;
case OPT_NO_IPV6: case OPT_NO_IPV6:
#ifndef KERNEL_SPACE
rep_config.use_ipv6 = 0; rep_config.use_ipv6 = 0;
#else
lgerr("--no-ipv6 argument is not available "
"in the kernel module. "
"If you want to disable ipv6, compile with "
"make kmake EXTRA_CFLAGS=\"-DNO_IPV6\".");
goto invalid_opt;
#endif
break; break;
case OPT_DAEMONIZE: case OPT_DAEMONIZE:
rep_config.daemonize = 1; rep_config.daemonize = 1;

View File

@@ -464,10 +464,14 @@ static struct nf_hook_ops ykb6_nf_reg __read_mostly = {
static int __init ykb_init(void) { static int __init ykb_init(void) {
#ifdef NO_CONNTRACK #ifdef NO_CONNTRACK
lgwarning("Conntrack disabled."); lgwarning("Conntrack is disabled.");
#endif
#ifdef NO_IPV6
lgwarning("IPv6 is disabled.");
#endif #endif
int ret = 0; int ret = 0;
struct net *n;
ret = init_config(&config); ret = init_config(&config);
if (ret < 0) goto err; if (ret < 0) goto err;
@@ -475,8 +479,6 @@ static int __init ykb_init(void) {
if (ret < 0) goto err; if (ret < 0) goto err;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0)
struct net *n;
for_each_net(n) { for_each_net(n) {
ret = nf_register_net_hook(n, &ykb_nf_reg); ret = nf_register_net_hook(n, &ykb_nf_reg);
if (ret < 0) { if (ret < 0) {
@@ -491,31 +493,35 @@ static int __init ykb_init(void) {
#endif #endif
if (config.use_ipv6) { #ifndef NO_IPV6
ret = open_raw6_socket(); ret = open_raw6_socket();
if (ret < 0) { if (ret < 0) {
config.use_ipv6 = 0; lgerror(ret, "ipv6 initialization failed!");
lgwarning("ipv6 disabled!");
goto ipv6_fallback;
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0)
struct net *n; for_each_net(n)
for_each_net(n) { nf_unregister_net_hook(n, &ykb_nf_reg);
ret = nf_register_net_hook(n, &ykb6_nf_reg);
if (ret < 0) {
lgerror(ret, "register net6_hook");
}
}
#else #else
ret = nf_register_hook(&ykb6_nf_reg); nf_unregister_hook(&ykb_nf_reg);
#endif
goto err;
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0)
for_each_net(n) {
ret = nf_register_net_hook(n, &ykb6_nf_reg);
if (ret < 0) { if (ret < 0) {
lgerror(ret, "register net6_hook"); lgerror(ret, "register net6_hook");
} }
#endif
} }
#else
ret = nf_register_hook(&ykb6_nf_reg);
if (ret < 0) {
lgerror(ret, "register net6_hook");
}
#endif
#endif /* NO_IPV6 */
ipv6_fallback:
lginfo("youtubeUnblock kernel module started.\n"); lginfo("youtubeUnblock kernel module started.\n");
return 0; return 0;
@@ -524,6 +530,8 @@ err:
} }
static void __exit ykb_destroy(void) { static void __exit ykb_destroy(void) {
struct net *n;
mutex_lock(&config_free_mutex); mutex_lock(&config_free_mutex);
// acquire all locks. // acquire all locks.
spin_lock(&hot_config_spinlock); spin_lock(&hot_config_spinlock);
@@ -535,27 +543,25 @@ static void __exit ykb_destroy(void) {
// netfilter callbacks keep running // netfilter callbacks keep running
while (atomic_read(&hot_config_counter) > 0) {} while (atomic_read(&hot_config_counter) > 0) {}
if (config.use_ipv6) { #ifndef NO_IPV6
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0)
struct net *n; for_each_net(n)
for_each_net(n) nf_unregister_net_hook(n, &ykb6_nf_reg);
nf_unregister_net_hook(n, &ykb6_nf_reg);
#else #else
nf_unregister_hook(&ykb6_nf_reg); nf_unregister_hook(&ykb6_nf_reg);
#endif #endif
} #endif /* NO_IPV6 */
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0)
struct net *n;
for_each_net(n) for_each_net(n)
nf_unregister_net_hook(n, &ykb_nf_reg); nf_unregister_net_hook(n, &ykb_nf_reg);
#else #else
nf_unregister_hook(&ykb_nf_reg); nf_unregister_hook(&ykb_nf_reg);
#endif #endif
if (config.use_ipv6) { #ifndef NO_IPV6
close_raw6_socket(); close_raw6_socket();
} #endif
close_raw_socket(); close_raw_socket();
free_config(config); free_config(config);