I looked into the code to figure out where the IPv6 configuration is copied from for a new namespace.
I came across this function addrconf_init_net. I assume this is the
function that is invoked when a new namespace is created.
Inside this function, I came across this code,
if (IS_ENABLED <
https://elixir.bootlin.com/linux/latest/C/ident/IS_ENABLED>(CONFIG_SYSCTL <
https://elixir.bootlin.com/linux/latest/K/ident/CONFIG_SYSCTL>) &&
!net_eq <
https://elixir.bootlin.com/linux/latest/C/ident/net_eq>(net,
&init_net <
https://elixir.bootlin.com/linux/latest/C/ident/init_net>))
{
switch <
https://elixir.bootlin.com/linux/latest/C/ident/switch> (sysctl_devconf_inherit_init_net <
https://elixir.bootlin.com/linux/latest/C/ident/sysctl_devconf_inherit_init_net>)
{
case 1: /* copy from init_net */
memcpy <
https://elixir.bootlin.com/linux/latest/C/ident/memcpy>(all
<
https://elixir.bootlin.com/linux/latest/C/ident/all>, init_net <
https://elixir.bootlin.com/linux/latest/C/ident/init_net>.ipv6 <
https://elixir.bootlin.com/linux/latest/C/ident/ipv6>.devconf_all <
https://elixir.bootlin.com/linux/latest/C/ident/devconf_all>,
sizeof(ipv6_devconf <
https://elixir.bootlin.com/linux/latest/C/ident/ipv6_devconf>));
memcpy <
https://elixir.bootlin.com/linux/latest/C/ident/memcpy>(dflt
<
https://elixir.bootlin.com/linux/latest/C/ident/dflt>, init_net <
https://elixir.bootlin.com/linux/latest/C/ident/init_net>.ipv6 <
https://elixir.bootlin.com/linux/latest/C/ident/ipv6>.devconf_dflt <
https://elixir.bootlin.com/linux/latest/C/ident/devconf_dflt>,
sizeof(ipv6_devconf_dflt <
https://elixir.bootlin.com/linux/latest/C/ident/ipv6_devconf_dflt>));
break <
https://elixir.bootlin.com/linux/latest/C/ident/break>;
case 3: /* copy from the current netns */
memcpy <
https://elixir.bootlin.com/linux/latest/C/ident/memcpy>(all
<
https://elixir.bootlin.com/linux/latest/C/ident/all>, current <
https://elixir.bootlin.com/linux/latest/C/ident/current>->nsproxy <
https://elixir.bootlin.com/linux/latest/C/ident/nsproxy>->net_ns <
https://elixir.bootlin.com/linux/latest/C/ident/net_ns>->ipv6 <
https://elixir.bootlin.com/linux/latest/C/ident/ipv6>.devconf_all <
https://elixir.bootlin.com/linux/latest/C/ident/devconf_all>,
sizeof(ipv6_devconf <
https://elixir.bootlin.com/linux/latest/C/ident/ipv6_devconf>));
memcpy <
https://elixir.bootlin.com/linux/latest/C/ident/memcpy>(dflt
<
https://elixir.bootlin.com/linux/latest/C/ident/dflt>,
current <
https://elixir.bootlin.com/linux/latest/C/ident/current>->nsproxy <
https://elixir.bootlin.com/linux/latest/C/ident/nsproxy>->net_ns <
https://elixir.bootlin.com/linux/latest/C/ident/net_ns>->ipv6 <
https://elixir.bootlin.com/linux/latest/C/ident/ipv6>.devconf_dflt <
https://elixir.bootlin.com/linux/latest/C/ident/devconf_dflt>,
sizeof(ipv6_devconf_dflt <
https://elixir.bootlin.com/linux/latest/C/ident/ipv6_devconf_dflt>));
break <
https://elixir.bootlin.com/linux/latest/C/ident/break>;
case 0:
case 2:
/* use compiled values */
break <
https://elixir.bootlin.com/linux/latest/C/ident/break>;
}
}
If I set the value of net.core.devconf_inherit_init_net to 1, when a
new namespace is created the values in init_net(which again I assume
is init process' namespace value - global/default namespace)
will be copied into the new namespace. A few lines later, the
following code is present.
dflt <
https://elixir.bootlin.com/linux/latest/C/ident/dflt>->disable_ipv6 <
https://elixir.bootlin.com/linux/latest/C/ident/disable_ipv6> =
ipv6_defaults <
https://elixir.bootlin.com/linux/latest/C/ident/ipv6_defaults>.disable_ipv6
<
https://elixir.bootlin.com/linux/latest/C/ident/disable_ipv6>;
<<<<< This ipv6_defaults.disable_ipv6 comes from the GRUB command line
value of disable_ipv6.
Hence if I enable IPv6 before creating a new namespace, the new
namespace still will have IPv6 disabled, because of the above single
line of code. Is this correct?
net.ipv6.conf.all.disable_ipv6 is used to change the IPv6 state for
all the currently available interfaces.
net.ipv6.conf.default.disable_ipv6 has the default value from ipv6_defaults.disable_ipv6 i.e. the grub one. If I change this sysctl,
what impact does it have?
Dheeraj
On Tue, Jun 7, 2022 at 4:25 PM Dheeraj Kandula <
[email protected]> wrote:
Thanks a lot Bjorn for pointing this out. I now have IPv6 disabled by
default in newly created namespaces too.
However, when I enable IPv6 globally it is not enabled inside the already created namespaces. Maybe it has to be done explicitly. I will see if this behavior is acceptable.
Thanks a lot Bjorn. I really appreciate your time and patience.
Thanks, Marc too for taking the time to respond to my emails.
Dheeraj
On Tue, Jun 7, 2022 at 4:05 PM Bjørn Mork <[email protected]> wrote:
Dheeraj Kandula <[email protected]> writes:
Thanks Bjørn for the reply. But with the grub command line, IPv6 option >> is
not available i.e.* net.ipv6.conf.all.disable_ipv6* i.e. net.ipv6
itself is
not available.
$ sudo sysctl net.ipv6
sysctl: cannot stat /proc/sys/net/ipv6: No such file or directory
Huh? Did you set ipv6.disable instead og ipv6.disable_ipv6? Those are
very different, as documented in the module:
bjorn@miraculix:~$ modinfo ipv6
name: ipv6
filename: (builtin)
alias: net-pf-10
license: GPL
file: net/ipv6/ipv6
description: IPv6 protocol stack for Linux
author: Cast of dozens
parm: disable:Disable IPv6 module such that it is
non-functional (int)
parm: disable_ipv6:Disable IPv6 on all interfaces (int)
parm: autoconf:Enable IPv6 address autoconfiguration on all
interfaces (int)
Bjørn
<div dir="ltr"><div>I looked into the code to figure out where the IPv6 configuration is copied from for a new namespace.<br></div><div><br></div><div>I came across this function addrconf_init_net. I assume this is the function that is invoked when a new
namespace is created.</div><div><br></div><div>Inside this function, I came across this code, <br></div><div><br></div><div><pre> <span class="gmail-k">if</span> <span class="gmail-p">(</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/
linux/latest/C/ident/IS_ENABLED">IS_ENABLED</a></span><span class="gmail-p">(</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/K/ident/CONFIG_SYSCTL">CONFIG_SYSCTL</a></span><span class="gmail-p">)</span> <span class="gmail-o">
&&</span>
<span class="gmail-o">!</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/net_eq">net_eq</a></span><span class="gmail-p">(</span><span class="gmail-n">net</span><span class="gmail-p">,</span> <span class="gmail-o">&
amp;</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/init_net">init_net</a></span><span class="gmail-p">))</span> <span class="gmail-p">{</span>
<span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/switch">switch</a></span> <span class="gmail-p">(</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/sysctl_devconf_inherit_init_net">
sysctl_devconf_inherit_init_net</a></span><span class="gmail-p">)</span> <span class="gmail-p">{</span>
<span class="gmail-k">case</span> <span class="gmail-mi">1</span><span class="gmail-o">:</span> <span class="gmail-cm">/* copy from init_net */</span>
<span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/memcpy">memcpy</a></span><span class="gmail-p">(</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/all">all</a></span><span class="gmail-
p">,</span> <span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/init_net">init_net</a></span><span class="gmail-p">.</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/ipv6">ipv6</a></span><
span class="gmail-p">.</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/devconf_all">devconf_all</a></span><span class="gmail-p">,</span>
<span class="gmail-k">sizeof</span><span class="gmail-p">(</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/ipv6_devconf">ipv6_devconf</a></span><span class="gmail-p">));</span>
<span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/memcpy">memcpy</a></span><span class="gmail-p">(</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/dflt">dflt</a></span><span class="
gmail-p">,</span> <span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/init_net">init_net</a></span><span class="gmail-p">.</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/ipv6">ipv6</a></
span><span class="gmail-p">.</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/devconf_dflt">devconf_dflt</a></span><span class="gmail-p">,</span>
<span class="gmail-k">sizeof</span><span class="gmail-p">(</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/ipv6_devconf_dflt">ipv6_devconf_dflt</a></span><span class="gmail-p">));</span>
<span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/break">break</a></span><span class="gmail-p">;</span>
<span class="gmail-k">case</span> <span class="gmail-mi">3</span><span class="gmail-o">:</span> <span class="gmail-cm">/* copy from the current netns */</span>
<span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/memcpy">memcpy</a></span><span class="gmail-p">(</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/all">all</a></span><span class="gmail-
p">,</span> <span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/current">current</a></span><span class="gmail-o">-></span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/nsproxy">nsproxy</a></
span><span class="gmail-o">-></span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/net_ns">net_ns</a></span><span class="gmail-o">-></span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/
ident/ipv6">ipv6</a></span><span class="gmail-p">.</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/devconf_all">devconf_all</a></span><span class="gmail-p">,</span>
<span class="gmail-k">sizeof</span><span class="gmail-p">(</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/ipv6_devconf">ipv6_devconf</a></span><span class="gmail-p">));</span>
<span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/memcpy">memcpy</a></span><span class="gmail-p">(</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/dflt">dflt</a></span><span class="
gmail-p">,</span>
<span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/current">current</a></span><span class="gmail-o">-></span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/nsproxy">nsproxy</a></
span><span class="gmail-o">-></span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/net_ns">net_ns</a></span><span class="gmail-o">-></span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/
ident/ipv6">ipv6</a></span><span class="gmail-p">.</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/devconf_dflt">devconf_dflt</a></span><span class="gmail-p">,</span>
<span class="gmail-k">sizeof</span><span class="gmail-p">(</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/ipv6_devconf_dflt">ipv6_devconf_dflt</a></span><span class="gmail-p">));</span>
<span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/break">break</a></span><span class="gmail-p">;</span>
<span class="gmail-k">case</span> <span class="gmail-mi">0</span><span class="gmail-o">:</span>
<span class="gmail-k">case</span> <span class="gmail-mi">2</span><span class="gmail-o">:</span>
<span class="gmail-cm">/* use compiled values */</span>
<span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/break">break</a></span><span class="gmail-p">;</span>
<span class="gmail-p">}</span>
<span class="gmail-p">}<br><br></span></pre><pre><span class="gmail-p">If I set the value of net.core.devconf_inherit_init_net to 1, when a new namespace is created the values in init_net(which again I assume is init process' namespace value -
global/default namespace)<br></span></pre><pre><span class="gmail-p">will be copied into the new namespace. A few lines later, the following code is present.<br><br><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/dflt">dflt<
</span><span class="gmail-o">-></span><span class="gmail-n"><a href="https://elixir.bootlin.com/linux/latest/C/ident/disable_ipv6">disable_ipv6</a></span> <span class="gmail-o">=</span> <span class="gmail-n"><a href="https://elixir.bootlin.com/
linux/latest/C/ident/ipv6_defaults">ipv6_defaults</a></span><span class="gmail-p">.</span><span class="gmail-n"><a href="
https://elixir.bootlin.com/linux/latest/C/ident/disable_ipv6">disable_ipv6</a></span><span class="gmail-p">; <<<<<
This ipv6_defaults.disable_ipv6 comes from the GRUB command line value of disable_ipv6.</span>
<br></span></pre><pre><span class="gmail-p">Hence if I enable IPv6 before creating a new namespace, the new namespace still will have IPv6 disabled, because of the above single line of code. Is this correct?<br><br><br></span></pre><pre><span class="
gmail-p">net.ipv6.conf.all.disable_ipv6 is used to change the IPv6 state for all the currently available interfaces.<br></span></pre><pre><span class="gmail-p">net.ipv6.conf.default.disable_ipv6 has the default value from ipv6_defaults.disable_ipv6 i.e.
the grub one. If I change this sysctl, what impact does it have?<br></span></pre><pre><span class="gmail-p"><br></span></pre><pre><span class="gmail-p">Dheeraj<br></span></pre></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On
Tue, Jun 7, 2022 at 4:25 PM Dheeraj Kandula <<a href="mailto:
[email protected]">
[email protected]</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div
dir="ltr"><div>Thanks a lot Bjorn for pointing this out. I now have IPv6 disabled by default in newly created namespaces too.<br></div><div><br></div><div>However, when I enable IPv6 globally it is not enabled inside the already created namespaces. Maybe
it has to be done explicitly. I will see if this behavior is acceptable. <br></div><div><br></div><div>Thanks a lot Bjorn. I really appreciate your time and patience. <br></div><div><br></div><div>Thanks, Marc too for taking the time to respond to my
emails.<br></div><div><br></div><div>Dheeraj<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jun 7, 2022 at 4:05 PM Bjørn Mork <<a href="mailto:
[email protected]" target="_blank">
[email protected]</a>> wrote:<br></div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Dheeraj Kandula <<a href="mailto:
[email protected]" target="_blank">
[email protected]</a>> writes:<br>
> Thanks Bjørn for the reply. But with the grub command line, IPv6 option is<br>
> not available i.e.* net.ipv6.conf.all.disable_ipv6* i.e. net.ipv6 itself is<br>
> not available.<br>
><br>
> $ sudo sysctl net.ipv6<br>
> sysctl: cannot stat /proc/sys/net/ipv6: No such file or directory<br>
Huh? Did you set ipv6.disable instead og ipv6.disable_ipv6? Those are<br> very different, as documented in the module:<br>
bjorn@miraculix:~$ modinfo ipv6<br>
name: ipv6<br>
filename: (builtin)<br>
alias: net-pf-10<br>
license: GPL<br>
file: net/ipv6/ipv6<br>
description: IPv6 protocol stack for Linux<br>
author: Cast of dozens<br>
parm: disable:Disable IPv6 module such that it is non-functional (int)<br>
parm: disable_ipv6:Disable IPv6 on all interfaces (int)<br> parm: autoconf:Enable IPv6 address autoconfiguration on all interfaces (int)<br>
Bjørn<br>
</blockquote></div>
</blockquote></div>
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)