17

I tried to disable IPv6 by adding in /etc/sysctl.conf:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

and then running sudo sysctl -p to reload the /etc/sysctl.conf settings - but that threw the error:

sysctl: cannot stat /proc/sys/net/ipv6/conf/all/disable_ipv6: No such file or directory

I tried to also disable it by changing grub configuration /etc/default/grub.d/50-cloudimg-settings.cfg to:

GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 console=tty1 console=ttyS0"

and then run sudo update-grub but there is no update-grub installed:

sudo: update-grub: command not found

So I am not sure if it is even possible to update grub, but the fact there is a specific configuration located there makes me thing there is.

WSL version:

Description:    Ubuntu 16.04.2 LTS
Release:        16.04
Codename:       xenial

4 Answers4

18

Instead of disabling IPv6 completely, you can instruct Ubuntu to prefer IPv4 connections to IPv6 by editing the precedence blocks in /etc/gai.conf.

Using this solution:

  • You may access servers in Internet with IPv4 an IPv6 servers through a NAT or a router that only understand IPv4
  • Use IPv4 and IPv6 in the local network
  • Avoid errors, for instance, installing gem files from rubygems.org

Preferring IPv4 over IPV6 addresses

Modifying the precedences in the gai.conf, every time a program calls getaddrinfo() for resolving host names, Linux will prefer the IPv4 addreses. This is very useful when you try to contact a server with both IPv4 and IPv6 addresses from a machine behind a NAT or a router. In addition, you may use IPv6 locally.

  1. Edit the /etc/gai.conf
$ sudo vi /etc/gai.conf
  1. Uncomment the last lines. Check that file has the next uncommented lines.
#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
Jaime
  • 1,440
6

I disabled IPv6 in the Windows network adapter properties and that took care of the problem for me. My Ubuntu subsytem started using IPv4 instead.

  1. Control Panel > Network and Sharing Center > Change adapter settings
    or Win+R ncpa.cpl Enter
  2. On your adapter (e.g. Ethernet), right-click > Properties
    or double-click > Properties
    or Alt+Enter
    or Change settings of this connection
  3. Uncheck Internet Protocol Version 6 (TCP/IPv6)
  4. OK
  5. Repeat as necessary for other adapters, like WiFi

Note that this will disable IPv6 for all of Windows (when using that adapter), not just WSL.

Jacktose
  • 1,029
Travis
  • 61
2

Pretty old question but I believe we have a configuration option by WSL already. Just updating .wslconfig:

[wsl2]
kernelCommandLine=ipv6.disable=1
HaiTH
  • 121
0

If you are using WSL2 you have the thermonuclear option of building your own kernel without IPv6 support. The source code of WSL2 kernel as well as the instructions for building it are available on GitHub.

To save you some time here are the instructions:

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

now open .config, find line CONFIG_IPV6=y and change y to n.

build your kernel:

make -j $(nproc)

to install your kernel you'll need copy it to a directory outside of your WSL2 VM and then create file .wslconfig in your Windows home directory with the following contents:

[wsl2]
kernel=C:\\Path\\to\\your\\kernel

Mind the double backslashes. Obviously you'll need to replace the placeholder above with the actual path.