上一节我们介绍了Linux veth设备,知道了如何把多个彼此隔离的网络命名空间(下面开始简称NS)与主机通过VETH连接起来,并且多个NS间也能相互通信,在这一节我们将介绍另一种方式,用linux bridge。

Linux bridge即linux虚拟网桥,工作方式类似于物理的网络交换机,工作在二层时,能够转发以太网报文,能够学习MAC地址与端口的映射关系,但是也能工作在三层,提供类似三层交换机的功能,想要让linux bridge工作在三层,只需要给它配置一个IP地址。

还是通过一些示例来了解一下,我们将使用linux bridge连接两个NS:

通过bridge方式连接容器和主机

通过下面的命令可以创建一个bridge并启动

ip link add br0 type bridge
ip link set br0 up

接下来我们创建两个新的NS和两对VETH网卡

ip netns add ns1
ip netns add ns2
ip link add veth0 type veth peer name veth1
ip link add veth2 type veth peer name veth3
ip link set veth0 netns ns1
ip link set veth2 netns ns2
ip netns exec ns1 ip addr add 192.168.10.10/24 dev veth0
ip netns exec ns2 ip addr add 192.168.10.11/24 dev veth2
ip netns exec ns1 ip link set veth0 up
ip netns exec ns2 ip link set veth2 up

接下来就是把两端都插到bridge上:

ip link set veth1 master br0
ip link set veth3 master br0
ip link set veth1 up
ip link set veth3 up

就这样两个NS就可以相互PING通了,因为是相同网段,所以不需要默认网关,又因为bridge会广播arp请求,所以不用设置proxy_arp也不用写邻居表,NS1就能按照最正常方式通过ARP拿到NS2的MAC地址。

但是此时在主机上PING两个NS都是PING不通的,因为主机不知道怎么去192.168.10.0/24网段,所以先给主机加条路由:

ip route add 192.168.10.0/24 dev br0 scope link

注意主机的这条路由针对的是整个网段192.168.10.0/24,就是说后面如果继续加新的NS,只要IP还在这个段内,就不用再增加主机路由了。

来看一下现在的状态:

从主机ping一下NS1还是不行,想想应该是NS1不知道怎么回这个包,看一下当前NS1中的路由信息:

[root@worker3 ~]# ip netns exec ns1 ip route
192.168.10.0/24 dev veth0 proto kernel scope link src 192.168.10.10

这条路由是我们在给veth0设置ip的时候由系统自动生成的。

我们给ns1和ns2都加个默认路由,然后打开br0的arp代答:

ip netns exec ns1 ip route add 0.0.0.0/0 via 169.2.2.2 dev veth0 onlink
ip netns exec ns2 ip route add 0.0.0.0/0 via 169.2.2.2 dev veth2 onlink
echo 1 > /proc/sys/net/ipv4/conf/br0/proxy_arp

这时候应该就ping得通了。

两种方式的区别

到目前为止我们介绍了两种在同个主机连接多个ns的方法,现在来详细介绍一下他们之间的异同点:

如果只是用veth连接,就是单纯地把主机当成路由器,两个ns之间的通信数据包都是要走一遍主机的协议栈的转发流程的,而用bridge的纯二层方式(注意是纯二层,因为自始至终都没有给bridge设置ip)则在二层直接把数据包就从ns1转到了ns2,没有再走主机的协议栈,如下图所示:

只用veth网卡连接多个ns时,ns2到ns1数据包经过的流程,橙色部分

只用veth网卡加bridge连接多个ns时,ns2到ns1数据包经过的流程,橙色部分

这个我们可以用如下方式求证,关掉主机的路由转发功能:

echo 0 > /proc/sys/net/ipv4/ip_forward

然后你会发现ns1中ping ns2其实还是可以ping通的。

那这样一来,主机的防火墙策略岂不是没用了?k8s的网络策略就是在主机的iptables规则中来控制的,为了让这个规则生效,还是有办法的,可以让经过linux bridge的数据包也过一遍iptabls规则

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

注:开启了这个参数,数据包还是不会去主机的协议栈,只是linux bridge的__br_forward方法中显式地调用了

NF_HOOK(NFPROTO_BRIDGE, NF_BR_FORWARD,net, NULL, skb, indev, skb->dev,br_forward_finish)

代码在:/net/bridge/br_forward.c

这时候在主机的iptables防火墙里增加一个过滤规则,把数据包全拦截掉

iptables -P FORWARD DROP

然后ns1就ping不通ns2了。

注:linux bridge 不能跨网络命名空间,所以不要尝试把br0转到ns1中,下面的命令会报错

ip link set br0 netns ns1

RTNETLINK answers: Invalid argument

凡是netns-local为on的设备都不能跨网络命名空间,像loopback/vxlan/bridge,用下面的命名可以查看eth0的netns-local的值

ethtool -k eth0|grep netns-local

理解linux虚拟网络设备bridge相关推荐

  1. 网络设备中的linux,理解linux虚拟网络设备veth

    原标题:理解linux虚拟网络设备veth 前面介绍了linux network namespace,接着介绍一下如何让一个独立的网络命名空间和主机的网络互通,这里我们需要用到linux虚拟网络设备v ...

  2. Linux - 虚拟网络设备 - bridge,veth,namespace

    引用 轻松理解 Docker 网络虚拟化基础之网络 namespace! 轻松理解 Docker 网络虚拟化基础之 veth 设备! 深入理解 Linux 上软件实现的"交换机" ...

  3. 疫情下的远程办公:理解Linux虚拟网络设备之tun/tap

    Table of Contents VPN TUN TUN编程 源代码 编译 测试运行 执行程序,生成虚拟设备 为tun设备分配IP地址 ping tun设备 VPN TUN 应用程序A是一个普通的程 ...

  4. Linux 虚拟网络设备 tun/tap veth pair

    Linux 虚拟网络设备 tun/tap veth pair 本篇主要介绍一下 linux 下面的 虚拟网络设备 tun/tap veth pair 随着容器逐步取代虚拟机,成为云基础架构的标准,然而 ...

  5. Linux 虚拟网络设备

    一.tun/tap(虚拟网卡) TUN/TAP设备浅析(一) – 原理浅析 - 简书 (jianshu.com) (3条消息) Linux-虚拟网络设备-tun/tap_sld880311的专栏-CS ...

  6. linux 虚拟网络设备详解(四)

    Linux 抽象网络设备简介 和磁盘设备类似,Linux 用户想要使用网络功能,不能通过直接操作硬件完成,而需要直接或间接的操作一个 Linux 为我们抽象出来的设备,既通用的 Linux 网络设备来 ...

  7. linux虚拟网络设备之bridge(桥)(三)

    继前两篇介绍了tun/tap和veth之后,本篇将介绍Linux下常用的一种虚拟网络设备,那就是bridge(桥). 本篇将通过实际的例子来一步一步解释bridge是如何工作的. 什么是bridge? ...

  8. linux虚拟网络设备--虚拟机网卡和linux bridge上tap设备的关系(七)

    1. 虚拟机进程 使用ps –ef |grepkvm可以看到虚拟机进程信息如下: /usr/libexec/qemu-kvm -nameinstance-0000001d -S -machine pc ...

  9. Linux 虚拟网络设备详解之 Bridge 网桥

    Bridge 是什么 同 tap/tun.veth-pair 一样,Bridge 也是一种虚拟网络设备,所以具备虚拟网络设备的所有特性,比如可以配置 IP.MAC 等. 除此之外,Bridge 还是一 ...

最新文章

  1. Android 监听多个Spinner 的点击事件
  2. 华为手机截屏怎么截长图_华为手机竟然有6种截屏方法,你用过几种?3种以上的手机没白买...
  3. Transformers中的位置编码到底是什么?
  4. Python连续攀升,其他的脚本语言去哪了?
  5. os如何处理键盘的所有按键,显示or不显示,显示是如何显示
  6. mysql忘记密码恢复
  7. python pdb调试快捷键_python pdb调试以及sublime3快捷键设置
  8. 解决安装MarkupSafe安装 from setuptools import Feature 报错ImportError: cannot import name ‘Feature‘
  9. (1)散列表(哈希表)的定义
  10. 【Negix】Nginx 面试 一些题目
  11. Facebook 有序队列服务设计原理和高性能浅析
  12. 学好python需要学哪些知识_学习Python需要掌握哪些知识?
  13. caxa计算机绘图工程师,CAXA计算机绘图
  14. matlab中可调节负载,请教MOC3022控制可控硅的电路调节负载功率的问题
  15. matlab 门限回归模型,门限回归及Stata操作汇总与空间门槛回归模型简介
  16. MDK9X5开发板应用程序演示3:LM75A温度采集显示(增加存储功能)
  17. 理解 this.initialize.apply ( this, arguments )
  18. 蓝牙Ibeacon室内定位和微信摇一摇周边原理分析
  19. 【COCOS2DX-游戏开发之七】添加启动数字输入法的功能
  20. 【聊技术】在Android中实现自适应文本大小显示

热门文章

  1. 信噪比python代码实现
  2. springboot整合swagger+mybatisplus案例
  3. windows虚拟多桌面技术
  4. 【转】头痛的自我治疗方法
  5. 易语言填表识别并自动输入验证码
  6. 移动快捷极简收银台 SDK 接入包支付接口
  7. BeginInvoke入门
  8. JS reduce方法对后台数据的处理案例(秒解决)
  9. 剑指Offer 30.包含 min 函数的栈(Python)
  10. 832计算机专业基础,福建师范大学2020年考研832计算机应用综合考试大纲