当 sysctl.conf 和 GRUB_CMDLINE_LINUX 不起作用时,如何在 Debian 中禁用 IPv6?

Alp*_*uri -1 networking debian ipv6

第一的,

如果我sysctl net.ipv6.conf.all.disable_ipv6=1在系统启动后从命令行发出,我会得到我想要的结果——IPv6 确实被禁用。

现在解决重新启动后使此行为持续存在的问题。

很容易找到如何执行此操作的建议,通常它们围绕将net.ipv6.conf.all.disable_ipv6=1文件放入/etc/sysctl.d/目录中或 sysctl 本身的配置文件中,即/etc/sysctl.conf. 提到的其他方法包括添加

GRUB_CMDLINE_LINUX="ipv6.disable=1"
Run Code Online (Sandbox Code Playgroud)

/etc/default/grub

例如,这里提到了这一点:

https://serverfault.com/questions/660979/how-to-disable-ipv6-support-in-linux-entirely

我已经尝试了所有这些,但它们不起作用。ifconfig清楚地表明该接口已启用 IPv6。同样,如果我只是在启动后执行手册sysctl,它会按预期禁用它。

sysctl -p对我没有任何作用,只需按上述方式逐字编写命令即可。

我还尝试将sysctl命令放入 中/etc/rc.local,通过观察我可以放在那里的其他命令,我知道该命令可以正确运行。然而,尽管执行了,但似乎并没有生效。

我还尝试了其他命令,而不仅仅是all.disable_ipv6,例如default.disable_ipv6and enp0s3.disable_ipv6(我已经验证 enp0s3 确实是我的以太网接口)。

对我来说,这似乎有点类似于https://bugs.launchpad.net/ubuntu/+source/linux/+bug/997605,但我不知道为什么会发生这种情况。我确信我在不同的系统上所要做的只是将其放入 /etc/sysctl.d/ 中的文件中。

除了我尝试过的之外,我已经知道禁用此功能的一种方法是在不支持 IPv6 的情况下手动重新编译内核。然而,这实在是太拼凑了,它不可靠,而且需要做和维护太多的工作。

Rui*_*iro 5

作为 Debian 系统管理员,管理着数百个 Debian 虚拟机已经很长时间了,我可以向您保证发出 sysctl+kernel 设置来禁用 IPv6,这足以彻底消灭它。

在您的场景中,您的问题是编辑 不足以/etc/default/grub将参数应用于内核。

你还必须做:

sudo update-grub2
Run Code Online (Sandbox Code Playgroud)

然后重启,让内核参数禁用IPv6生效。

顺便说一句,您可以在运行时检查哪些参数传递给了内核:

$ cat /proc/cmdline 
BOOT_IMAGE=/boot/vmlinuz-4.10.5-antix.3-amd64-smp root=UUID=00c17984-859f-4197-8bd8-b346ddd092bd ro iommu=1 intel_iommu=on iommu=pt ipv6.disable=1 intremap=no_x2apic_optout radeon.modeset=0
Run Code Online (Sandbox Code Playgroud)

此外,正如 @schweik 正确指出的那样,在成功杀死 IPv6 后,您可能需要重新访问几个守护程序的配置,这些守护程序已编译/具有 IPv6 的特定配置。启动系统时,请注意与 IPv6 相关的错误消息和/或错误日志。

PS 另请注意,在 Arm 或 MIPS 架构中,您通常没有 grub,并且必须编辑不同的文件/etc/default/grub。不过,我假设如果您正在编辑它,那么您已经安装了 grub。