Ubuntu 不会处理 ipv4 DHCP(除非您明确指示),但会很乐意接受 ipv6 RA(除非您指示不要)。这让我有点奇怪。有没有办法将默认行为改为“除非我明确打开,否则不执行任何操作”?
(回答者请注意:我并不是想全局禁用 ipv6,或者完全关闭 autoconf。我只是想禁用 autoconf默认情况下(例如,除非我在 /etc/network/interfaces 中声明,否则我不想使用 ipv6,就像我不会直接获得 v4 地址,除非我明确启用了 dhcp)。发生的情况是,对于任何已启动的接口(例如具有 ipv4 配置),v6 地址往往也会出现在接口上,尽管我没有明确启用它。到目前为止的解决方案还不错,但如果我全局禁用 v6 或 autoconf,则无法使用 /etc/network/interfaces 中的简单命令在每个接口上重新启用 v6。我敢肯定,我这是在自找麻烦。)
答案1
Autoconf 是 IPv6 基本功能的一部分。RA 公告不是 DHCP,RA 服务器不分配地址。RA 更接近于在 169.254.0.0/16 IP 范围内进行的 IPv4 自动配置。如果启用了隐私,您的 IPv6 地址将随时间而变化。您的旧地址将被淘汰并最终被删除。
您可以使用以下命令轻松禁用 ipv6 autoconf:
sudo sysctl -w net.ipv6.conf.all.autoconf=0
替换all
为接口名称以禁用一个接口。替换autoconf
为disable_ipv6
以禁用 IPv6。创建一个文件,/etc/sysctl.d
其中包含要在启动期间应用设置的变量分配。
要查找所有与 ipv6 相关的设置,请运行以下命令:
sudo sysctl -a | grep ipv6 | less
答案2
检查 IPv6 是否已启用或禁用
$ cat /proc/sys/net/ipv6/conf/all/disable_ipv6
0 表示启用,1 表示禁用。
禁用 IPv6
$ su -
# nano /etc/sysctl.conf
并将这些行添加到 sysctl.conf 文件中
#disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
使用新配置保存 sysctl.conf 文件,然后重新启动系统
# reboot
再次检查您的系统
$ cat /proc/sys/net/ipv6/conf/all/disable_ipv6
现在您应该看到“1”,这意味着您的系统上已禁用 IPv6。
答案3
与其他答案类似但不同,我非常高兴地尝试了这个:
在 /etc/sysctl.d 中添加一个 sysctl 文件来禁用 ipv6 - 但不是普遍的,只是作为接口默认状态:
net.ipv6.conf.default.disable_ipv6=1
然后,在接口文件中,仅针对您希望使用 ipv6 的接口添加:
iface eth0 inet dhcp # .. or whatever
up sysctl -w net.ipv6.conf.$IFACE.disable_ipv6=0
... 因此,接口在启动时不会获得 IPv6 地址(目前如此),但可以在特定情况下被说服获得这些地址。如果您也想这样做,您无疑可以在启用 ipv6 之前禁用 RA。
注意:我怀疑您会遇到 VLAN 命名接口(例如 eth0.100)的问题,并且必须在“up”命令中将其拼写为“eth0/100”而不是$IFACE,因为后者的格式错误 - 我还没有测试过,但这似乎是 sysctl 看待世界的方式。