linux网络命名空间及使用

匿名 (未验证) 提交于 2019-12-02 21:59:42

从逻辑上说,网络命名空间是网络栈的副本,有自己的网络设备、路由选择表、邻接表、Netfilter表、网络套接字、网络procfs条目、网络sysfs条目和其他网络资源。

网络命名空间可以营造出多个内核网络栈实例的假象。网络命名空间的结构为net,定义在文件include/net/net_namespace.h

struct

/* To decided when the network

/* To decided when the network

struct/* list of network namespaces */

struct/* namespaces on death row */

struct/* Use only net_mutex */

struct/* Owning user namespace */

struct

struct

struct

struct

struct

#ifdef CONFIG_SYSCTL

struct

#endif

struct/* rtnetlink socket */

struct

struct指向一个包含所有网络设备的链表

struct指向一个包含所有网络设备的散列表,键为网络设备名

struct指向一个包含所有网络设备的散列表,键为网络设备索引

unsignedint/* protected by rtnl_mutex */

int网络命名空间中分配的最有一个设备索引

unsignedint

/* core fib_rules */

struct

struct/* protected by net_mutex */

struct/* The loopback */

struct

struct

struct

struct

struct是一个netns_ipv4结构实例,用于ipv4子系统

#if IS_ENABLED(CONFIG_IPV6)

struct

#endif

#if IS_ENABLED(CONFIG_IEEE802154_6LOWPAN)

struct

#endif

#if defined(CONFIG_IP_SCTP) || defined(CONFIG_IP_SCTP_MODULE)

struct

#endif

#if defined(CONFIG_IP_DCCP) || defined(CONFIG_IP_DCCP_MODULE)

struct

#endif

#ifdef CONFIG_NETFILTER

struct

struct

#if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)

struct

#endif

#if defined(CONFIG_NF_TABLES) || defined(CONFIG_NF_TABLES_MODULE)

struct

#endif

#if IS_ENABLED(CONFIG_NF_DEFRAG_IPV6)

struct

#endif

struct

struct

#if IS_ENABLED(CONFIG_NETFILTER_NETLINK_ACCT)

struct

#endif

#if IS_ENABLED(CONFIG_NF_CT_NETLINK_TIMEOUT)

struct

#endif

#endif

#ifdef CONFIG_WEXT_CORE

struct

#endif

struct

/* Note : following structs are cache line aligned */

#ifdef CONFIG_XFRM

struct是一个netns_xfrm结构实例,用于IPsec子系统。

#endif

#if IS_ENABLED(CONFIG_IP_VS)

struct

#endif

#if IS_ENABLED(CONFIG_MPLS)

struct

#endif

#if IS_ENABLED(CONFIG_CAN)

struct

#endif

struct

} __randomize_layout;

proc_net表示网络命名空间procfs条目(/proc/net)。每个网络命名空间都维护着自己的procfs条目。

staticinline

voidstructstruct

include/net/net_namespace.h如下:

struct

struct

intstruct

voidstruct

voidstruct

unsignedint

size_t

};

staticstruct

};

位于文件中,在启动阶段在net_ns_init函数中注册。

创建新的网络命名空间时,都将调用init回调函数net_ns_net_init。

staticintstruct

{

#ifdef CONFIG_NET_NS

#endif

return

}

1.网络命名空间管理

可以使用ip netns来执行创建、删除、显示网络命名空间。

l创建网络命名空间ns1

#ip netns add ns1

会创建文件/var/run/netns/ns1。然后关联到网络命名空间/proc/self/ns/net。注意的是网络命名空间可以嵌套创建的。

l#ip netns del ns1 

可以将网络命名空间进行删除。如果有一个或多个进程与这个网络命名空间相关联,就不会删除该命名空间。网络命名空间被删除时,所有网络设备都移到默认的初始网络命名空间init_net中。

l#ip netns list

可以显示所有通过ip netns add添加的网络命名空间。并不会添加其他例如unshare创建的网络命名空间。

l监视网络命名空间的创建和删除,可以使用#ip netns monitor

l指定网络命名空间中启动shell

可以使用命令ip netns exec ns1 bash

或者执行# ip netns exec ns1 ifconfig -a

可以显示ns1网络命名空间中所有网络接口,这个命令执行是docker是很像的。

l显示指定pid相关联的网络命名空间

可以使用命令#ip netns identify #pid

例如:

#ip netns identify 1

l显示与网络命名空间ns1相关联的进程PID

可以使用名了#ip netns pids ns1

l网络接口移到另一个网络命名空间

#ip link set eth0 netns ns1

该命令会在net_device对象中添加新特征NETIF_F_NETNS_LOCAL。该特征表示网络设备是网络命名空间的本地设备,会调用函数dev_change_net_namespace。然后这个eth0就要在ns1空间中才能看见。

通过命令可以查看设备是否是网络命名空间的本地设备。

# ethtool -k enp0s3 | grep -i netns-local

设置无线网络接口移到其他网络命名空间,使用iw命令。

2.命名空间之间通信

网络命名空间之间通信可以使用Unix套接字,也可以使用虚拟以太网(VETH)网络驱动程序来创建一对虚拟网络设备,将其中给一个移到另一个网络命名空间中。例如:

#ip netns add ns1

#ip netns add ns2

在ns1中启动shell

#

创建虚拟以太网设备,类型为veth.

# ip link add name if_one type veth peer name if_one_peer

if_one_peer移动到ns2

# ip link set dev if_one_peer netns ns2

这样就在ns1和ns2中都用了一个网络接口,可以通过设置IP来进行通信了。

支持网络命名空间,需要配置内核参数CONFIG_NET_NS.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!