如何在Windows子系统中禁用IPv6?

我尝试通过在/etc/sysctl.conf中添加来禁用IPv6。
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

然后运行sudo sysctl -p重新加载/etc/sysctl.conf的设置-但是出现了错误:
sysctl: cannot stat /proc/sys/net/ipv6/conf/all/disable_ipv6: No such file or directory

我试图通过更改 grub 配置文件 `/etc/default/grub.d/50-cloudimg-settings.cfg` 来禁用它:
GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 console=tty1 console=ttyS0"

然后运行sudo update-grub,但是没有安装update-grub。
sudo: update-grub: command not found

所以我不确定是否可以更新grub,但是事实上有一个特定的配置文件在那里,这让我觉得可能是可以的。
WSL版本:
Description:    Ubuntu 16.04.2 LTS
Release:        16.04
Codename:       xenial

update-grub命令位于grub2-common软件包中,通常我会对/etc/default/grub进行更改。在纯净的Ubuntu安装中,我似乎没有你指定的grub目录。 - Charles Green
2没有必要使用GRUB或进行核心网络相关的更改 - 启动和网络都由Windows控制。至于配置文件,它应该是存在的;这些文件来自WSL使用的未修改的Ubuntu软件包。 - muru
回应@muru所说,使用grub进行双系统启动已经没有意义了。事实上,你可以同时使用Windows、Ubuntu、Suse和Fedora,而且硬盘和内存要求都很低,因为不需要虚拟机。从历史上来看,你可能会在Windows上“bash”,但现在你可以直接在Windows上运行“bash”。 - WinEunuuchs2Unix
当我运行sudo sysctl -p时,我也遇到了cannot stat错误,但它似乎仍然起作用。至少,apt不再抛出IPv6错误。 编辑:是的,有时候还是会出现这个问题。我还在寻找一个可靠的解决方法。 - Jacktose
@muru 你可以将这个作为答案吗?这个问题被标记为“不在话题范围内”,但如果答案是“不可能的”,那么它实际上并不属于不在话题范围内。 - wjandrea
3个回答

不要完全禁用IPv6,您可以通过编辑/etc/gai.conf中的优先级块来指示Ubuntu 更喜欢IPv4连接而不是IPv6连接

使用此解决方案:

  • 您可以通过NAT或仅了解IPv4的路由器访问Internet上的IPv4和IPv6服务器
  • 在本地网络中使用IPv4和IPv6
  • 避免错误,例如从rubygems.org安装gem文件

更喜欢IPv4地址而非IPv6地址

通过修改gai.conf中的优先级,每当程序调用getaddrinfo()来解析主机名时,Linux将更倾向于使用IPv4地址。这在你尝试从位于NAT或路由器后面的计算机与同时具有IPv4和IPv6地址的服务器进行通信时非常有用。此外,你也可以在本地使用IPv6。

  1. 编辑/etc/gai.conf
$ sudo vi /etc/gai.conf

取消注释最后几行。检查文件是否有下一行没有被注释的内容。
#For sites which prefer IPv4 connections change the last line to
precedence ::ffff:0:0/96 100
...
#    For sites which use site-local IPv4 addresses behind NAT there is
#    the problem that even if IPv4 addresses are preferred they do not
#    have the same scope and are therefore not sorted first.  To change
#    this use only these rules:
#
scopev4 ::ffff:169.254.0.0/112  2
scopev4 ::ffff:127.0.0.0/104    2
scopev4 ::ffff:0.0.0.0/96       14

太神奇了,我甚至不知道这个文件的存在!“gai”代表什么? - Stéphane
1@Stéphane 获取地址信息 - Yvon
这解决了一个在node.js应用中的网络错误UND_ERR_CONNECT_TIMEOUT。 谢谢! - undefined

我在Windows网络适配器属性中禁用了IPv6,这样问题就解决了。我的Ubuntu子系统开始使用IPv4。
  1. 控制面板 > 网络和共享中心 > 更改适配器设置
    或者 Win+R ncpa.cpl 回车
  2. 在适配器上(例如 以太网),右键点击 > 属性
    或者双击 > 属性
    或者 Alt+Enter
    或者 更改此连接的设置
  3. 取消选中 Internet Protocol Version 6 (TCP/IPv6)
  4. 确定
  5. 根据需要为其他适配器(如WiFi)重复步骤

请注意,这将禁用Windows的所有IPv6功能(使用该适配器时),而不仅仅是WSL。


你能提供如何禁用IPv6的指导吗? - stumblebee
1@stumblebee 已添加说明。 不过,如果能够仅在WSL中完成这个任务,那就太好了。 - Jacktose
1我在Windows上禁用了IPv6,因为我的ISP没有提供IPv6,但是WSL仍然有一个inet6(IPv6)的环回接口,我相信这正阻止了某些域名无法正确解析。在WSL中,除非我使用curlwget命令的-4标志,否则无法解析sh.rustup.rsstatic.rust-lang.org(用于安装Rust构建工具)的URL。 - apokaliptis
每次运行WSL时,Windows中的某个东西都会自动启用它。 - TracKer
这个修复了在WSL2下的npm install问题 - https://stackoverflow.com/a/72564257/555451 - Stuart Cardall

如果您正在使用WSL2,您可以选择构建自己的内核,并且不支持IPv6,这是一个非常强大的选项。WSL2内核的源代码以及构建指南都可以在GitHub上找到(点击此处)。
为了节省您的时间,以下是构建指南:
sudo apt install build-essential flex bison libssl-dev libelf-dev git dwarves python3 bc

git clone https://github.com/microsoft/WSL2-Linux-Kernel.git

cd WSL2-Linux-Kernel/

cp Microsoft/config-wsl .config

现在打开.config文件,找到CONFIG_IPV6=y这一行,并将y改为n
构建你的内核:
make -j $(nproc)

要安装您的内核,您需要将其复制到WSL2虚拟机之外的目录中,然后在Windows主目录中创建名为.wslconfig的文件,并填入以下内容:
[wsl2]
kernel=C:\\Path\\to\\your\\kernel

请注意双反斜杠。显然,您需要用实际路径替换上面的占位符。