精华内容
下载资源
问答
  • linux网络命名空间.docx

    2020-01-03 15:32:28
    linux网络命名空间.doc
  • linux 网络命名空间.doc
  • linux网络命名空间

    2020-03-27 15:52:05
    linux网络命名空间需要安装iproute-3**.rpm包 注:需要什么请查看帮助手册,常用的 iphelp(管理网络),ip netns help(网络命名空间创建使用), ip link help(虚拟网卡创建使用), ip addr help(虚拟网卡地址分配)等等...

    linux网络命名空间需要安装iproute-3**.rpm包

    注:需要什么请查看帮助手册,常用的 ip help(管理网络),ip netns help(网络命名空间创建使用) , ip link help(虚拟网卡创建使用), ip addr help(虚拟网卡地址分配) 等等。从ip netns help 可以查看到 ip [-all] netns exec [name] cmd ...,这个命名可以对命名空间中的网卡进行设置。

    1、创建网络命名空间,例如 ch

    ip netns add ch

    2、查看网络命名空间,

    ip netns ls 或者 ip netns list

    3、创建虚拟网卡Veth,Veth都是成对创建的,它都是成对出现的,就像一个管道的两端,从这个管道的一端的veth进去的数据会从另一端的veth再出来。也就是说,你可以使用veth接口把一个网络命名空间连接到外部的默认命名空间或者global命名空间,而物理网卡就存在这些命名空间里。例如 ch1.1和ch1.2

    ip link add name ch1.1 type veth peer name ch1.2

    4、查看虚拟网络Veth

    ip link list 或者 ip link ls

    5、将虚拟网卡ch1.1移动到网络命名空间ch上

    ip link set ch1.1 netns ch

    现在在使用ip link list 就已经看不到虚拟网卡ch1.1了,可以根据步骤6在ch中可以查看到

    6、查看网络命名空间ch和查看网络命名空间网卡信息

    ip netns exec ch ip link list

    ip netns exec ch ip addr show

    在ch中可以看到2个网卡,一个是回环网络lo  和   一个 ch1.1

    7、给网络命名空间里面的虚拟网卡配置

    ip netns exec ch ip addr add 10.1.1.1/24 dev ch1.1  --给ch1.1分配ip地址

    ip netns exec ch ip link set ch1.1 up  ---启动网卡

    ip netns exec ch ip link set lo up      --启动回环网卡

    8、给ch1.2分配ip地址

    ip addr add 10.1.1.2/24 dev ch1.2

    9、启动ch1.2

    ip link set ch1.2 up

    10、从网络命名空间ch中测试到ch1.2的网络通不通

    ip netns exec ch ping 10.1.1.2

     

    Docker创建容器时默认采用bridge网络,自行分配ip,不允许自己指定。

    在实际部署中,我们需要指定容器ip,不允许其自行分配ip,尤其是搭建集群时,固定ip是必须的。

    我们可以创建自己的bridge网络 : mynet,创建容器的时候指定网络为mynet并指定ip即可。

    查看网络模式

    docker network ls

    创建一个新的bridge网络

    docker network create --driver bridge --subnet=172.18.12.0/16 --gateway=172.18.1.1 mynet

    查看网络信息

    docker network inspect mynet

    创建容器并指定容器ip

    docker run -e TZ="Asia/Shanghai" --privileged -itd -h hadoop01.com --name hadoop01 --network=mynet --ip 172.18.12.1 centos /usr/sbin/init

    运行容器

    docker exec -it hadoop01 /bin/bash

    通过本地客户端访问(通过创建容器时指定端口或配置独立ip)

    docker run -e TZ="Asia/Shanghai" -p 6001:22 --privileged -itd -h hadoop01.com --name hadoop01 --network=mynet --ip 172.18.12.1 centos /usr/sbin/init

    route -p add 172.18.12.0 MASK 255.255.255.0 10.0.75.2

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • Linux网络命名空间

    2021-01-24 14:27:29
    引言 Namespaces(命名空间)和...Linux内核提供了6种类型的Namespaces:pid、net、mnt、uts、ipc、user。例如,pid命名空间的进程只能看到同一个命名空间的进程。使用mnt命名空间,可以将进程附加到其自己的文件系统

    引言

    Namespaces(命名空间)和cgroups是两种主要的内核技术,他们是容器化技术的基石。简而言之,cgroup是一种计量和限制机制,它能控制你可以使用多少系统资源(CPU、内存)。另一方面,Namespaces限制了你所看到的内容。得益于Namespaces,进程有其独立的系统资源视图。

    Linux内核提供了6种类型的Namespaces:pid、net、mnt、uts、ipc、user。例如,pid命名空间的进程只能看到同一个命名空间的进程。使用mnt命名空间,可以将进程附加到其自己的文件系统(就像chroot)。在本文中我们仅关注网络命名空间。

    网络命名空间为命名空间内的所有进程提供了全新的网络堆栈。其中包括网络接口,路由表和iptables规则。

    网络命名空间

    从系统的角度来看,当通过clone()系统调用创建新进程时,传递标志CLONE_NEWNET将在新进程中创建一个全新的网络命名空间。从用户的角度来看,我们仅使用工具ip(软件包为iproute2)来创建新的持久网络命名空间:

    $ ip netns add ns1
    

    此命令将创建一个名为ns1的新网络命名空间。创建命名空间后,ip命令会在/var/run/netns下为其添加绑定挂载点。这样,即使没有附加任何进程,命名空间也可以保留。列出系统中可用的命名空间:

    $ ls /var/run/netns
    ns1
    

    或通过ip

    $ ip netns
    ns1
    

    如前所述,网络命名空间包含其自己的网络资源:接口,路由表等。让我们向ns1添加回环接口:

    1 $ ip netns exec ns1 ip link set dev lo up
    2 $ ip netns exec ns1 ping 127.0.0.1
    3 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
    4 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.115 ms
    
    • 第1行在网络命名空间ns1内部启用回环接口。
    • 第2行在网络命名空间内部执行命令ping 127.0.0.1

    启用回环接口的另一种语法可以是:

    $ ip netns exec ns1 ifconfig lo up
    

    废弃旧的但更熟悉ifconfigroute等命令,我倾向于使用命令ip,因为它已经成为Linux的首选网络工具。请注意,ip需要root权限,因此请以root身份或前置sudo运行。

    网络命名空间也有自己的路由表:

    $ ip netns exec ns1 ip route show
    

    由于我们尚未添加任何路由表规则,因此该命令什么都不返回。一般而言,在网络命名空间中运行的任何命令都由以下内容开头:

    $ ip netns exec <network-namespace>
    

    示例

    网络命名空间的后果之一是一次只能将一个接口分配给命名空间。如果root命名空间拥有eth0,它提供对外部世界的访问,则只有root命名空间内的程序才能访问Internet。解决方案是通过veth对与root命名空间进行通信。一对veth像跳线一样工作,连接两侧。它由两个虚拟接口组成,其中一个虚拟接口分配给root网络命名空间,另一个虚拟接口位于网络命名空间内。相应地设置其IP地址和路由规则,再在主机端启用NAT,就在网络命名空间内访问Internet。

    另外,我觉得我现在需要澄清。我读过几篇有关网络命名空间的文章,其中物理设备接口只能存在于root命名空间中。至少我当前的内核(Linux 3.13)不是这种情况。我可以将eth0分配给除根目录以外的命名空间,并且在正确设置它时,可以从命名空间访问Internet。但是,由于一个网络接口一次只能存在于一个命名空间的限制,很多时候,仍然需要通过veth对连接网络命名空间。

    首先,让我们创建一个名为ns1的网络命名空间。

    # 移除命名空间.
    ip netns del ns1 &>/dev/null
    # 创建命名空间
    ip netns add ns1
    

    接下来,创建一个veth-pair。接口v-eth1保留在root网络命名空间中,而其对等方v-peer1将移至ns1命名空间。

    # 创建veth-pair,v-eth1加入root命名空间
    ip link add v-eth1 type veth peer name v-peer1
    
    # 将v-peer1加入ns1
    ip link set v-peer1 netns ns1
    

    接下来,为两个接口设置IPv4地址并启动它们。

    # 设置v-eth1的ip
    ip addr add 10.200.1.1/24 dev v-eth1
    ip link set v-eth1 up
    
    # 设置v-peer1的ip
    ip netns exec ns1 ip addr add 10.200.1.2/24 dev v-peer1
    ip netns exec ns1 ip link set v-peer1 up
    ip netns exec ns1 ip link set lo up
    

    另外,在ns1内部启用回环接口。

    现在必须使离开ns1的所有外部流量都通过v-eth1。

    ip netns exec ns1 ip route add default via 10.200.1.1
    

    但是,这还不够。与共享其Internet连接的任何主机一样,有必要在主机中启用IPv4转发并启用伪装。

    # 共享主机与NS间的internet访问
    
    # 开启IP转发
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
    # 清空转发规则,默认策略policy DROP
    iptables -P FORWARD DROP
    iptables -F FORWARD
    
    # 清空nat表
    iptables -t nat -F
    
    # 开启网段10.200.1.0/24的IP伪装(masquerading)
    iptables -t nat -A POSTROUTING -s 10.200.1.0/24 -o eth0 -j MASQUERADE
    
    # 允许eth0与v-eth1之前的转发
    iptables -A FORWARD -i eth0 -o v-eth1 -j ACCEPT
    iptables -A FORWARD -o eth0 -i v-eth1 -j ACCEPT
    

    如果一切顺利,则可以从ns1 ping外部主机。

    $ ip netns exec ns1 ping 8.8.8.8
    PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=50 time=48.5 ms
    64 bytes from 8.8.8.8: icmp_seq=2 ttl=50 time=50.8 ms
    

    设置后,ns1内的路由表如下所示:

    $ ip netns exec ns1 ip route sh
    default via 10.200.1.1 dev v-peer1 
    10.200.1.0/24 dev v-peer1  proto kernel  scope link  src 10.200.1.2
    

    除了加上ip netns exec这样的前缀,来指定命令执行的命名空间。还可以直接将运行的bash shell附加到网络命名空间:

    $ ip netns exec ns1 /bin/bash --rcfile <(echo "PS1=\"namespace ns1> \"")
    namespace ns1> ping www.google.com
    PING www.google.com (178.60.128.38) 56(84) bytes of data.
    64 bytes from cache.google.com (178.60.128.38): icmp_seq=1 ttl=58 time=17.6 ms
    

    输入exit退出bash进程并离开网络命名空间。

    最后,可以执行如下命令,清理现场

    # 恢复iptable规则,清空filter/nat表
    iptables -P FORWARD ACCEPT
    iptables -t nat -F
    iptables -F
    
    # 删除命名空间,关联的veth pair随之删除
    ip netns del ns1
    

    总结

    网络命名空间以及Linux内核提供的其他容器化技术是一种用于资源隔离的轻量级机制。附加到网络命名空间的进程可以看到自己的网络堆栈,而不会干扰系统的其余网络堆栈。

    网络命名空间也易于使用。可以使用虚拟机建立类似的网络级别隔离。但是,就系统资源和建立此类环境的时间投入而言,这似乎是一种昂贵得多的解决方案。如果只需要网络级别的进程隔离,则绝对要考虑网络命名空间。

    展开全文
  • Linux 网络命名空间

    千次阅读 2017-04-09 09:59:58
    网络命名空间 虚拟网络创建 iproute2 创建新的网络命名空间 显示所有的虚拟网络命名空间 进入虚拟网络环境 设置虚拟网络环境net0的veth0设备处于激活状态 为虚拟网络环境net0的veth0设备增加IP地址 连接两个网络环境...

    虚拟网络基础

    和磁盘设备类似,Linux 用户想要使用网络功能,不能通过直接操作硬件完成,而需要直接或间接的操作一个 Linux 为我们抽象出来的设备,既通用的Linux网络设备来完成。一个常见的情况是,系统里装有一个硬件网卡,Linux 会在系统里为其生成一个网络设备实例,如eth0,用户需要对eth0发出命令以配置或使用它了。更多的硬件会带来更多的设备实例,虚拟的硬件也会带来更多的设备实例。
    随着网络技术,虚拟化技术的发展,更多的高级网络设备被加入了到了Linux中,使得情况变得更加复杂。
    在本节中,将一一分析在虚拟化技术中经常使用的几种 Linux 网络设备抽象类型:Bridge、802.1.q VLAN device、VETH、TAP,详细解释如何用它们配合 Linux 中的 Route table、IP table简单的创建出本地虚拟网络。
    Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等。

    bridge

    Bridge(桥)是 Linux 上用来做 TCP/IP 二层协议交换的设备,与现实世界中的交换机功能相似。Bridge 设备实例可以和 Linux 上其他网络设备实例连接,既attach一个从设备,类似于在现实世界中的交换机和一个用户终端之间连接一根网线。当有数据到达时,Bridge会根据报文中的MAC信息进行广播、转发、丢弃处理。
    图 1.Bridge 设备工作过程
    Bridge 设备工作过程
    如图所示,Bridge 的功能主要在内核里实现。当一个从设备被 attach 到 Bridge 上时,相当于现实世界里交换机的端口被插入了一根连有终端的网线。这时在内核程序里,netdev_rx_handler_register()被调用,注册一个用于接受数据的回调函数。以后每当这个从设备收到数据时都会调用这个函数可以把数据转发到 Bridge 上。当 Bridge 接收到此数据时,br_handle_frame()被调用,进行一个和现实世界中的交换机类似的处理过程:
    1. 判断包的类别(广播/单点)
    1. 查找内部 MAC 端口映射表
    1. 定位目标端口号
    1. 将数据转发到目标端口或丢弃
    1. 自动更新内部 MAC 端口映射表以自我学习

    Bridge和现实世界中的二层交换机有一个==区别==,图中左侧画出了这种情况:数据被直接发到Bridge上,而不是从一个端口接受。这种情况可以看做Bridge自己有一个MAC可以主动发送报文,或者说Bridge自带了一个隐藏端口和寄主 Linux 系统自动连接,Linux 上的程序可以直接从这个端口向 Bridge 上的其他端口发数据。所以当一个 Bridge 拥有一个网络设备时,如 bridge0 加入了 eth0 时,实际上 bridge0 拥有两个有效 MAC 地址,一个是 bridge0 的,一个是 eth0 的,他们之间可以通讯。
    由此带来一个有意思的事情是,Bridge 可以设置 IP 地址。通常来说 IP 地址是三层协议的内容,不应该出现在二层设备 Bridge 上。但是 Linux 里 Bridge 是通用网络设备抽象的一种,只要是网络设备就能够设定 IP 地址。当一个 bridge0 拥有 IP 后,Linux 便可以通过路由表或者IP表规则在三层定位bridge0,此时相当于Linux拥有了另外一个隐藏的虚拟网卡和 Bridge 的隐藏端口相连,这个网卡就是名为bridge0的通用网络设备,IP可以看成是这个网卡的。当有符合此 IP 的数据到达 bridge0 时,内核协议栈认为收到了一包目标为本机的数据,此时应用程序可以通过 Socket接收到它。
    一个更好的对比例子是==现实世界中的带路由的交换机设备==,它也拥有一个隐藏的 MAC 地址,供设备中的三层协议处理程序和管理程序使用。设备里的三层协议处理程序,对应名为 bridge0 的通用网络设备的三层协议处理程序,即寄主Linux系统内核协议栈程序。设备里的管理程序,对应bridge0寄主Linux系统里的应用程序。
    Bridge 的实现当前有一个==限制==:当一个设备被 attach 到 Bridge 上时,那个设备的 IP 会变的无效,Linux 不再使用那个 IP 在三层接受数据。举例如下:如果 eth0 本来的 IP 是 192.168.1.2,此时如果收到一个目标地址是 192.168.1.2 的数据,Linux 的应用程序能通过 Socket 操作接受到它。而当 eth0 被 attach 到一个 bridge0 时,尽管 eth0 的 IP 还在,但应用程序是无法接受到上述数据的。此时应该把 IP 192.168.1.2 赋予 bridge0。
    另外需要注意的是==数据流的方向==。对于一个被attach到Bridge上的设备来说,只有它收到数据时,此包数据才会被转发到Bridge上,进而完成查表广播等后续操作。当请求是发送类型时,数据是不会被转发到 Bridge 上的,它会寻找下一个发送出口。用户在配置网络时经常忽略这一点从而造成网络故障。

    TAP 设备与 VETH 设备

    TUN/TAP 设备是一种让用户态程序向内核协议栈注入数据的设备,一个工作在三层,一个工作在二层,使用较多的是 TAP 设备。VETH设备出现较早,它的作用是反转通讯数据的方向,需要发送的数据会被转换成需要收到的数据重新送入内核网络层进行处理,从而间接的完成数据的注入。
    图 2 .TAP 设备和 VETH 设备工作过程

    当一个TAP设备被创建时,在Linux设备文件目录下将会生成一个对应char设备,用户程序可以像打开普通文件一样打开这个文件进行读写。当执行 write()操作时,数据进入 TAP 设备,此时对于 Linux 网络层来说,相当于 TAP 设备收到了一包数据,请求内核接受它,如同普通的物理网卡从外界收到一包数据一样,不同的是其实数据来自Linux上的一个用户程序。Linux收到此数据后将根据网络配置进行后续处理,从而完成了用户程序向Linux内核网络层注入数据的功能。当用户程序执行read()请求时,相当于向内核查询 TAP 设备上是否有需要被发送出去的数据,有的话取出到用户程序里,完成 TAP 设备的发送数据功能。
    针对 TAP 设备的一个形象的比喻是:使用 TAP 设备的应用程序相当于另外一台计算机,TAP 设备是本机的一个网卡,他们之间相互连接。应用程序通过 read()/write()操作,和本机网络核心进行通讯。

    VETH 设备总是成对出现,送到一端请求发送的数据总是从另一端以请求接受的形式出现。该设备不能被用户程序直接操作,但使用起来比较简单。创建并配置正确后,向其一端输入数据,VETH 会改变数据的方向并将其送入内核网络核心,完成数据的注入。在另一端能读到此数据。

    netns

    netns是在linux中提供网络虚拟化的一个项目,使用netns网络空间虚拟化可以在本地虚拟化出多个网络环境,目前netns在lxc容器中被用来为容器提供网络。
    使用netns创建的网络空间独立于当前系统的网络空间,其中的网络设备以及iptables规则等都是独立的,就好像进入了另外一个网络一样。不同网络命名空间中的设备是不同的,之间不能互相直接通讯。

    网络命名空间

    在 Linux 中,网络名字空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名字空间经常用来隔离网络设备和服务,只有拥有同样网络名字空间的设备,才能看到彼此。

    虚拟网络创建

    iproute2

    iproute2 is usually shipped in a package called iproute or iproute2 and consists of several tools, of which the most important are ip and tc. ip controls IPv4 and IPv6 configuration and tc stands for traffic control. Both tools print detailed usage messages and are accompanied by a set of manpages.

    创建新的网络命名空间

    使用命令

    $ ip netns add net0

    可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables,ebtables,等等。总之,与网络有关的组件都是独立的。

    ip命令需要root权限的,但是由于本文大量使用ip命令,于是笔者给ip命令添加了capability,使普通用户也能使用ip命令

    显示所有的虚拟网络命名空间

    ip netns list

    或者

    ls /var/run/netns/

    使用命令

    $ ip netns list
    net0

    可以看到我们刚才创建的网络环境

    通常情况下,一般我们用 ip netns add 添加新的 netns,然后我们可以用 ip netns list 查看所有的 netns。但有的时候进程的 netns 却并没有显式导出,ip netns list 无法列出它,比如 docker 的 container的网络空间。怎么办呢?答案是做个符号链接就可以了。

    ln -sf /proc/<pid>/ns/net /var/run/netns/$ns

    简要说明一下这个命令:每个进程的网络命名空间都是通过 proc 文件系统导出来了的,位于 /proc//ns/net (这个文件不可读,它只是相当于一个访问点);而 ip netns list 命令是从 /var/run/netns 这个路径读取netns列表的,因此直接将进程的命名空间链接到 /var/run/netns 目录下就可以了。

    进入虚拟网络环境

    使用命令

    $ ip netns exec net0 `command`

    我们可以在 net0 虚拟环境中运行任何命令

    $ ip netns exec net0 bash
    $ ip ad
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    这样我们可以在新的网络环境中打开一个shell,可以看到,新的网络环境里面只有一个lo设备,并且这个lo设备与外面的lo设备是不同的,之间不能互相通讯。

    设置虚拟网络环境net0的veth0设备处于激活状态

    ip netns exec net0 ip link set veth0 up

    为虚拟网络环境net0的veth0设备增加IP地址

    ip netns exec net0 ip address add 10.0.1.1/24 dev veth0

    连接两个网络环境

    新的网络环境里面没有任何网络设备,并且也无法和外部通讯,就是一个孤岛,通过下面介绍的这个方法可以把两个网络环境连起来,简单的说,就是在两个网络环境之间拉一根网线

    $ ip netns add net1

    先创建另一个网络环境net1,我们的目标是把net0与net1连起来

    $ ip link add type veth
    $ ip ad # address, show protocol (IP or IPv6) address on a device.
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    81: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
        link/ether 12:39:09:81:3a:dd brd ff:ff:ff:ff:ff:ff
    82: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
        link/ether 32:4f:fd:cc:79:1b brd ff:ff:ff:ff:ff:ff

    这里创建连一对veth虚拟网卡,类似pipe,发给veth0的数据包veth1那边会收到,发给veth1的数据包veth0会收到。就相当于给机器安装了两个网卡,并且之间用网线连接起来了

    $ ip link set veth0 netns net0
    $ ip link set veth1 netns net1

    这两条命令的意思就是把veth0移动到net0环境里面,把veth1移动到net1环境里面,我们看看结果

    $ ip ad
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    $ ip netns exec net0 ip ad
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    81: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
        link/ether 12:39:09:81:3a:dd brd ff:ff:ff:ff:ff:ff
    $ ip netns exec net1 ip ad
    1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    82: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
        link/ether 32:4f:fd:cc:79:1b brd ff:ff:ff:ff:ff:ff

    veth0 veth1已经在我们的环境里面消失了,并且分别出现在net0与net1里面。下面我们简单测试一下net0与net1的联通性

    $ ip netns exec net0 ip link set veth0 up
    $ ip netns exec net0 ip address add 10.0.1.1/24 dev veth0
    $ ip netns exec net1 ip link set veth1 up
    $ ip netns exec net1 ip address add 10.0.1.2/24 dev veth1

    分别配置好两个设备,然后用ping测试一下联通性:

    $ ip netns exec net0 ping -c 3 10.0.1.2
    PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
    64 bytes from 10.0.1.2: icmp_req=1 ttl=64 time=0.101 ms
    64 bytes from 10.0.1.2: icmp_req=2 ttl=64 time=0.057 ms
    64 bytes from 10.0.1.2: icmp_req=3 ttl=64 time=0.048 ms
    
    --- 10.0.1.2 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 1999ms
    rtt min/avg/max/mdev = 0.048/0.068/0.101/0.025 ms

    实践:一个稍微复杂的网络环境

    graph TD
    A[bridge] -->|10.0.1.1| B[net0]
    A[bridge] -->|10.0.1.2| C[net1]

    创建虚拟网络环境并且连接网线

    ip netns add net0
    ip netns add net1
    ip netns add bridge
    
    ip link add type veth
    ip link set dev veth0 name net0-bridge netns net0
    ip link set dev veth1 name bridge-net0 netns bridge
    
    ip link add type veth
    ip link set dev veth0 name net1-bridge netns net1
    ip link set dev veth1 name bridge-net1 netns bridge

    在bridge中创建并且设置br设备

    ip netns exec bridge brctl addbr br
    ip netns exec bridge ip link set dev br up
    ip netns exec bridge ip link set dev bridge-net0 up
    ip netns exec bridge ip link set dev bridge-net1 up
    ip netns exec bridge brctl addif br bridge-net0
    ip netns exec bridge brctl addif br bridge-net1

    然后配置两个虚拟环境的网卡

    ip netns exec net0 ip link set dev net0-bridge up
    ip netns exec net0 ip address add 10.0.1.1/24 dev net0-bridge
    
    ip netns exec net1 ip link set dev net1-bridge up
    ip netns exec net1 ip address add 10.0.1.2/24 dev net1-bridge

    测试

    $ ip netns exec net0 ping -c 3 10.0.1.2
    PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
    64 bytes from 10.0.1.2: icmp_req=1 ttl=64 time=0.121 ms
    64 bytes from 10.0.1.2: icmp_req=2 ttl=64 time=0.072 ms
    64 bytes from 10.0.1.2: icmp_req=3 ttl=64 time=0.069 ms
    
    --- 10.0.1.2 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 1999ms
    rtt min/avg/max/mdev = 0.069/0.087/0.121/0.025 ms

    配置lldpd检查线路链接情况

    随着虚拟网络环境增加,环境中网卡数量也在不断增加,经常会忘记环境中哪些网卡连接到哪里,通过 Link Layer Discovery Protocol,我们可以清楚看到每个网卡连接到了哪些环境中的哪个网卡。

    github 上有一个 lldp 在 linux 下的开源实现 implementation of IEEE 802.1ab (LLDP),通过在每个环境中起一个 lldp daemon,我们就可以实时查看每个网卡的连接情况。

    Bridge 上 lldp 的数据

    $ lldpcli show neighbors
    
    LLDP neighbors:
    
    Interface:    bridge-net0, via: LLDP, RID: 2, Time: 0 day, 00:06:53
      Chassis:
        ChassisID:    mac 82:be:2a:ec:70:69
        SysName:      localhost
        SysDescr:     net0
        Capability:   Bridge, off
        Capability:   Router, off
        Capability:   Wlan, off
      Port:
        PortID:       mac 82:be:2a:ec:70:69
        PortDescr:    net0-bridge
    
    Interface:    bridge-net1, via: LLDP, RID: 1, Time: 0 day, 00:06:53
      Chassis:
        ChassisID:    mac b2:34:28:b1:be:49
        SysName:      localhost
        SysDescr:     net1
        Capability:   Bridge, off
        Capability:   Router, off
        Capability:   Wlan, off
      Port:
        PortID:       mac b2:34:28:b1:be:49
        PortDescr:    net1-bridge

    参考文献

    1. Linux容器
    2. 网络虚拟化技术(一): Linux网络虚拟化
    3. Linux 上的基础网络设备详解-抽象网络设备的原理及使用
    4. Linux命名空间学习教程(一) UTS
    5. Linux命名空间学习教程(二) IPC
    6. Linux命名空间学习教程(三) PID
    7. Linux命名空间学习教程(四)NS(FS)
    8. Linux命名空间学习教程(五)NET
    9. iproute2
    10. Introduction to Linux namespaces – Part 5: NET
    展开全文
  • linux内核中网络空间的概念,即struct net表示内核网络的命名空间。网络系统在初始化的时候会初始化一个初始网络命名空间,即init_net命名空间。后续创建的net namespace命名空间会和init_net一起通过list项组织起来...

    0、概述

    linux内核中网络空间的概念,即struct net表示内核网络的命名空间。网络系统在初始化的时候会初始化一个初始网络命名空间,即init_net命名空间。后续创建的net namespace命名空间会和init_net一起通过list项组织起来,且每个网络设备都对应一个命名空间,同一命名空间下的网络设备通过dev_base_head组织在一起。组织结构如下:

    net内核结构

    1、struct net结构体

    [ include/net/net_namespace.h ]

    struct net {
    	atomic_t		passive;	/* To decided when the network
    						 * namespace should be freed.
    						 */
    	atomic_t		count;		/* To decided when the network
    						 *  namespace should be shut down.
    						 */
    	spinlock_t		rules_mod_lock;
    
    	atomic64_t		cookie_gen;
    
    	struct list_head	list;		/* list of network namespaces */
    	struct list_head	cleanup_list;	/* namespaces on death row */
    	struct list_head	exit_list;	/* Use only net_mutex */
    
    	struct user_namespace   *user_ns;	/* Owning user namespace */
    	struct idr		netns_ids;
    
    	struct ns_common	ns;
    
    	struct proc_dir_entry 	*proc_net;
    	struct proc_dir_entry 	*proc_net_stat;
    
    #ifdef CONFIG_SYSCTL
    	struct ctl_table_set	sysctls;
    #endif
    
    	struct sock 		*rtnl;			/* rtnetlink socket */
    	struct sock		*genl_sock;
    
    	struct list_head 	dev_base_head;
    	struct hlist_head 	*dev_name_head;
    	struct hlist_head	*dev_index_head;
    	unsigned int		dev_base_seq;	/* protected by rtnl_mutex */
    	int			ifindex;
    	unsigned int		dev_unreg_count;
    
    	/* core fib_rules */
    	struct list_head	rules_ops;
    
    
    	struct net_device       *loopback_dev;          /* The loopback */
    	struct netns_core	core;
    	struct netns_mib	mib;
    	struct netns_packet	packet;
    	struct netns_unix	unx;
    	struct netns_ipv4	ipv4;
    #if IS_ENABLED(CONFIG_IPV6)
    	struct netns_ipv6	ipv6;
    #endif
    #if IS_ENABLED(CONFIG_IEEE802154_6LOWPAN)
    	struct netns_ieee802154_lowpan	ieee802154_lowpan;
    #endif
    #if defined(CONFIG_IP_SCTP) || defined(CONFIG_IP_SCTP_MODULE)
    	struct netns_sctp	sctp;
    #endif
    #if defined(CONFIG_IP_DCCP) || defined(CONFIG_IP_DCCP_MODULE)
    	struct netns_dccp	dccp;
    #endif
    #ifdef CONFIG_NETFILTER
    	struct netns_nf		nf;
    	struct netns_xt		xt;
    #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
    	struct netns_ct		ct;
    #endif
    #if defined(CONFIG_NF_TABLES) || defined(CONFIG_NF_TABLES_MODULE)
    	struct netns_nftables	nft;
    #endif
    #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV6)
    	struct netns_nf_frag	nf_frag;
    #endif
    	struct sock		*nfnl;
    	struct sock		*nfnl_stash;
    #endif
    #ifdef CONFIG_WEXT_CORE
    	struct sk_buff_head	wext_nlevents;
    #endif
    	struct net_generic __rcu	*gen;
    
    	/* Note : following structs are cache line aligned */
    #ifdef CONFIG_XFRM
    	struct netns_xfrm	xfrm;
    #endif
    #if IS_ENABLED(CONFIG_IP_VS)
    	struct netns_ipvs	*ipvs;
    #endif
    #if IS_ENABLED(CONFIG_MPLS)
    	struct netns_mpls	mpls;
    #endif
    	struct sock		*diag_nlsk;
    	atomic_t		fnhe_genid;
    };

     

     

     

    https://blog.csdn.net/tanzhe2017/article/details/81002166

    https://blog.51cto.com/weiguozhihui/1584610

    https://blog.csdn.net/hhhhhyyyyy8/article/details/102641895

    展开全文
  • 1、什么是网络名字空间?  what are network namespaces? Generally speaking, an installation of Linux shares a single set of network interfaces and routing table entries. You can modify the routing ...
  • 一个关于Linux内部netns相关的实验,架构图如下: 实验环境准备 vmware workstation 12.0 Linux CentOS 7 ip:192.168.1.104 yum install qemu-kvm wget ...
  • linux 网络命名空间 Network namespaces

    万次阅读 2017-04-19 16:20:01
    Linux命名空间是一个相对较新的内核功能,对于实现容器至关重要。 命名空间将全局系统资源包装到一个抽象中,该抽象只会与命名空间中的进程绑定,从而提供资源隔离。 在本文中,我将讨论网络命名空间并展示一个实际...
  • Linux网络命名空间用以隔离Linux主机上的不同的网络环境。但是有时候,我们又需要从一个网络命名空间中访问另一个网络命名空间中的网络,这就需要用到虚拟网络设备。 虚拟网络设备(Virtual Network Device)是一种...
  • 从逻辑上说,网络命名空间网络栈的副本,有自己的网络设备、路由选择表、邻接表、Netfilter表、网络套接字、网络procfs条目、网络sysfs条目和其他网络资源。 网络命名空间可以营造出多个内核网络栈实例的假象。...
  • Linux系统上Open vSwitch具有网络命名空间的基本支持。允许ovs-vswitchd守护进程,在端口移动到另外的网络命名空间后,仍可继续跟踪其状态和统计信息。 如何工作 守护进程ovs-vswitchd运行在所谓的父辈网络命名...
  • namespace(命名空间)和cgroup是软件容器化(想想Docker)趋势中的两个主要内核技术。简单来说,cgroup是一种对进程进行统一的资源监控和限制,它控制着你可以使用多少系统资源(CPU,内存等)。而namespace是对全局...
  • linux网络命名空间

    2018-11-10 18:23:33
    创建两个网络命名空间 test1和test2 sudo ip netns add test1 sudo ip netns add test2 查看当前的网络命名空间 会显示出创建出来的test1 test2 sudo ip netns list 查看当前命名空间的信息 可以看到当前...
  • Linux网络编程

    2018-01-03 18:24:17
    Linux网络编程》内容分为4个部分:Linux程序设计基础部分、Linux用户空间网络编程部分、Linux内核网络编程部分以及综合案例部分。内容包含Linux系统概述、Linux编程环境、Linux文件系统简介、Linux下的进程和线程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,474
精华内容 1,789
关键字:

linux网络空间

linux 订阅