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

当 sysctl.conf 和 GRUB_CMDLINE_LINUX 不起作用时,如何在 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"

/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 的情况下手动重新编译内核。然而,这实在是太拼凑了,不可靠,而且需要做和维护的工作太多。

答案1

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

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

你还必须做:

sudo update-grub2

然后重启,让内核参数禁用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

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

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

答案2

您可能需要在以下所有配置文件中搜索 GRUB_CMDLINE_LINUX_DEFAULT/etc/默认值

在我安装的 Ubuntu 服务器 18.04.1 LTS 上,有一个/etc/默认/grub文件和/etc/default/grub.d/50-curtain-settings.cfg文件。后者覆盖了 GRUB_CMDLINE_LINUX_DEFAULT 变量,该变量使 ipv6 保持活动状态。

编辑后一个文件后,我运行了更新grub并重新启动。 IPv6 已成功禁用。

答案3

在使用例如专用网络时,IPv6 确实是非常无聊的协议。问题在于,该协议甚至在所有服务中都被强制使用,因此在纯 IPv4 网络中,它会因超时而降低速度。

如果您在/etc/sysctl.conf系统启动时或附近的其他位置禁用 IPv6,某些配置为使用 IPv6 的服务(有很多)可以再次启用它。在系统完全加载和配置后禁用 IPv6 可以更好地体现您的意愿。但如果您在此更改后更改您的网络连接(例如从 wifi 更改为有线),IPv6 可能会再次出现。可疑的服务是 NetworkManager,因此我停止该服务(主要在服务器上)或禁用它(您还可以将每个连接配置为忽略 IPv6 - 我没有找到全局禁用该服务)。还有其他配置也需要禁用 IPv6:在/etc/ssh/sshd_config添加行中AddressFamily inet,注释所有带有 IPv6 的行/etc/hosts,在中/etc/samba/smb.conf明确指定 IPv4 地址(接口 = 192.168.43.11)而不是接口名称或域名。等等。如果要求使用 DHCP 地址:dhclient -4 eth0,什么会强制 IPv4 请求甚至 IPv6 自分配。

netstat -lptun好的做法是使用(或)查看侦听端口ss -lptun,并查阅使用 IPv6 地址的进程的手册页如何禁用它。在某些情况下你无法获胜(例如 dns-server 总是监听 IPv6),但通常你可以找到方法。

100% 的方法可能是在没有 IPv6 的情况下重新编译内核,但是您可能会面临某些应用程序在重新编译之前拒绝启动的风险。

祝你好运

相关内容