linux虚拟网络之Network Namespace与ip netns;Tun/Tap虚拟设备;veth pair虚拟网络设备;bridge虚拟网络设备

 一文总结虚拟网络设备 eth, tap/tun, veth-pair https://segmentfault.com/a/1190000018432766

linux虚拟网络设备--eth, tap/tun, veth-pair(九) https://blog.csdn.net/qq_20817327/article/details/116716429 (实际上是上一篇的转载)

 

linux的虚拟网络技术 https://blog.csdn.net/double_happy111/article/details/105578348
详解:Linux网络虚拟化技术 https://www.cnblogs.com/wxiaote/articles/10879327.html
Linux虚拟网络技术学习 https://baijiahao.baidu.com/s?id=1670280951685749429

 

====================================================================================================

复制代码
Network Namespace;ip netns命令;ip netns add netnamespace1 原理
=================================================================================
Network Namespace是Linux内核提供的功能,是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自网络栈信息。不管是虚拟机还是容器,运行的时候仿佛自己都在独立的网络中。
不同Network Namespace的资源相互不可见,彼此之间无法通信。


network namespace用来隔离网络设备, IP地址, 端口等. 每个namespace将会有自己独立的网络栈,路由表,防火墙规则,socket等。
每个新的network namespace默认有一个本地环回接口,除了lo接口外,所有的其他网络设备(物理/虚拟网络接口,网桥等)只能属于一个network namespace。每个socket也只能属于一个network namespace。
当新的network namespace被创建时,lo接口默认是关闭的,需要自己手动启动起

标记为"local devices"的设备不能从一个namespace移动到另一个namespace,比如loopback, bridge, ppp等,我们可以通过ethtool -k命令来查看设备的netns-local属性。
    [root@yefeng ~]# ethtool -k eth0 |grep local  
    netns-local: off [fixed]
    [root@yefeng ~]# ethtool -k lo |grep local
    netns-local: on [fixed]                     #这里“on”表示该设备不能被移动到其他network namespace

--------------------------------------------------------------------------------------------------------------------
ip netns命令:用于完成对 Network Namespace 的各种操作。默认情况下,Linux系统中是没有任何 Network Namespace的。
    Network Namespace相关目录/var/run/netns/

查看Network Namespace
    ip netns help                   #查看ip netns帮助
    ip netns list                   #查看创建的Network Namespace清单
    ip netns monitor                #这个命令意义真的不大,貌似只对Network Namespace的新增删除做监控,不会监控Network Namespace的修改操作
新增删除Network Namespace
    ip netns add MY_SPACE           #创建一个新的Network Namespace,该操作会在目录/var/run/netns/下创建一个新文件MY_SPACE(空文件)
    ip netns del MY_SPACE       
操作Network Namespace
    每个Network Namespace来说,它会有自己独立的网卡、路由表、ARP 表、iptables 等和网络相关的资源。
    进入Network Namespace执行命令并退出,这种操作方式与docker很像
    ip netns exec MY_SPACE ip addr                      #查看指定Network Namespace的网卡信息
    ip netns exec MY_SPACE ip link set lo up            #新创建的Network Namespace默认只有lo,而且是down状态
    ip netns exec MY_SPACE ping 127.0.0.1

    ip netns exec net0 `command`
    ip netns exec MY_SPACE bash     #在MY_SPACE中打开一个shell终端;直接这么操作体验很差,因为界面完全没有变化,就和在命令行输入bash一样,进入了另一个shell终端,但是肉眼却无法分辨,区别在于确实到了另一个Network Namespace
    ip netns exec ns0 /bin/bash --rcfile <(echo "PS1=\"ns0> \"")    #建议使用这种方式进入

--------------------------------------------------------------------------------------------------------------------
ip netns add netnamespace1 原理
    给namespace取名字其实就是创建一个文件,然后通过mount --bind将新创建的namespace文件和该文件绑定,就算该namespace里的所有进程都退出了,内核还是会保留该namespace,以后我们还可以通过这个绑定的文件来加入该namespace。

ip netns add netnamespace1 原理可以参考下面的脚本,也可以参考源码:https://github.com/shemminger/iproute2/blob/main/ip/ipnetns.c
------------下面的这一系列操作等同于执行了命令: ip netns add netnamespace1---------
$$     #当前Shell进程ID
[root@yefeng ~]# readlink /proc/$$/ns/net       #开始之前,获取一下默认network namespace的ID
net:[4026531956]

[root@yefeng ~]# sudo mkdir -p /var/run/netns   #ip netns将所有的文件放到了目录/var/run/netns下,所以我们这里重用这个目录,并且创建一个我们自己的文件netnamespace1
[root@yefeng ~]# sudo touch /var/run/netns/netnamespace1    #创建一个用于绑定network namespace的文件

[root@yefeng ~]# sudo unshare --net bash        #创建新的network namespace,并在新的namespace中启动新的bash
[root@yefeng ~]# readlink /proc/$$/ns/net       #查看新的namespace ID
net:[4026532324]

[root@yefeng ~]# mount --bind /proc/$$/ns/net /var/run/netns/netnamespace1      #bind当前bash的namespace文件到上面创建的文件上
[root@yefeng ~]# ls -i /var/run/netns/netnamespace1     #通过ls -i命令可以看到文件netnamespace1的inode号和namespace的编号相同,说明绑定成功
4026532324 /var/run/netns/netnamespace1                 #4026532324------net:[4026532324]

[root@yefeng ~]# exit                                   #退出新创建的bash
exit
[root@yefeng ~]# ls -i /var/run/netns/netnamespace1     #可以看出netnamespace1的inode没变,说明我们使用了bind mount后,虽然新的namespace中已经没有进程了,但这个新的namespace还存在
4026532324 /var/run/netns/netnamespace1

------------下面的nsenter命令等同于执行了命令: ip netns exec netnamespace1 bash---------

[root@yefeng ~]# readlink /proc/$$/ns/net               
net:[4026531956]
#我们可以通过nsenter命令再创建一个新的bash,并将它加入netnamespace1所关联的namespace(net:[4026532324])
[root@yefeng ~]# sudo nsenter --net=/var/run/netns/netnamespace1 bash       #等同于执行了命令: ip netns exec netnamespace1 bash
[root@yefeng ~]# readlink /proc/$$/ns/net
net:[4026532324]
Network Namespace;ip netns命令;ip netns add netnamespace1 原理
复制代码

Linux Namespace系列(06):network namespace (CLONE_NEWNET) :https://segmentfault.com/a/1190000006912930

====================================================================================================

复制代码
Tun/Tap虚拟设备
====================================================================================================
Tun/Tap虚拟设备和物理设备eth0,它们的一端虽然都连着协议栈,但另一端不一样:
        eth0的另一端是物理网络;
        tun0的另一端是一个用户层的程序,协议栈发给tun0的数据包能被这个应用程序读取到,并且应用程序能直接向tun0写数据。

tun/tap设备的用处是将协议栈中的部分数据包转发给用户空间的应用程序,给用户空间的程序一个处理数据包的机会。于是比较常用的数据压缩,加密等功能就可以在应用程序B里面做进去,
    tun/tap设备最常用的场景是VPN,包括tunnel以及应用层的IPSec等

用户层程序通过tun设备只能读写IP数据包;用户层程序通过tap设备能读写链路层数据包。类似于普通socket和raw socket的差别一样,处理数据包的格式不一样。
    tun设备是3层设备
    tap设备是2层设备
Tun/Tap虚拟设备
复制代码

Linux虚拟网络设备之tun/tap https://segmentfault.com/a/1190000009249039
linux虚拟网络设备之tun/tap(一) https://blog.csdn.net/qq_20817327/article/details/106253352 (实际上是上一篇的转载)

====================================================================================================

复制代码
veth pair
=================================================================================
veth pair全称是 Virtual Ethernet Pair,是一个成对的端口,所有从这对端口一端进入的数据包都将从另一端出来,反之也是一样
    整个veth的实现非常简单,参考源代码drivers/net/veth.c的实现。


新增删除veth pair
    ip link help
    ip link add type veth                               #增加一条veth类型的link,名字随机
    ip link delete veth3                                #任意删除一端的接口,这一条link就被删除了
    ip link add NAME1 type veth peer name NAME2         #增加一条veth类型的link,指定两端的名字
操作veth pair
    ip link set veth0 netns ns1                         #将veth pair的一端veth0放入Network Namespace空间ns1中,相当于一条链路的一端连接到ns1网络空间
    ip netns exec ns1 ip link set veth0 up              #新创建的veth pair的端口默认down,需要手动up
    ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth0 #为veth0配置ip
    ip netns exec ns0 ip link set dev veth1 name eth0   #veth1重命名为eth0
    以上操作因为veth0在ns1中;若veth0就在host本地,那么可以直接操作:
    ip link set veth0 up 
    ip addr add 10.0.0.1/24 dev veth0

------------------------------------------------------------------------
如何查看veth对端,并确认端口所在的网卡
    1.首先需要在宿主机本地,各个Network Namespace,docker中都进行查看,确认端口在哪里
        命令ip addr
        ip netns list  ; ip netns exec MY_SPACE ip addr
    2.确认哪2个端口是一对
        方法1:ip addr命令的结果(10: NAME1@if9)表示本端端口id为10,对端端口id为9
        方法2:ip netns exec MY_SPACE ethtool -S NAME1      #查看指定端口NAME1的信息,结果显示(peer_ifindex: 9),即对端端口为9
            ethtool -S NAME1 

    [root@yefeng ~]# ip a | grep veth       #新创建的veth pair的设备名称:本端设备名称@对端设备名称;例如:veth0@veth1
    4: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    5: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    [root@yefeng ~]# ip a | grep veth       #当对端设备被移动至其他namespace后,veth pair的设备命令:本端设备名称@对端设备编号;例如:veth0@if5
    4: veth0@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000

    思路:
        1.查看所有的namespace内中网络设备;
        2.根据网络设备编号的对应关系确认veth pair。
veth pair
复制代码
复制代码
实验1:本地网卡通过veth pair打通到一个Network Namespace,即实现本地ip 10.0.0.1 ping通自定义Network Namespace的ip 10.0.0.2
    1.创建新的Network Namespace,名称为ns0
        ip netns add ns0
    2.创建veth pair端口对,使用默认名称veth0、veth1
        ip link add type veth
    3.veth0规划在本地,所以无需移动;将veth0 up,并设置ip
        ip link set dev veth0 up
        ip addr add 10.0.0.1/24 dev veth0 
    4.将veth1移动至ns0中,同时将veth1 up,并设置ip
        ip link set veth1 netns ns0
        ip netns exec ns0 ip link set veth1 up
        ip netns exec ns0 ip addr add 10.0.0.2/24 dev veth1
    5.ping包测试
        ip netns exec ns0 ping 10.0.0.1      #若要测试ping自己,那么需要把回环口先up
        ping 10.0.0.2
    6.查看命令
        ip netns list
        ip addr
        ip netns exec ns0 ip addr
实验1:本地网卡通过veth pair打通到一个Network Namespace,即实现本地ip 10.0.0.1 ping通自定义Network Namespace的ip 10.0.0.2
复制代码
复制代码
实验2:2个Network Namespace通过veth pair打通
    1.创建2个Network Namespace
        ip netns add ns0
        ip netns add ns1
    2.创建veth pair端口对,使用默认名称veth0、veth1
        ip link add type veth
    3.将veth1移动至ns0中,同时将veth0 up,并设置ip
        ip link set veth0 netns ns0
        ip netns exec ns0 ip link set veth0 up
        ip netns exec ns0 ip addr add 10.0.0.1/24 dev veth0
    4.将veth1移动至ns1中,同时将veth1 up,并设置ip
        ip link set veth1 netns ns1
        ip netns exec ns1 ip link set veth1 up
        ip netns exec ns1 ip addr add 10.0.0.2/24 dev veth1
    5.ping包测试
        ip netns exec ns0 ping 10.0.0.2      #若要测试ping自己,那么需要把回环口先up
        ip netns exec ns1 ping 10.0.0.1
    6.查看命令
        ip netns list
        ip addr
        ip netns exec ns0 ip addr
        ip netns exec ns1 ip addr
实验2:2个Network Namespace通过veth pair打通
复制代码

Linux虚拟网络设备之veth      https://segmentfault.com/a/1190000009251098

linux虚拟网络设备之veth(二) https://blog.csdn.net/qq_20817327/article/details/106254509 (实际上是上一篇的转载)

 ====================================================================================================

复制代码
bridge虚拟网络设备
==================================================================================================
bridge是一个虚拟网络设备,所以具有网络设备的特征,可以配置IP、MAC地址等;其次,bridge是一个虚拟交换机,和物理交换机有类似的功能。
    普通linux网络设备只有两端,从一端进来的数据会从另一端出去,如物理网卡从外面网络中收到的数据会转发给内核协议栈,而从协议栈过来的数据会转发到外面的物理网络中。
    bridge有多个端口,数据可以从任何端口进来,进来之后从哪个口出去和物理交换机的原理差不多,要看mac地址。
    新创建的网桥,只有一个端口,连接到内核协议栈

bridge是建立在从设备上(物理设备、虚拟设备、vlan设备等,即attach一个从设备,类似于现实世界中的交换机和一个用户终端之间连接了一根网线),并且可以为bridge配置一个IP(参考LinuxBridge MAC地址行为),这样该主机就可以通过这个bridge设备与网络中的其他主机进行通信了。
另外它的从设备被虚拟化为端口port,它们的IP及MAC都不在可用,且它们被设置为接受任何包,最终由bridge设备来决定数据包的去向:接收到本机、转发、丢弃、广播。

-----------------------------------------------------------
veth0加入到网桥bridge后的变化:
    1.br0和veth0之间连接起来了,并且是双向的通道
    2.协议栈和veth0之间变成了单通道,协议栈能发数据给veth0,但veth0从外面收到的数据不会转发给协议栈
    3.br0的mac地址变成了veth0的mac地址(br0如果没有指定hw MAC, br0的MAC地址会根据bridge中port的变化,自动选择port中最小的一个MAC地址作为br0的MAC地址。br0只能指定port中有的interface的MAC作为br0的MAC地址。)

bridge特性:当一个设备绑定到bridge后,那么该设备配置的IP将失效。linux开源网络全栈详解P33
    根据“veth0加入到网桥bridge后的变化”,假设veth0仍然配置有IP 10.0.0.1
    1.从veth0接收到访问10.0.0.1的数据包,因为veth0和br0有双向通道,veth0和网络协议栈之间只有协议栈到veth0的单向通道,所以数据包会被转发给网桥br0
    2.网桥有两种可能:a.未配置IP;b.配置非10.0.0.1的IP
        最终会因为以上原因,协议栈无法接受到数据

-----------------------------------------------------------      
通过veth pair可以打通2个Network Namespace,相当于打通2台虚拟机
而通过veth pair+网桥,则可以组成一个网桥网络
Linux内核是通过一个虚拟的网桥设备(Net Device)来实现桥接的。这个虚拟设备可以绑定若干个以太网接口设备,从而将它们桥接起来。


网桥能创建在本地中,当然也能在新的Network Namespace中创建网桥,只是这么做更麻烦,也更绕
    1.需要在创建多个Network Namespace和多对veth pair,并且将veth pair端口移动到规划的Network Namespace中
    2.在一个规划创建网桥的Network Namespace中创建网桥,并将veth pair端口接入到网桥中
bridge虚拟网络设备
复制代码
复制代码
虚拟网桥bridge的相关操作:brctl命令、ip link命令;配置bridge开机激活
=================================================================================
brctl命令:用于操作网桥,这个命令来自 bridge-utils 这个包。

查看网桥
    brctl show                          #查看所有网桥,以及网桥中绑定的接口信息
    modprobe bridge                     #加载bridge模块
    echo "1">/proc/sys/net/ipv4/ip_forward  #开启内核转发
    lsmod |grep bridge
创建、删除网桥
    brctl addbr br0                     #创建新网桥
    brctl delbr br0
    ip link add br1 type bridge         #ip link也能创建网桥,功能同上
    ip link add name br0 type bridge
将网络设备接入到网桥(#bridge特性:当一个设备绑定到bridge后,那么该设备配置的IP将失效。linux开源网络全栈详解P33)
    brctl addif br0 veth0               #并不是创建接口,而是将已有的接口接入到网桥中
    brctl addif br0 eth0 eth1           #支持同时操作多张网卡
    ip link set dev veth0 master br0    #功能同上,将接口接入到网桥中
查看网桥的从设备
    brctl show
    bridge link                         #可用,与brctl show命令互补
    ip a                                #可以看,但是不直观
网桥的其他操作
    ip link set br0 up                  #网桥默认down状态,该操作使网桥up
    ip link set dev br0 up              #网桥默认down状态,该操作使网桥up
    ip addr add 10.0.0.2/24 dev br0     #网桥是可以配置ip的,相当于具备管理功能的二层交换机
    ifconfig br0 10.10.1.1 netmask 255.255.0.0 up
    brctl showstp br0                   #查看stp
    brctl stp br0 off                   #关闭stp
    brctl showmacs br0                  #查看mac表
    brctl -h

--------------------------------------------------
配置bridge开机激活
    #https://blog.csdn.net/sld880311/article/details/77840343


    root@ubuntu:/home/sunld# echo "modprobe bridge">>/etc/rc.local

    #配置eth0 eth1 br0开机启动,eth0,eth1未设置IP信息,在启动br0网卡时,开启了eth0,eth1的混杂模式,并桥接了它们。
    vim /etc/network/interfaces

    auto lo eth0 eth1 br0
    iface lo inet loopback
    iface br0 inet static
    address 10.10.10.1
    netmask 255.255.0.0
    gateway 10.10.10.254
    pre-up ip link set eth0 promisc on
    pre-up ip link set eth1 promisc on
    pre-up echo "1">/proc/sys/net/ipv4/ip_forward   
    bridge_ports eth0 eth1
虚拟网桥bridge的相关操作:brctl命令、ip link命令;配置bridge开机激活
复制代码
复制代码
bridge常用场景
以下两张图看起来非常相似,但是veth是一对的,容器内的eth0其实是veth;而虚拟机的eth0就是虚拟机模拟的,tun/tap设备通过某种方式连接到虚拟机网卡(个人理解)
=================================================================================================
虚拟机
虚拟机通过tun/tap或者其它类似的虚拟网络设备,将虚拟机内的网卡同br0连接起来,这样就达到和真实交换机一样的效果,虚拟机发出去的数据包先到达br0,然后由br0交给eth0发送出去,数据包都不需要经过host机器的协议栈,效率高。

+----------------------------------------------------------------+-----------------------------------------+-----------------------------------------+
|                          Host                                  |              VirtualMachine1            |              VirtualMachine2            |
|                                                                |                                         |                                         |
|       +------------------------------------------------+       |       +-------------------------+       |       +-------------------------+       |
|       |             Network Protocol Stack             |       |       |  Network Protocol Stack |       |       |  Network Protocol Stack |       |
|       +------------------------------------------------+       |       +-------------------------+       |       +-------------------------+       |
|                          ↑                                     |                   ↑                     |                    ↑                    |
|..........................|.....................................|...................|.....................|....................|....................|
|                          ↓                                     |                   ↓                     |                    ↓                    |
|                     +--------+                                 |               +-------+                 |                +-------+                |
|                     | .3.101 |                                 |               | .3.102|                 |                | .3.103|                |
|        +------+     +--------+     +-------+                   |               +-------+                 |                +-------+                |
|        | eth0 |<--->|   br0  |<--->|tun/tap|                   |               | eth0  |                 |                | eth0  |                |
|        +------+     +--------+     +-------+                   |               +-------+                 |                +-------+                |
|            ↑             ↑             ↑                       |                   ↑                     |                    ↑                    |
|            |             |             +-------------------------------------------+                     |                    |                    |
|            |             ↓                                     |                                         |                    |                    |
|            |         +-------+                                 |                                         |                    |                    |
|            |         |tun/tap|                                 |                                         |                    |                    |
|            |         +-------+                                 |                                         |                    |                    |
|            |             ↑                                     |                                         |                    |                    |
|            |             +-------------------------------------------------------------------------------|--------------------+                    |
|            |                                                   |                                         |                                         |
|            |                                                   |                                         |                                         |
|            |                                                   |                                         |                                         |
+------------|---------------------------------------------------+-----------------------------------------+-----------------------------------------+
             ↓
     Physical Network  (192.168.3.0/24)

================================================================================================
docker
由于容器运行在自己单独的network namespace里面,所以都有自己单独的协议栈,情况和上面的虚拟机差不多,但它采用了另一种方式来和外界通信:
+----------------------------------------------------------------+-----------------------------------------+-----------------------------------------+
|                          Host                                  |              Container 1                |              Container 2                |
|                                                                |                                         |                                         |
|       +------------------------------------------------+       |       +-------------------------+       |       +-------------------------+       |
|       |             Network Protocol Stack             |       |       |  Network Protocol Stack |       |       |  Network Protocol Stack |       |
|       +------------------------------------------------+       |       +-------------------------+       |       +-------------------------+       |
|            ↑             ↑                                     |                   ↑                     |                    ↑                    |
|............|.............|.....................................|...................|.....................|....................|....................|
|            ↓             ↓                                     |                   ↓                     |                    ↓                    |
|        +------+     +--------+                                 |               +-------+                 |                +-------+                |
|        |.3.101|     |  .9.1  |                                 |               |  .9.2 |                 |                |  .9.3 |                |
|        +------+     +--------+     +-------+                   |               +-------+                 |                +-------+                |
|        | eth0 |     |   br0  |<--->|  veth |                   |               | eth0  |                 |                | eth0  |                |
|        +------+     +--------+     +-------+                   |               +-------+                 |                +-------+                |
|            ↑             ↑             ↑                       |                   ↑                     |                    ↑                    |
|            |             |             +-------------------------------------------+                     |                    |                    |
|            |             ↓                                     |                                         |                    |                    |
|            |         +-------+                                 |                                         |                    |                    |
|            |         |  veth |                                 |                                         |                    |                    |
|            |         +-------+                                 |                                         |                    |                    |
|            |             ↑                                     |                                         |                    |                    |
|            |             +-------------------------------------------------------------------------------|--------------------+                    |
|            |                                                   |                                         |                                         |
|            |                                                   |                                         |                                         |
|            |                                                   |                                         |                                         |
+------------|---------------------------------------------------+-----------------------------------------+-----------------------------------------+
             ↓
     Physical Network  (192.168.3.0/24)
bridge常用场景
复制代码

 

复制代码
实验3:本地网卡通过新建网桥打通到一个Network Namespace
    1.创建新的Network Namespace,名称为ns0
        ip netns add ns0
    2.创建veth pair端口对2对,使用默认名称veth0、veth1;veth2、veth3
        ip link add type veth
        ip link add type veth
    3.创建新网桥br0,并将网桥up
        brctl addbr br0
        ip link set dev br0 up
    4.veth0规划在本地,veth1规划在网桥br0上
        ip link set dev veth0 up
        ip link set dev veth1 up
        brctl addif br0 veth1
    5.veth2规划在网桥上,veth3规划在ns0中
        ip link set dev veth2 up
        brctl addif br0 veth2
        ip link set veth3 netns ns0
        ip netns exec ns0 ip link set veth3 up
    6.配置IP(挂在网桥上的veth无需配置IP)
        ip addr add 10.0.0.1/24 dev veth0 
        ip netns exec ns0 ip addr add 10.0.0.2/24 dev veth3
    7.ping包测试
        ping 10.0.0.2
        ip netns exec ns0 ping 10.0.0.1  #若要测试ping自己,那么需要把回环口先up
    8.查看命令
        ip netns list
        ip addr
        ip netns exec ns0 ip addr
        brctl show 
实验3:本地网卡通过新建网桥打通到一个Network Namespace
复制代码
复制代码
实验4:3个Network Namespace:其中ns1/ns3配置ip,模拟设备;ns2仅配置网桥,充当交换机
1.创建新的Network Namespace,名称为ns1、ns2、ns3
    ip netns add ns1
    ip netns add ns2
    ip netns add ns3
2.创建veth pair端口对2对,使用默认名称veth0、veth1;veth2、veth3
    ip link add type veth
    ip link add type veth
3.规划veth0在ns1中,将veth0放入到ns1中,并配置IP
    ip link set veth0 netns ns1
    ip netns exec ns1 ip link set veth0 up
    ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth0
4.规划veth3在ns3中,将veth3放入到ns3中,并配置IP
    ip link set veth3 netns ns3
    ip netns exec ns3 ip link set veth3 up
    ip netns exec ns3 ip addr add 10.0.0.3/24 dev veth3
5.ns2创建网桥,并将规划veth1、veth2划入
    ip netns exec ns2 brctl addbr br0
    ip netns exec ns2 ip link set dev br0 up
    ip link set veth1 netns ns2
    ip netns exec ns2 ip link set veth1 up
    ip netns exec ns2 brctl addif br0 veth1
    ip link set veth2 netns ns2
    ip netns exec ns2 ip link set veth2 up
    ip netns exec ns2 brctl addif br0 veth2

    ip netns exec ns2 ip addr add 10.0.0.2/24 dev br0       #网桥也是可以配置ip的。。
    ip netns exec ns2 ip addr add 10.0.0.22/24 dev veth1    #挂在网桥上的veth1口也是能配置ip的,测试可以ping通,而且即使配置了ip,也还是可以进行二层转发。。。这一点特性与交换机完全不一样了
6.ping包测试
    ip netns exec ns1 ping 10.0.0.3     #若要测试ping自己,那么需要把回环口先up
7.查看命令
    ip netns list
    ip addr
    ip netns exec ns1 ip addr
    ip netns exec ns2 brctl show 
实验4:3个Network Namespace:其中ns1/ns3配置ip,模拟设备;ns2仅配置网桥,充当交换机
复制代码

Linux虚拟网络设备之bridge(桥) https://segmentfault.com/a/1190000009491002
Linux虚拟网络设备之bridge(桥)(三) https://blog.csdn.net/qq_20817327/article/details/106262446 (实际上是上一篇的转载)
Linux-虚拟网络设备-LinuxBridge https://blog.csdn.net/sld880311/article/details/77840343

 

posted @   雲淡風輕333  阅读(558)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示