From: Nicolas Dichtel <hidden> Date: 2014-09-23 13:26:43
The goal of this serie is to be able to multicast netlink messages with an
attribute that identify a peer netns.
This is needed by the userland to interpret some informations contained in
netlink messages (like IFLA_LINK value, but also some other attributes in case
of x-netns netdevice (see also
http://thread.gmane.org/gmane.linux.network/315933/focus=316064 and
http://thread.gmane.org/gmane.linux.kernel.containers/28301/focus=4239)).
Ids are stored in the parent user namespace. These ids are valid only inside
this user namespace. The user can retrieve these ids via a new netlink messages,
but only if peer netns are in the same user namespace.
Patch 1/5 and 2/5 introduce the netlink API mechanism to exports these ids to
the userland.
Patch 3/5 and 4/5 shows an example of how to use these ids in rtnetlink
messages. And patch 5/5 shows that the netlink messages can be symetric between
a GET and a SET.
iproute2 patches are available, I can send them on demand.
Here is a small screenshot to show how it can be used by userland:
$ ip netns add foo
$ ip netns del foo
$ ip netns
$ touch /var/run/netns/init_net
$ mount --bind /proc/1/ns/net /var/run/netns/init_net
$ ip netns add foo
$ ip netns
foo (id: 3)
init_net (id: 1)
$ ip netns exec foo ip netns
foo (id: 3)
init_net (id: 1)
$ ip netns exec foo ip link add ipip1 link-netnsid 1 type ipip remote 10.16.0.121 local 10.16.0.249
$ ip netns exec foo ip l ls ipip1
6: ipip1@NONE: <POINTOPOINT,NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default
link/ipip 10.16.0.249 peer 10.16.0.121 link-netnsid 1
The parameter link-netnsid shows us where the interface sends and receives
packets (and thus we know where encapsulated addresses are set).
RFCv1 -> RFCv2:
remove useless ()
ids are now stored in the user ns. It's possible to get an id for a peer netns
only if the current netns and the peer netns have the same user ns parent.
MAINTAINERS | 1 +
include/linux/user_namespace.h | 4 ++
include/net/ip_tunnels.h | 1 +
include/net/net_namespace.h | 12 +++++
include/net/rtnetlink.h | 2 +
include/uapi/linux/Kbuild | 1 +
include/uapi/linux/if_link.h | 1 +
include/uapi/linux/netns.h | 29 ++++++++++
kernel/user_namespace.c | 6 +++
net/core/net_namespace.c | 119 ++++++++++++++++++++++++++++++++++++++++-
net/core/rtnetlink.c | 47 ++++++++++++++--
net/ipv4/ip_gre.c | 2 +
net/ipv4/ip_tunnel.c | 8 +++
net/ipv4/ip_vti.c | 1 +
net/ipv4/ipip.c | 1 +
net/ipv6/sit.c | 1 +
net/netlink/genetlink.c | 4 ++
17 files changed, 236 insertions(+), 4 deletions(-)
Comments are welcome.
Regards,
Nicolas
From: Nicolas Dichtel <hidden> Date: 2014-09-23 13:26:41
This patch adds the ability to create a netdevice in a specified netns and
then move it into the final netns. In fact, it allows to have a symetry between
get and set rtnl messages.
Signed-off-by: Nicolas Dichtel <redacted>
---
net/core/rtnetlink.c | 25 ++++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)
From: Nicolas Dichtel <hidden> Date: 2014-09-23 13:26:45
This patch allows a user to get an id of a peer netns. It will be usefull for
userland to be able to associate a netns file descriptor with a netns id.
Note: to be able to got an id, both netns should be in the same user ns.
Signed-off-by: Nicolas Dichtel <redacted>
---
MAINTAINERS | 1 +
include/net/net_namespace.h | 1 +
include/uapi/linux/Kbuild | 1 +
include/uapi/linux/netns.h | 29 +++++++++++++
net/core/net_namespace.c | 99 +++++++++++++++++++++++++++++++++++++++++++++
net/netlink/genetlink.c | 4 ++
6 files changed, 135 insertions(+)
create mode 100644 include/uapi/linux/netns.h
@@ -299,6 +299,7 @@ static inline int peernet2id(struct net *net, struct net *peer)}structnet*get_net_from_netnsid(structnet*net,intid);+intnetns_genl_register(void);structpernet_operations{structlist_headlist;
From: Nicolas Dichtel <hidden> Date: 2014-09-23 13:26:46
This patch adds a new attribute (IFLA_LINK_NETNSID) which contains the 'link'
netns id when this netns is different from the netns where the interface
stands (for example for x-net interfaces like ip tunnels). When there is no id,
because user ns of link netns and interface netns is not the same, we put 0
into this attribute (id 0 is not valid) to indicate to userland that the link
netns is different from the interface netns. Hence, userland knows that some
information like IFLA_LINK are not interpretable.
Signed-off-by: Nicolas Dichtel <redacted>
---
include/net/rtnetlink.h | 2 ++
include/uapi/linux/if_link.h | 1 +
net/core/rtnetlink.c | 22 ++++++++++++++++++++++
3 files changed, 25 insertions(+)
@@ -1134,6 +1135,27 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,gotonla_put_failure;}+if(dev->rtnl_link_ops&&+dev->rtnl_link_ops->get_link_net){+structnet*link_net=dev->rtnl_link_ops->get_link_net(dev);++if(!net_eq(dev_net(dev),link_net)){+intid=peernet2id(dev_net(dev),link_net);++/* If the link netns is not in the same user ns, put id+*0inIFLA_LINK_NETNSIDtoindicatetouserlandthat+*thelinknetnsisnotthecurrentnetns,butthatit+*don'thaveaccesstoit.+*/+if(id==-EPERM)+id=0;++if(id>=0&&+nla_put_u32(skb,IFLA_LINK_NETNSID,id))+gotonla_put_failure;+}+}+if(!(af_spec=nla_nest_start(skb,IFLA_AF_SPEC)))gotonla_put_failure;
From: Nicolas Dichtel <hidden> Date: 2014-09-23 13:31:43
With this patch, an id is allocated for each netns. Id database is stored in the
user namespace. It's allowed to get an id of a peer netns only if they share the
same user ns.
Signed-off-by: Nicolas Dichtel <redacted>
---
include/linux/user_namespace.h | 4 ++++
include/net/net_namespace.h | 11 +++++++++++
kernel/user_namespace.c | 6 ++++++
net/core/net_namespace.c | 20 +++++++++++++++++++-
4 files changed, 40 insertions(+), 1 deletion(-)
@@ -59,6 +59,7 @@ struct net {structlist_headexit_list;/* Use only net_mutex */structuser_namespace*user_ns;/* Owning user namespace */+intnetnsid;unsignedintproc_inum;
@@ -289,6 +290,16 @@ static inline struct net *read_pnet(struct net * const *pnet)#define __net_initconst __initconst#endif+staticinlineintpeernet2id(structnet*net,structnet*peer)+{+if(net->user_ns!=peer->user_ns)+return-EPERM;++returnpeer->netnsid;+}++structnet*get_net_from_netnsid(structnet*net,intid);+structpernet_operations{structlist_headlist;int(*init)(structnet*net);
@@ -151,13 +164,16 @@ static __net_init int setup_net(struct net *net, struct user_namespace *user_ns){/* Must be called with net_mutex held */conststructpernet_operations*ops,*saved_ops;-interror=0;+interror=0,id;LIST_HEAD(net_exit_list);atomic_set(&net->count,1);atomic_set(&net->passive,1);net->dev_base_seq=1;net->user_ns=user_ns;+id=idr_alloc_cyclic(&user_ns->netns_ids,net,1,0,GFP_KERNEL);+if(id>0)+net->netnsid=id;#ifdef NETNS_REFCNT_DEBUGatomic_set(&net->use_count,0);
From: Cong Wang <hidden> Date: 2014-09-23 19:22:06
On Tue, Sep 23, 2014 at 6:20 AM, Nicolas Dichtel
[off-list ref] wrote:
Here is a small screenshot to show how it can be used by userland:
$ ip netns add foo
$ ip netns del foo
$ ip netns
$ touch /var/run/netns/init_net
$ mount --bind /proc/1/ns/net /var/run/netns/init_net
$ ip netns add foo
$ ip netns
foo (id: 3)
init_net (id: 1)
$ ip netns exec foo ip netns
foo (id: 3)
init_net (id: 1)
$ ip netns exec foo ip link add ipip1 link-netnsid 1 type ipip remote 10.16.0.121 local 10.16.0.249
$ ip netns exec foo ip l ls ipip1
6: ipip1@NONE: <POINTOPOINT,NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default
link/ipip 10.16.0.249 peer 10.16.0.121 link-netnsid 1
The parameter link-netnsid shows us where the interface sends and receives
packets (and thus we know where encapsulated addresses are set).
So ipip1 is shown in netns foo but functioning in netns init_net? Getting the
id of init_net in foo depends on your mount namespace, /var/run/netns/ may
not visible inside foo, in this case, link-netnsid is meaningless. It
is not your
fault, network namespace already heavily relies on mount namespace (sysfs
needs to be remount otherwise you can not create device with the same name.)
On the other hand, what's the problem you are trying to solve? AFAIK,
the ifindex
issue is purely in output, IOW, the device still functions correctly
even through
its link ifindex is not correct after moving to another namespace. If
not, it is bug
we need to fix.
From: Andy Lutomirski <luto@amacapital.net> Date: 2014-09-23 19:27:01
On Tue, Sep 23, 2014 at 6:20 AM, Nicolas Dichtel
[off-list ref] wrote:
The goal of this serie is to be able to multicast netlink messages with an
attribute that identify a peer netns.
This is needed by the userland to interpret some informations contained in
netlink messages (like IFLA_LINK value, but also some other attributes in case
of x-netns netdevice (see also
http://thread.gmane.org/gmane.linux.network/315933/focus=316064 and
http://thread.gmane.org/gmane.linux.kernel.containers/28301/focus=4239)).
Ids are stored in the parent user namespace. These ids are valid only inside
this user namespace. The user can retrieve these ids via a new netlink messages,
but only if peer netns are in the same user namespace.
What about the parent / ancestors of the owning userns? Can processes
in those usernses see any form of netns id?
--Andy
From: Nicolas Dichtel <hidden> Date: 2014-09-24 09:23:27
Le 23/09/2014 21:22, Cong Wang a écrit :
On Tue, Sep 23, 2014 at 6:20 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
Here is a small screenshot to show how it can be used by userland:
$ ip netns add foo
$ ip netns del foo
$ ip netns
$ touch /var/run/netns/init_net
$ mount --bind /proc/1/ns/net /var/run/netns/init_net
$ ip netns add foo
$ ip netns
foo (id: 3)
init_net (id: 1)
$ ip netns exec foo ip netns
foo (id: 3)
init_net (id: 1)
$ ip netns exec foo ip link add ipip1 link-netnsid 1 type ipip remote 10.16.0.121 local 10.16.0.249
$ ip netns exec foo ip l ls ipip1
6: ipip1@NONE: <POINTOPOINT,NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default
link/ipip 10.16.0.249 peer 10.16.0.121 link-netnsid 1
The parameter link-netnsid shows us where the interface sends and receives
packets (and thus we know where encapsulated addresses are set).
So ipip1 is shown in netns foo but functioning in netns init_net? Getting the
id of init_net in foo depends on your mount namespace, /var/run/netns/ may
not visible inside foo, in this case, link-netnsid is meaningless. It
is not your
fault, network namespace already heavily relies on mount namespace (sysfs
needs to be remount otherwise you can not create device with the same name.)
On the other hand, what's the problem you are trying to solve? AFAIK,
the ifindex
issue is purely in output, IOW, the device still functions correctly
even through
its link ifindex is not correct after moving to another namespace. If
not, it is bug
we need to fix.
From: Nicolas Dichtel <hidden> Date: 2014-09-24 09:32:36
Le 23/09/2014 21:26, Andy Lutomirski a écrit :
On Tue, Sep 23, 2014 at 6:20 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
The goal of this serie is to be able to multicast netlink messages with an
attribute that identify a peer netns.
This is needed by the userland to interpret some informations contained in
netlink messages (like IFLA_LINK value, but also some other attributes in case
of x-netns netdevice (see also
http://thread.gmane.org/gmane.linux.network/315933/focus=316064 and
http://thread.gmane.org/gmane.linux.kernel.containers/28301/focus=4239)).
Ids are stored in the parent user namespace. These ids are valid only inside
this user namespace. The user can retrieve these ids via a new netlink messages,
but only if peer netns are in the same user namespace.
What about the parent / ancestors of the owning userns? Can processes
in those usernses see any form of netns id?
With this serie no. I'm not sure if ancestors really needs to be able to
get these ids. What is your opinion?
_______________________________________________
Containers mailing list
Containers@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/containers
From: Cong Wang <hidden> Date: 2014-09-24 16:01:09
On Wed, Sep 24, 2014 at 2:23 AM, Nicolas Dichtel
[off-list ref] wrote:
Le 23/09/2014 21:22, Cong Wang a écrit :
quoted
On Tue, Sep 23, 2014 at 6:20 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
Here is a small screenshot to show how it can be used by userland:
$ ip netns add foo
$ ip netns del foo
$ ip netns
$ touch /var/run/netns/init_net
$ mount --bind /proc/1/ns/net /var/run/netns/init_net
$ ip netns add foo
$ ip netns
foo (id: 3)
init_net (id: 1)
$ ip netns exec foo ip netns
foo (id: 3)
init_net (id: 1)
$ ip netns exec foo ip link add ipip1 link-netnsid 1 type ipip remote
10.16.0.121 local 10.16.0.249
$ ip netns exec foo ip l ls ipip1
6: ipip1@NONE: <POINTOPOINT,NOARP> mtu 1480 qdisc noop state DOWN mode
DEFAULT group default
link/ipip 10.16.0.249 peer 10.16.0.121 link-netnsid 1
The parameter link-netnsid shows us where the interface sends and
receives
packets (and thus we know where encapsulated addresses are set).
So ipip1 is shown in netns foo but functioning in netns init_net? Getting
the
id of init_net in foo depends on your mount namespace, /var/run/netns/ may
not visible inside foo, in this case, link-netnsid is meaningless. It
is not your
fault, network namespace already heavily relies on mount namespace (sysfs
needs to be remount otherwise you can not create device with the same
name.)
On the other hand, what's the problem you are trying to solve? AFAIK,
the ifindex
issue is purely in output, IOW, the device still functions correctly
even through
its link ifindex is not correct after moving to another namespace. If
not, it is bug
we need to fix.
Please, summarize the discussion in your changelog, instead of pointing
to a long thread.
And clearly you missed my question above: how do you get netns id
without sharing /var/run/netns/ ?
From: Cong Wang <hidden> Date: 2014-09-24 16:15:31
On Wed, Sep 24, 2014 at 9:01 AM, Cong Wang [off-list ref] wrote:
And clearly you missed my question above: how do you get netns id
without sharing /var/run/netns/ ?
OK, I found it:
Ids are stored in the parent user namespace. These ids are valid only inside
this user namespace. The user can retrieve these ids via a new netlink messages,
but only if peer netns are in the same user namespace.
So your example is confusing, perhaps you need some other way to show the ID's
instead of binding to ip netns output which is basically ls
/var/run/netns/. We don't
want an inner netns know anything outside, IOW, we don't share /var/run/netns/.
I think in this case your ID's are still available, but aren't you
providing a new way
for the inner netns device to escape which we are trying to avoid?
From: Nicolas Dichtel <hidden> Date: 2014-09-24 16:27:37
Le 24/09/2014 18:01, Cong Wang a écrit :
On Wed, Sep 24, 2014 at 2:23 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
Le 23/09/2014 21:22, Cong Wang a écrit :
quoted
On Tue, Sep 23, 2014 at 6:20 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
Here is a small screenshot to show how it can be used by userland:
$ ip netns add foo
$ ip netns del foo
$ ip netns
$ touch /var/run/netns/init_net
$ mount --bind /proc/1/ns/net /var/run/netns/init_net
$ ip netns add foo
$ ip netns
foo (id: 3)
init_net (id: 1)
$ ip netns exec foo ip netns
foo (id: 3)
init_net (id: 1)
$ ip netns exec foo ip link add ipip1 link-netnsid 1 type ipip remote
10.16.0.121 local 10.16.0.249
$ ip netns exec foo ip l ls ipip1
6: ipip1@NONE: <POINTOPOINT,NOARP> mtu 1480 qdisc noop state DOWN mode
DEFAULT group default
link/ipip 10.16.0.249 peer 10.16.0.121 link-netnsid 1
The parameter link-netnsid shows us where the interface sends and
receives
packets (and thus we know where encapsulated addresses are set).
So ipip1 is shown in netns foo but functioning in netns init_net? Getting
the
id of init_net in foo depends on your mount namespace, /var/run/netns/ may
not visible inside foo, in this case, link-netnsid is meaningless. It
is not your
fault, network namespace already heavily relies on mount namespace (sysfs
needs to be remount otherwise you can not create device with the same
name.)
On the other hand, what's the problem you are trying to solve? AFAIK,
the ifindex
issue is purely in output, IOW, the device still functions correctly
even through
its link ifindex is not correct after moving to another namespace. If
not, it is bug
we need to fix.
Please, summarize the discussion in your changelog, instead of pointing
to a long thread.
The thread is long, but the mail in focus contains the information. Here is a
copy and paste:
What I'm trying to solve is to have full info in netlink messages sent by the
kernel, thus beeing able to identify a peer netns (and this is close from what
audit guys are trying to have). Theorically, messages sent by the kernel can be
reused as is to have the same configuration. This is not the case with x-netns
devices. Here is an example, with ip tunnels:
$ ip netns add 1
$ ip link add ipip1 type ipip remote 10.16.0.121 local 10.16.0.249 dev eth0
$ ip -d link ls ipip1
8: ipip1 <at> eth0: <POINTOPOINT,NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT
group default
link/ipip 10.16.0.249 peer 10.16.0.121 promiscuity 0
ipip remote 10.16.0.121 local 10.16.0.249 dev eth0 ttl inherit pmtudisc
$ ip link set ipip1 netns 1
$ ip netns exec 1 ip -d link ls ipip1
8: ipip1 <at> tunl0: <POINTOPOINT,NOARP,M-DOWN> mtu 1480 qdisc noop state DOWN mode
DEFAULT group default
link/ipip 10.16.0.249 peer 10.16.0.121 promiscuity 0
ipip remote 10.16.0.121 local 10.16.0.249 dev tunl0 ttl inherit pmtudisc
Now informations got with 'ip link' are wrong and incomplete:
- the link dev is now tunl0 instead of eth0, because we only got an ifindex
from the kernel without any netns informations.
- the encapsulation addresses are not part of this netns but the user doesn't
known that (still because netns info is missing). These IPv4 addresses may
exist into this netns.
- it's not possible to create the same netdevice with these infos.
Hope it's more clear now.
And clearly you missed my question above: how do you get netns id
without sharing /var/run/netns/ ?
From: Nicolas Dichtel <hidden> Date: 2014-09-24 16:31:56
Le 24/09/2014 18:15, Cong Wang a écrit :
On Wed, Sep 24, 2014 at 9:01 AM, Cong Wang [off-list ref] wrote:
quoted
And clearly you missed my question above: how do you get netns id
without sharing /var/run/netns/ ?
OK, I found it:
quoted
Ids are stored in the parent user namespace. These ids are valid only inside
this user namespace. The user can retrieve these ids via a new netlink messages,
but only if peer netns are in the same user namespace.
So your example is confusing, perhaps you need some other way to show the ID's
instead of binding to ip netns output which is basically ls
/var/run/netns/. We don't
want an inner netns know anything outside, IOW, we don't share /var/run/netns/.
Hmm, not sure to understand you. My usecase shares /var/run/netns, because
there is only one user ns and one mount ns.
I think in this case your ID's are still available, but aren't you
providing a new way
for the inner netns device to escape which we are trying to avoid?
It's why the ids depend on user ns. Only if user ns are the same we allow to
get an id for a peer netns.
_______________________________________________
Containers mailing list
Containers@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/containers
From: Cong Wang <hidden> Date: 2014-09-24 16:45:34
On Wed, Sep 24, 2014 at 9:27 AM, Nicolas Dichtel
[off-list ref] wrote:
Now informations got with 'ip link' are wrong and incomplete:
- the link dev is now tunl0 instead of eth0, because we only got an
ifindex
from the kernel without any netns informations.
This is not new, macvlan has the same problem. This is why I said
it is mostly a display problem, maybe just mark the ifindex as -1 or
something when it is not in this netns. At least I don't expect the inner
netns know anything outside, and I don't think I am the only one using
netns in this way.
- the encapsulation addresses are not part of this netns but the user
doesn't
known that (still because netns info is missing). These IPv4 addresses
may
exist into this netns.
I don't remember your x-netns code, but we have two choices:
1) Lookup the route of the netns which it is in
If the address is not available in this netns, it will fail, this is expected
since tunnel device is not a pure L2 device. Or maybe just fail
early when we move it.
2) Lookup the route of the netns where it was created
Transparent for upper layer, but as you said, the outer address is not
available in this netns therefore hard to display. Just hiding this information
doesn't seem wrong to me.
- it's not possible to create the same netdevice with these infos.
This is expected, because after all you are already in a different netns.
From: Cong Wang <hidden> Date: 2014-09-24 16:48:24
On Wed, Sep 24, 2014 at 9:31 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
I think in this case your ID's are still available, but aren't you
providing a new way
for the inner netns device to escape which we are trying to avoid?
It's why the ids depend on user ns. Only if user ns are the same we allow to
get an id for a peer netns.
Too late, userns is relatively new, relying on it breaks our existing
assumption.
From: Andy Lutomirski <luto@amacapital.net> Date: 2014-09-24 17:06:23
On Wed, Sep 24, 2014 at 2:31 AM, Nicolas Dichtel
[off-list ref] wrote:
Le 23/09/2014 21:26, Andy Lutomirski a écrit :
quoted
On Tue, Sep 23, 2014 at 6:20 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
The goal of this serie is to be able to multicast netlink messages with
an
attribute that identify a peer netns.
This is needed by the userland to interpret some informations contained
in
netlink messages (like IFLA_LINK value, but also some other attributes in
case
of x-netns netdevice (see also
http://thread.gmane.org/gmane.linux.network/315933/focus=316064 and
http://thread.gmane.org/gmane.linux.kernel.containers/28301/focus=4239)).
Ids are stored in the parent user namespace. These ids are valid only
inside
this user namespace. The user can retrieve these ids via a new netlink
messages,
but only if peer netns are in the same user namespace.
What about the parent / ancestors of the owning userns? Can processes
in those usernses see any form of netns id?
With this serie no. I'm not sure if ancestors really needs to be able to
get these ids. What is your opinion?
I might be missing some consideration here, but I would hope that ip
link would work correctly if I have a veth interface shared with a
netns that's in a child userns.
--Andy
--
Andy Lutomirski
AMA Capital Management, LLC
From: Nicolas Dichtel <hidden> Date: 2014-09-25 07:55:05
Le 24/09/2014 19:05, Andy Lutomirski a écrit :
On Wed, Sep 24, 2014 at 2:31 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
Le 23/09/2014 21:26, Andy Lutomirski a écrit :
quoted
On Tue, Sep 23, 2014 at 6:20 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
The goal of this serie is to be able to multicast netlink messages with
an
attribute that identify a peer netns.
This is needed by the userland to interpret some informations contained
in
netlink messages (like IFLA_LINK value, but also some other attributes in
case
of x-netns netdevice (see also
http://thread.gmane.org/gmane.linux.network/315933/focus=316064 and
http://thread.gmane.org/gmane.linux.kernel.containers/28301/focus=4239)).
Ids are stored in the parent user namespace. These ids are valid only
inside
this user namespace. The user can retrieve these ids via a new netlink
messages,
but only if peer netns are in the same user namespace.
What about the parent / ancestors of the owning userns? Can processes
in those usernses see any form of netns id?
With this serie no. I'm not sure if ancestors really needs to be able to
get these ids. What is your opinion?
I might be missing some consideration here, but I would hope that ip
link would work correctly if I have a veth interface shared with a
netns that's in a child userns.
From: Nicolas Dichtel <hidden> Date: 2014-09-25 08:53:35
Le 24/09/2014 18:48, Cong Wang a écrit :
On Wed, Sep 24, 2014 at 9:31 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
quoted
I think in this case your ID's are still available, but aren't you
providing a new way
for the inner netns device to escape which we are trying to avoid?
It's why the ids depend on user ns. Only if user ns are the same we allow to
get an id for a peer netns.
Too late, userns is relatively new, relying on it breaks our existing
assumption.
I don't get your point. netns has been added in kernel after user ns:
acce292c82d4 user namespace: add the framework => 2.6.23
5f256becd868 [NET]: Basic network namespace infrastructure. => 2.6.24
In the kernel, each netns is linked with a user ns.
_______________________________________________
Containers mailing list
Containers@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/containers
From: Nicolas Dichtel <hidden> Date: 2014-09-25 08:53:42
Le 24/09/2014 18:45, Cong Wang a écrit :
On Wed, Sep 24, 2014 at 9:27 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
Now informations got with 'ip link' are wrong and incomplete:
- the link dev is now tunl0 instead of eth0, because we only got an
ifindex
from the kernel without any netns informations.
This is not new, macvlan has the same problem. This is why I said
it is mostly a display problem, maybe just mark the ifindex as -1 or
something when it is not in this netns. At least I don't expect the inner
netns know anything outside, and I don't think I am the only one using
netns in this way.
I understand your point but there is several use of netns. Netns can be used
also to instantiate virtual routers. In this case, administrators or daemons
need to be able to monitor and dump the configuration on all netns
(particularly beeing able to identify fully x-netns interfaces). We start to
discuss this in one of the two thread pointed in my cover letter and get the
conclusion that checking user ns is a good way to know if an id should be
disclosed or not for a peer netns.
Can you describe your use case?
quoted
- the encapsulation addresses are not part of this netns but the user
doesn't
known that (still because netns info is missing). These IPv4 addresses
may
exist into this netns.
I don't remember your x-netns code, but we have two choices:
1) Lookup the route of the netns which it is in
If the address is not available in this netns, it will fail, this is expected
since tunnel device is not a pure L2 device. Or maybe just fail
early when we move it.
2) Lookup the route of the netns where it was created
Transparent for upper layer, but as you said, the outer address is not
available in this netns therefore hard to display. Just hiding this information
doesn't seem wrong to me.
Your assumption here is that all dameons were started before the tunnel was
created. But this is not true, a daemon may be started later. Another case is
when a daemon crash: we need to be able to restart it and it should be able to
recover all needed information.
quoted
- it's not possible to create the same netdevice with these infos.
This is expected, because after all you are already in a different netns.
A different netns only means a different network stack, not a different user ns
or mount ns or PID ns, ...
If you only play with netns, you may want to monitor all activies in all netns
(this is already possible) and beeing able to link information between netns
(this is what I'm trying to solve).
_______________________________________________
Containers mailing list
Containers@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/containers
From: Cong Wang <hidden> Date: 2014-09-26 01:58:42
On Thu, Sep 25, 2014 at 1:53 AM, Nicolas Dichtel
[off-list ref] wrote:
Le 24/09/2014 18:48, Cong Wang a écrit :
quoted
On Wed, Sep 24, 2014 at 9:31 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
quoted
I think in this case your ID's are still available, but aren't you
providing a new way
for the inner netns device to escape which we are trying to avoid?
It's why the ids depend on user ns. Only if user ns are the same we allow
to
get an id for a peer netns.
Too late, userns is relatively new, relying on it breaks our existing
assumption.
I don't get your point. netns has been added in kernel after user ns:
acce292c82d4 user namespace: add the framework => 2.6.23
5f256becd868 [NET]: Basic network namespace infrastructure. => 2.6.24
Was it complete on 2.6.x? I doubt...
https://lkml.org/lkml/2014/8/20/826
As at Linux 3.8, most relevant subsystems supported user names‐
paces, but a number of filesystems did not have the infrastruc‐
ture needed to map user and group IDs between user namespaces.
Linux 3.9 added the required infrastructure support for many of
the remaining unsupported filesystems (Plan 9 (9P), Andrew File
System (AFS), Ceph, CIFS, CODA, NFS, and OCFS2). Linux 3.11
added support the last of the unsupported major filesystems, XFS.
In the kernel, each netns is linked with a user ns.
Are you saying every time we create a netns we have a new userns?
This doesn't make sense for me.
_______________________________________________
Containers mailing list
Containers@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/containers
From: Cong Wang <hidden> Date: 2014-09-26 02:09:41
On Thu, Sep 25, 2014 at 1:53 AM, Nicolas Dichtel
[off-list ref] wrote:
Le 24/09/2014 18:45, Cong Wang a écrit :
quoted
On Wed, Sep 24, 2014 at 9:27 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
Now informations got with 'ip link' are wrong and incomplete:
- the link dev is now tunl0 instead of eth0, because we only got an
ifindex
from the kernel without any netns informations.
This is not new, macvlan has the same problem. This is why I said
it is mostly a display problem, maybe just mark the ifindex as -1 or
something when it is not in this netns. At least I don't expect the inner
netns know anything outside, and I don't think I am the only one using
netns in this way.
I understand your point but there is several use of netns. Netns can be used
also to instantiate virtual routers. In this case, administrators or daemons
need to be able to monitor and dump the configuration on all netns
(particularly beeing able to identify fully x-netns interfaces). We start to
discuss this in one of the two thread pointed in my cover letter and get the
conclusion that checking user ns is a good way to know if an id should be
disclosed or not for a peer netns.
Then you are leaking information, this breaks isolation.
Can you describe your use case?
Yes, too simple: isolation networking, different netns's don't see each other
(including anything inside) and only communicate via veth.
If you only play with netns, you may want to monitor all activies in all
netns
(this is already possible) and beeing able to link information between netns
(this is what I'm trying to solve).
No, I don't want to monitor anything. Even if I wanted, I would just start one
daemon in each netns instead of one for all.
On the other hand, why not exchange the configuration via veth
between different netns? There are many ways to do so with TCP HTTP etc.
This doesn't have to be solved in kernel.
_______________________________________________
Containers mailing list
Containers@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/containers
From: Nicolas Dichtel <hidden> Date: 2014-09-26 13:39:03
Le 26/09/2014 03:58, Cong Wang a écrit :
On Thu, Sep 25, 2014 at 1:53 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
Le 24/09/2014 18:48, Cong Wang a écrit :
quoted
On Wed, Sep 24, 2014 at 9:31 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
quoted
I think in this case your ID's are still available, but aren't you
providing a new way
for the inner netns device to escape which we are trying to avoid?
It's why the ids depend on user ns. Only if user ns are the same we allow
to
get an id for a peer netns.
Too late, userns is relatively new, relying on it breaks our existing
assumption.
I don't get your point. netns has been added in kernel after user ns:
acce292c82d4 user namespace: add the framework => 2.6.23
5f256becd868 [NET]: Basic network namespace infrastructure. => 2.6.24
Was it complete on 2.6.x? I doubt...
https://lkml.org/lkml/2014/8/20/826
As at Linux 3.8, most relevant subsystems supported user names‐
paces, but a number of filesystems did not have the infrastruc‐
ture needed to map user and group IDs between user namespaces.
Linux 3.9 added the required infrastructure support for many of
the remaining unsupported filesystems (Plan 9 (9P), Andrew File
System (AFS), Ceph, CIFS, CODA, NFS, and OCFS2). Linux 3.11
added support the last of the unsupported major filesystems, XFS.
quoted
In the kernel, each netns is linked with a user ns.
Are you saying every time we create a netns we have a new userns?
This doesn't make sense for me.
No. I mean that each netns depends on a userns.
See include/net/net_namespace.h:
struct net {
[snip]
struct user_namespace *user_ns; /* Owning user namespace */
[snip]
}
_______________________________________________
Containers mailing list
Containers@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/containers
From: Nicolas Dichtel <hidden> Date: 2014-09-26 13:40:35
Le 26/09/2014 04:09, Cong Wang a écrit :
On Thu, Sep 25, 2014 at 1:53 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
Le 24/09/2014 18:45, Cong Wang a écrit :
quoted
On Wed, Sep 24, 2014 at 9:27 AM, Nicolas Dichtel
[off-list ref] wrote:
quoted
Now informations got with 'ip link' are wrong and incomplete:
- the link dev is now tunl0 instead of eth0, because we only got an
ifindex
from the kernel without any netns informations.
This is not new, macvlan has the same problem. This is why I said
it is mostly a display problem, maybe just mark the ifindex as -1 or
something when it is not in this netns. At least I don't expect the inner
netns know anything outside, and I don't think I am the only one using
netns in this way.
I understand your point but there is several use of netns. Netns can be used
also to instantiate virtual routers. In this case, administrators or daemons
need to be able to monitor and dump the configuration on all netns
(particularly beeing able to identify fully x-netns interfaces). We start to
discuss this in one of the two thread pointed in my cover letter and get the
conclusion that checking user ns is a good way to know if an id should be
disclosed or not for a peer netns.
Then you are leaking information, this breaks isolation.
quoted
Can you describe your use case?
Yes, too simple: isolation networking, different netns's don't see each other
(including anything inside) and only communicate via veth.
If you are a privileged user and you are able to access a peer netns (move an
interface into this peer netns, move an interface from this peer netns to your
own netns), I don't see any reason to not beeing able to get information about
this peer netns (you are already a privileged user in both netns).
If you want to isolate this peer netns (I think you call it "inner netns"), you
have to create a new user ns for this netns, hence a privileged user into this
peer netns will not be able to act in your own netns. And with this scenario and
my patches, this privileged user will not be able to get an id. Isolation is
preserved.
How do you preserved it in your scenario?
quoted
If you only play with netns, you may want to monitor all activies in all
netns
(this is already possible) and beeing able to link information between netns
(this is what I'm trying to solve).
No, I don't want to monitor anything. Even if I wanted, I would just start one
daemon in each netns instead of one for all.
Ok you don't want, but some other people (not only me) want it! And having one
daemon per netns does not scale: there are scenarii with thousand netns which
are dynamically created and deleted.
On the other hand, why not exchange the configuration via veth
between different netns? There are many ways to do so with TCP HTTP etc.
This doesn't have to be solved in kernel.
The standard way with linux to monitor network configuration is netlink.
_______________________________________________
Containers mailing list
Containers@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/containers
From: David Ahern <hidden> Date: 2014-09-26 19:15:18
On 9/26/14, 7:40 AM, Nicolas Dichtel wrote:
quoted
No, I don't want to monitor anything. Even if I wanted, I would just
start one
daemon in each netns instead of one for all.
Ok you don't want, but some other people (not only me) want it! And
having one
daemon per netns does not scale: there are scenarii with thousand netns
which
are dynamically created and deleted.
An example of the scaling problem using quagga (old but still seems to
be a relevant data point):
https://lists.quagga.net/pipermail/quagga-users/2010-February/011351.html
"2k VRFs that would be 2.6G"
And that does not include the overhead of each namespace -- roughly
200kB/namespace on one kernel I checked (v3.10). So that's a ballpark of
3G of memory.
David