如果运行 ifconfig,我可以看到没有为任何接口分配 ipv6 地址。如果我尝试创建 AF_INET6 套接字,则会收到一条错误消息,指出不支持该地址族。我没有/proc/sys/net/inet6文件夹。该机器运行 Debian 10 (buster)。在/etc/默认/grub没有关于禁用 ipv6 的行。
$ uname -r
4.19.52.1.amd64-smp
请您告诉我如何启用 ipv6?我找到了很多关于如何禁用它的文章,但没有找到如何启用它。
答案1
在 Linux 中禁用 IPv6 的方法有很多种,因此您必须检查所有这些方法。
首先,您的内核版本不太像 Debian 10 标准 AMD64 内核。如果您使用自定义内核,则 IPv6 可能会在内核编译时被禁用,在这种情况下,您需要重新编译内核(或切换到另一个内核)才能启用它。
请跑
grep CONFIG_IPV6= /boot/config-$(uname -r)
看看它说了什么。或者,如果该/boot/config-<kernel version>
文件不存在,请改为运行以下命令:
modprobe configs; zcat /proc/config.gz | grep CONFIG_IPV6=
如果响应什么也没有,或者包含一行:
# CONFIG_IPV6 is not set
那么您当前的内核在编译时禁用了 IPv6 支持。在这种情况下,您必须安装新的内核包(或构建并安装自定义内核)才能启用 IPv6。
如果响应包含一行:
CONFIG_IPV6=m
然后 IPv6 支持被编译为内核模块。
如果有一行:
CONFIG_IPV6=y
然后 IPv6 支持被编译到主内核中。在这种情况下,禁用 IPv6 的一种方法是将引导选项添加ipv6.disable=1
到内核命令行(/etc/default/grub
如果使用 GRUB 引导加载程序,或者在/boot/cmdline.txt
Raspberry Pi 引导加载程序中),但您说您已经检查过这一点。
IPv6 编译为模块
请modprobe -c |grep "options ipv6"
以 root 身份运行。如果响应包含一行:
options ipv6 disable=1
或者
options ipv6 disable_ipv6=1
那么 IPv6 被内核模块配置禁用,您应该在/etc/modprobe.d
.
要在这种情况下重新启用 IPv6,请找到该行,将其注释掉,然后update-initramfs -u
以 root 身份运行,以确保 IPv6 不会在早期启动时被禁用,因为此禁用策略可能需要重新启动才能重新启用。
(理论上,ipv6
在注释掉禁用选项后卸载并重新加载就足够了,但由于模块之间的依赖关系,如果不重新启动,实际上可能很难做到这一点。)
适用于模块化和编译 IPv6 的方法
您还应该检查 sysctl 设置:
grep "disable_ipv6" /etc/sysctl.conf /etc/sysctl.d/*.conf
如果输出包含类似这样的行,则 IPv6 已通过 sysctl 设置禁用:
net.ipv6.conf.<something>.disable_ipv6 = 1
这里,<something>
可能是单词all
或default
,或者特定网络接口的名称。要重新启用,请注释掉这些disable_ipv6
行并以 root 身份运行sysctl -p
,然后重新启动(或只是重新配置您的网络接口)。