【Docker】Linux网桥连接多个命名空间

news2024/12/23 19:08:36

veth实现了点对点的虚拟连接,可以通过veth连接两个namespace,如果我们需要将3个或者多个namespace接入同一个二层网络时,就不能只使用veth了。

在物理网络中,如果需要连接多个主机,我们会使用bridge(网桥),或者又称为交换机。Linux也提供了网桥的虚拟实现。下面我们试验通过Linux bridge来连接三个namespace。

创建3个Network Namespace

$ ip netns add ns0

$ ip netns add ns1

$ ip netns add ns2

$ ip netns list
ns2
ns1
ns0

创建3对veth pair

$ ip link add type veth

$ ip link add type veth

$ ip link add type veth

$ ip link
23: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 02:31:8e:3f:e3:41 brd ff:ff:ff:ff:ff:ff
24: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether a6:fa:24:af:7e:25 brd ff:ff:ff:ff:ff:ff
25: veth2@veth3: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether b6:44:af:1c:9d:34 brd ff:ff:ff:ff:ff:ff
26: veth3@veth2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 02:89:cd:6d:91:5e brd ff:ff:ff:ff:ff:ff
27: veth4@veth5: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether d6:44:b0:6d:f2:af brd ff:ff:ff:ff:ff:ff
28: veth5@veth4: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 4e:9d:92:7f:97:6e brd ff:ff:ff:ff:ff:ff

创建网桥

创建名为bridge0的网桥

$ ip link add bridge0 type bridge

启动bridge0网桥:

$ ip link set dev bridge0 up

查询bridge0网桥:

$ ip addr
29: bridge0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether c2:a8:ec:6b:f5:9e brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.1/16 brd 172.16.255.255 scope global bridge0
       valid_lft forever preferred_lft forever

绑定网口

Network Namespace、veth pair、bridge都创建完毕,下面通过命令将每对veth pair的一端绑定在network namespace,另一端绑定在docker0网桥上,用于实现网络互通。

配置第一个网络命名空间ns0:

// 将veth1添加进ns0
$ ip link set dev veth1 netns ns0

// 为ns0中的veth1配置ip
$ ip netns exec ns0 ip addr add 172.16.0.11/16 dev veth1

// 启动ns0中的veth1网卡
$ ip netns exec ns0 ip link set dev veth1 up

// 将veth0添加加网桥bridge0
$ ip link set dev veth0 master bridge0

// 启动veth0网卡
$ ip link set dev veth0 up

$ ip netns exec ns0 ip addr
24: veth1@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether a6:fa:24:af:7e:25 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.0.11/16 scope global veth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a4fa:24ff:feaf:7e25/64 scope link
       valid_lft forever preferred_lft forever

配置第二个网络命名空间ns1:

// 将veth3添加进ns1
$ ip link set dev veth3 netns ns1

// 为ns1中的veth3配置ip
$ ip netns exec ns1 ip addr add 172.16.0.33/16 dev veth3

// 启动ns1中的veth3网卡
$ ip netns exec ns1 ip link set dev veth3 up

// 将veth2添加加网桥bridge0
$ ip link set dev veth2 master bridge0

// 启动veth2网卡
$ ip link set dev veth2 up

$ ip netns exec ns1 ip addr
26: veth3@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 02:89:cd:6d:91:5e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.0.33/16 scope global veth3
       valid_lft forever preferred_lft forever
    inet6 fe80::89:cdff:fe6d:915e/64 scope link
       valid_lft forever preferred_lft forever

配置第三个网络命名空间ns2:

// 将veth5添加进ns2
$ ip link set dev veth5 netns ns2

// 为ns2中的veth5配置ip
$ ip netns exec ns2 ip addr add 172.16.0.55/16 dev veth5

// 启动ns2中的veth5网卡
$ ip netns exec ns2 ip link set dev veth5 up

// 将veth4添加加网桥bridge0
$ ip link set dev veth4 master bridge0

// 启动veth4网卡
$ ip link set dev veth4 up

$ ip netns exec ns2 ip addr
28: veth5@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 4e:9d:92:7f:97:6e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.0.55/16 scope global veth5
       valid_lft forever preferred_lft forever
    inet6 fe80::4c9d:92ff:fe7f:976e/64 scope link
       valid_lft forever preferred_lft forever

验证多个namespace之间的通信

$ ip netns exec ns0 ping 172.16.0.33 -c 2
PING 172.16.0.33 (172.16.0.33) 56(84) bytes of data.
64 bytes from 172.16.0.33: icmp_seq=1 ttl=64 time=0.026 ms
64 bytes from 172.16.0.33: icmp_seq=2 ttl=64 time=0.038 ms

--- 172.16.0.33 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.026/0.032/0.038/0.006 ms

$ ip netns exec ns0 ping 172.16.0.55 -c 2
PING 172.16.0.55 (172.16.0.55) 56(84) bytes of data.
64 bytes from 172.16.0.55: icmp_seq=1 ttl=64 time=0.047 ms
64 bytes from 172.16.0.55: icmp_seq=2 ttl=64 time=0.036 ms

--- 172.16.0.55 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.036/0.041/0.047/0.008 ms

通过上面的试验,我们验证了可以使用Linux bridge来将多个namespace连接到同一个二层网络中。你可能注意到,在分配IP地址的时候,我们只为veth在namespace中那一端的虚拟网卡分配了地址,而没有为加入bridge那一端分配地址。这是因为bridge是工作在二层上的,只会处理以太包,包括ARP解析,以太数据包的转发和泛洪;并不会进行三层(IP)的处理,因此不需要三层的IP地址。

使用brctl

上面我们是借助ip link来创建网桥的,要想更好的操作网桥可以使用brctl,这个命令来自bridge-utils安装包。

brctl相关的命令如下:

$ brctl help
never heard of command [help]
Usage: brctl [commands]
commands:
        addbr           <bridge>                add bridge
        delbr           <bridge>                delete bridge
        addif           <bridge> <device>       add interface to bridge
        delif           <bridge> <device>       delete interface from bridge
        hairpin         <bridge> <port> {on|off}        turn hairpin on/off
        setageing       <bridge> <time>         set ageing time
        setbridgeprio   <bridge> <prio>         set bridge priority
        setfd           <bridge> <time>         set bridge forward delay
        sethello        <bridge> <time>         set hello time
        setmaxage       <bridge> <time>         set max message age
        setpathcost     <bridge> <port> <cost>  set path cost
        setportprio     <bridge> <port> <prio>  set port priority
        show            [ <bridge> ]            show a list of bridges
        showmacs        <bridge>                show a list of mac addrs
        showstp         <bridge>                show bridge stp info
        stp             <bridge> {on|off}       turn stp on/off

查看网桥绑定的端口

使用brctl show命令来查询网桥下绑定的网卡。

$ brctl show
bridge name     bridge id               STP enabled     interfaces
bridge0         8000.02318e3fe341       no              veth0
                                                        veth2
                                                        veth4

给bridge删除接口

使用brctl delif可以给bridge删除接口。

$ brctl delif bridge0 veth0

$ brctl show bridge0
bridge name     bridge id               STP enabled     interfaces
bridge0         8000.327eef22246d       no              veth2
                                                        veth4

给bridge增加接口

使用brctl addif可以给bridge增加接口。

$ brctl addif bridge0 veth0

$ brctl show bridge0
bridge name     bridge id               STP enabled     interfaces
bridge0         8000.327eef22246d       no              veth0
                                                        veth2
                                                        veth4

创建网桥

使用brctl addbr可以创建网桥。

$ brctl addbr bridge1

$ brctl show
bridge name     bridge id               STP enabled     interfaces
bridge0         8000.327eef22246d       no              veth0
                                                        veth2
                                                        veth4
bridge1         8000.000000000000       no

相当于命令ip link add bridge1 type bridge

删除网桥

使用brctl delbr可以删除网桥。

$ brctl delbr bridge1

$ brctl show
bridge name     bridge id               STP enabled     interfaces
bridge0         8000.327eef22246d       no              veth0
                                                        veth2
                                                        veth4

相当于命令ip link delete bridge1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1139359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第三十四天丨 贪心算法part05

435. 无重叠区间 思路 为了让区间尽可能的重叠&#xff0c;我按照左边界排序&#xff0c;从左向右记录重叠区间的个数。最后直接返回记录的重叠区间的个数就行了。 本题其实和昨天做的 ‘用最少数量的箭引爆气球’ 的思路整体是一样的&#xff0c;忘记思路可用看昨天的题目笔…

JavaScript 中 BOM 基础知识有哪些?

浏览器对象模型&#xff08;Browser Object Model&#xff0c;简称 BOM&#xff09;是 JavaScript 的组成部分之一&#xff0c;BOM 赋予了 JavaScript 程序与浏览器交互的能力。 window 对象是 BOM 的核心&#xff0c;用来表示当前浏览器窗口&#xff0c;其中提供了一系列用来…

创新领航 | 竹云参编《基于区块链的数据资产评估实施指南》正式发布!

10月25日&#xff0c;由深圳数宝数据服务股份有限公司和深圳职业技术大学提出&#xff0c;中国科学院深圳先进技术研究院、中国电子技术标准化研究院、中国&#xff08;天津&#xff09;自由贸易试验区政策与产业创新发展局、网络空间治理与数字经济法治&#xff08;长三角&…

称球问题之十二个球有一个次品不知轻重三次称出

使用穷举法来解&#xff1a; 12个球分A1234、B1234、C1234 1、A1234B1234→坏在C1234 1.1、A123C123→坏在C4 1.2、A123<C123→坏在C123&#xff0c;且知坏的重 1.2.1、C1C2→坏在C3 1.2.2、C1<C2→坏在C2 1.2.3、C1>C2→坏在C1 1.3、A123>C123→坏在C123&…

24位AD转换器16路模拟信号转RS-485/232,数据采集A/D转换模块 YL29

特点&#xff1a; ● 16路模拟信号采集&#xff0c;隔离转换 RS-485/232输出 ● 采用24位AD转换器&#xff0c;测量精度优于0.05% ● 通过RS-485/232接口可以程控校准模块精度 ● 信号输入 / 输出之间隔离耐压3000VDC ● 宽电源供电范围&#xff1a;8 ~ 32VDC ● 可靠性高…

申请流量卡时,运营商到底审核什么?

当我们在网上申请流量卡时&#xff0c;会有一个运营商审核的过程&#xff0c;只有运营商审核通过后才会发卡&#xff0c;那么问题来了&#xff0c;运营商审核&#xff0c;到底是审核的什么呢&#xff1f; 申请流量卡时&#xff0c;运营商的审核是非常严格的&#xff0c;如果不…

【开源】基于SpringBoot的天然气工程业务管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…

TypeError: lineplot() takes from 0 to 1 positional arguments but 2 were given

使用pyplot生成图形 from matplotlib import pyplot as plt import pandas as pd import seaborn as sns import numpy as np# 设置中文字体 plt.rcParams[font.sans-serif] [SimHei] sns.set_style({font.sans-serif:[simhei, Arial]})# 加载数据 hr pd.read_csv(data/hr.c…

从【臀部监控】到【电脑监控软件】,企业如何在隐私权与管理权博弈中找到平衡

【臀部监控】 依稀记得在2021年初某个高科技产品的爆火&#xff0c;惹得各大媒体网站争相报道。 起因是一位杭州网友在论坛上发帖&#xff0c;不久前公司给员工发放了一批高科技坐垫。 这个坐垫能自动感应心跳、呼吸在内的诸多人体数据&#xff0c;还能提醒人保持正确坐姿以及…

超全面测评!2023年最常用的15款原型设计工具

在互联网和软件行业中&#xff0c;原型设计是产品经理、交互设计师以及运营人员等职位必不可少的一门技能。原型设计工具的重要性也是人尽皆知&#xff0c;这都是因为原型设计工具是帮助设计者表达产品想法、功能设定及流程逻辑的最佳方式。 今天就为大家带来原型设计工具的相…

电脑扬声器未插入?4个方法帮你恢复声音!

“太奇怪了吧&#xff0c;我的电脑扬声器一直显示未插入&#xff0c;我使用电脑的时候也是一直都没有声音。这是为什么呢&#xff1f;我应该怎么解决这个问题呀&#xff1f;” 我们使用电脑播放音频或视频时&#xff0c;都需要用到电脑扬声器。如果扬声器无法播放声音&#xff…

ERP管理系统的运作流程是怎样的?

ERP管理系统的运作流程是怎样的&#xff1f; 下文中用到的图片和系统&#xff0c;都来自于我们公司正在用的软件——简道云进销存软件 这是我们团队搭建的模板&#xff0c;需要的可以自取&#xff0c;可以直接使用&#xff0c;也可以在模板的基础上自行搭建 ERP管理系统模板&…

排序整理2

一、一些概念 排序方法是“稳定的”&#xff1a;假设两个元素相等&#xff0c;若在排序后的序列中&#xff0c;排序前就在前面的元素仍在前面&#xff0c;则称所用的排序方法是稳定的&#xff1b;反之&#xff0c;若排序后两个相等元素调换相对位置&#xff0c;则称所用的排序…

直播切片想要快速批量制作应该怎么做?

账号准备是启动直播切片的第一步。要求账号拥有1000粉丝并完成实名认证&#xff0c;因为只有达到1000粉才能开通橱窗进行带货。这是最基本的要求。 接下来是获得授权。与大IP工作室合作并取得授权是免费的&#xff01;在每个大IP工作室或切片授权号上留意统一的授权对接时间&a…

GoLong的学习之路(十一)语法之标准库 fmt.Printf的使用

上回书说到&#xff0c;函数&#xff0c;说了函数是如何实现的&#xff0c;高级函数有哪几种调用方式&#xff0c;本章我将介绍fmt 标准库中我常用的一些函数。 文章目录 fmtfmt的向外输出print格式化占位通用占位符布尔类型占位整型占位浮点数与复数字符串和[]byte指针宽度表示…

阿里巴巴:海量请求下的接口并发,都有哪些方案?

设定一个场景&#xff0c;假如一个电商商品封装API接口在某段时间突然上升&#xff0c;会怎么办&#xff1f; 生活中的例子来说&#xff0c;假设冰墩墩在当天晚上上热搜之后&#xff0c;迅速有十几万人去淘宝下单购买&#xff0c;此时并没有做好对该商品的缓存预热以及准备&am…

华为OD机试 - 滑动窗口最大和 - 滑动窗口(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

Java数据类型,变量与运算符

1.字面常量 常量是在程序运行期间&#xff0c;固定不变的量称为常量。 public class HelloWorld{public static void main(String[] args){System.out.println("Hello,world");} } 在以上程序中&#xff0c;输出的Hello Word&#xff0c;其中的“Hello Word”就是…

Go语言的Mutex

在本教程中&#xff0c;我们将了解互斥体。我们还将学习如何使用互斥体和通道解决竞争条件。 关键部分 在跳转到互斥体之前&#xff0c;了解并发编程中临界区的概念非常重要。当程序并发运行时&#xff0c;修改共享资源的代码部分不应被多个Goroutines同时访问。这部分修改共…

Delft3D水动力-富营养化模型实践技术高级应用

湖泊富营养化等水质问题严重威胁我国经济社会的发展&#xff0c;也是水环境和水生态领域科研热点之一。水环境模型是制定湖泊富营养化控制对策&#xff0c;预测湖泊水环境发展轨迹的重要工具&#xff0c;在环境影响评价、排污口论证等方面也有着广泛的应用。荷兰Delft研究所开发…